Está en la página 1de 853

DB2/400 Manual de Consulta SQL V3R7

Tapa del Libro


PORTADA Tapa del Libro
--------------------------------------------------------------------------
AS/400 Advanced Series

DB2/400 Manual de consulta SQL

Versión 3 Release 7

Número de Documento SC10-9632-01

--------------------------------------------------------------------------

© Copyright IBM Corp. 1995, 1996


PORTADA - 1
DB2/400 Manual de Consulta SQL V3R7
Avisos
AVISOS Avisos
+--- ¡Atención! -----------------------------------------------------+
¦ ¦
¦ Antes de utilizar esta información y el producto al que da ¦
¦ soporte, asegúrese de leer la información general del apartado ¦
¦ "Avisos" en el tema PORTADA_1. ¦
¦ ¦
+--------------------------------------------------------------------+

© Copyright IBM Corp. 1995, 1996


AVISOS - 1
DB2/400 Manual de Consulta SQL V3R7
Nota de Versión
VERSION Nota de Versión
Segunda edición (noviembre de 1996)

Este manual es la traducción del original en inglés AS/400 Advanced


Series DB2 for OS/400 SQL Reference, SC41-4612-01.

Esta edición es aplicable a los programas bajo licencia IBM DB2 Gestor
de Consultas y Kit de Desarrollo SQL para OS/400 (Programa 5716-ST1),
Versión 3 Release 7 Modificación 0 e IBM Operating System/400
(Programa 5716-SS1), Versión 3 Release 7 Modificación 0, y a todos los
releases y modificaciones posteriores hasta que se indique lo
contrario en nuevas ediciones.

Asegúrese de que está utilizando la edición adecuada para el nivel del


producto.

Efectúe el pedido de publicaciones a su representante de ventas IBM o


a la sucursal de IBM de su localidad. Si vive en los Estados Unidos,
Puerto Rico o Guam, puede solicitar publicaciones a través de IBM
Software Manufacturing Solutions en el teléfono 800+879-2755. En la
dirección que figura más abajo no hay existencias de publicaciones.

IBM agradece sus comentarios. Al final de cada publicación,


normalmente encontrará un formulario para los comentarios del lector.
También puede enviar sus comentarios por correo a la dirección
siguiente:

IBM S.A.
National Language Solutions Center
Avda Diagonal 571
08029 - Barcelona
España

o puede enviar sus comentarios por fax a:

Desde España: (93) 321 61 34


Desde otros países: 34 3 321 61 34

Si tiene acceso a Internet, puede enviar sus comentarios


electrónicamente a la dirección pubas400@vnet.ibm.com.

Cuando envía información a IBM, otorga a IBM un derecho no exclusivo


para utilizar o distribuir dicha información de la manera que crea
adecuada sin incurrir por ello en ninguna obligación con usted.

© Copyright International Business Machines Corporation 1995, 1996.


Reservados todos los derechos.

© Copyright IBM Corp. 1995, 1996


VERSION - 1
DB2/400 Manual de Consulta SQL V3R7
Contenido
CONTENIDO Contenido
PORTADA Tapa del Libro
AVISOS Avisos
VERSION Nota de Versión
CONTENIDO Contenido
PORTADA_1 Avisos
PORTADA_1.1 Información de la interfaz de programación
PORTADA_1.2 Marcas registradas
PREFACIO Acerca de DB2/400 Manual de Consulta SQL (SC10-9632 (SC41-4612))
PREFACIO.1 Conformidad con estándares
PREFACIO.2 Supuestos relacionados con los ejemplos de sentencias SQL
PREFACIO.3 A quién va dirigido este manual
PREFACIO.4 Innovaciones de este manual
PREFACIO.5 Cómo interpretar los diagramas de sintaxis
PREFACIO.6 Convenciones para describir valores de datos mixtos
1.0 Capítulo 1. Conceptos
1.1 Base de datos relacional
1.2 Lenguaje de Consulta Estructurada
1.3 SQL estático
1.4 SQL dinámico
1.5 SQL interactivo
1.6 Interfaz de nivel de llamada de SQL
1.7 Colecciones
1.8 Tablas
1.9 Claves
1.10 Claves principales y claves exclusivas
1.11 Integridad referencial
1.12 Desencadenantes
1.13 Índices
1.14 Vistas
1.15 Paquetes y planes de acceso
1.16 Procedimientos
1.17 Catálogo
1.18 Procesos de aplicación, concurrencia y recuperación
1.19 Nivel de aislamiento
1.20 Base de datos relacional distribuida
1.20.1 Servidores de la aplicación
1.20.2 CONNECT (tipo 1) y CONNECT (tipo 2)
1.20.3 Unidad de trabajo remota
1.20.4 Unidad de trabajo distribuida dirigida por la aplicación
1.20.5 Consideraciones sobre la representación de datos
1.21 Conversión de caracteres
1.21.1 Juegos de caracteres y páginas de códigos
1.21.2 Juegos de caracteres codificados y CCSID
1.21.3 CCSID por omisión
1.22 Secuencia de clasificación
1.23 Autorización y privilegios
2.0 Capítulo 2. Elementos del lenguaje
2.1 Caracteres
2.2 Símbolos
2.3 Identificadores
2.3.1 Identificadores de SQL
2.3.2 Identificadores del sistema
2.3.3 Identificadores del lenguaje principal
2.4 Convenios de denominación
2.4.1 Nombres SQL y nombres del sistema: consideraciones especiales
2.5 ID de autorización y nombres-autorización
2.6 Tipos de datos
2.6.1 Series de caracteres
2.6.2 Subtipos de caracteres
2.6.3 Series gráficas
2.6.4 Subtipos gráficos
2.6.5 Números
2.6.6 Valores de fecha y hora
2.7 Asignaciones y comparaciones
2.7.1 Asignaciones numéricas
2.7.2 Asignaciones de serie
2.7.3 Reglas de conversión para asignaciones
2.7.4 Asignaciones de fecha y hora
2.7.5 Comparaciones numéricas
2.7.6 Comparaciones de serie
2.7.7 Reglas de conversión para comparación
2.7.8 Comparaciones de fecha y hora
2.8 Constantes
2.8.1 Constantes de enteros
2.8.2 Constantes de coma flotante
2.8.3 Constantes decimales
2.8.4 Constantes de serie de caracteres
2.8.5 Constantes de serie gráfica
2.8.6 Coma decimal
2.8.7 Delimitadores
2.9 Registros especiales
2.9.1 CURRENT DATE o CURRENT_DATE
2.9.2 CURRENT SERVER o CURRENT_SERVER
2.9.3 CURRENT TIME o CURRENT_TIME
2.9.4 CURRENT TIMESTAMP o CURRENT_TIMESTAMP
2.9.5 CURRENT TIMEZONE o CURRENT_TIMEZONE
2.9.6 USER
2.10 Nombres de columna
2.10.1 Nombres de columna calificados
2.10.2 Nombres de correlación
2.10.3 Calificadores de nombre de columna para evitar la ambigüedad
2.10.4 Calificadores de nombre de columna en referencias correlacionadas
2.10.5 Nombres de columna no calificados
2.11 Referencias a variables del lenguaje principal
2.12 Estructuras del lenguaje principal en C, COBOL, PL/I y RPG
2.13 Matrices de estructuras del lenguaje principal en C, COBOL, PL/I y RPG
2.14 Expresiones

© Copyright IBM Corp. 1995, 1996


CONTENIDO - 1
DB2/400 Manual de Consulta SQL V3R7
Contenido
2.14.1 Sin operadores
2.14.2 Con el operador de concatenación
2.14.3 Con operadores aritméticos
2.14.4 Dos operandos enteros
2.14.5 Operandos enteros y decimales
2.14.6 Dos operandos decimales
2.14.7 Aritmética decimal en SQL
2.14.8 Operandos de coma flotante
2.14.9 Operandos de fecha y hora y duraciones
2.14.10 Aritmética de fecha y hora en SQL
2.14.11 Orden de precedencia de las operaciones
2.15 Predicados
2.15.1 Predicado básico
2.15.2 Predicado cuantificado
2.15.3 Predicado BETWEEN
2.15.4 Predicado EXISTS
2.15.5 Predicado IN
2.15.6 Predicado LIKE
2.15.7 Predicado NULL
2.16 Condiciones de búsqueda
3.0 Capítulo 3. Funciones
3.1 Funciones de columna
3.1.2 AVG
3.1.3 COUNT
3.1.4 MAX
3.1.5 MIN
3.1.6 STDDEV
3.1.7 SUM
3.1.8 VARIANCE o VAR
3.2 Funciones escalares
3.2.2 ABS o ABSVAL
3.2.3 ACOS
3.2.4 ANTILOG
3.2.5 ASIN
3.2.6 ATAN
3.2.7 ATANH
3.2.8 CHAR
3.2.9 CHARACTER_LENGTH o CHAR_LENGTH
3.2.10 COALESCE
3.2.11 CONCAT
3.2.12 COS
3.2.13 COSH
3.2.14 COT
3.2.15 CURDATE
3.2.16 CURTIME
3.2.17 DATE
3.2.18 DAY
3.2.19 DAYOFMONTH
3.2.20 DAYOFWEEK
3.2.21 DAYOFYEAR
3.2.22 DAYS
3.2.23 DECIMAL
3.2.24 DEGREES
3.2.25 DIGITS
3.2.26 DOUBLE_PRECISION o DOUBLE
3.2.27 EXP
3.2.28 FLOAT
3.2.29 FLOOR
3.2.30 HASH
3.2.31 HEX
3.2.32 HOUR
3.2.33 IFNULL
3.2.34 INTEGER
3.2.35 LAND
3.2.36 LEFT
3.2.37 LENGTH
3.2.38 LN
3.2.39 LNOT
3.2.40 LOG o LOG10
3.2.41 LOR
3.2.42 LTRIM
3.2.43 MAX
3.2.44 MICROSECOND
3.2.45 MIN
3.2.46 MINUTE
3.2.47 MOD
3.2.48 MONTH
3.2.49 NODENAME
3.2.50 NODENUMBER
3.2.51 NOW
3.2.52 PARTITION
3.2.53 POWER
3.2.54 QUARTER
3.2.55 RRN
3.2.56 RTRIM
3.2.57 SECOND
3.2.58 SIN
3.2.59 SINH
3.2.60 SQRT
3.2.61 STRIP
3.2.62 SUBSTRING o SUBSTR
3.2.63 TAN
3.2.64 TANH
3.2.65 TIME
3.2.66 TIMESTAMP
3.2.67 TRANSLATE
3.2.68 TRIM
3.2.69 UCASE o UPPER

© Copyright IBM Corp. 1995, 1996


CONTENIDO - 2
DB2/400 Manual de Consulta SQL V3R7
Contenido
3.2.70 VALUE
3.2.71 VARCHAR
3.2.72 VARGRAPHIC
3.2.73 WEEK
3.2.74 XOR
3.2.75 YEAR
3.2.76 ZONED
4.0 Capítulo 4. Consultas
4.1 Autorización
4.2 subselección
4.2.1 cláusula select
4.2.2 cláusula from
4.2.3 cláusula where
4.2.4 cláusula group-by
4.2.5 cláusula having
4.2.6 Ejemplos de una subselección
4.3 selección completa
4.3.1 Ejemplos de una selección completa
4.3.2 Reglas para tipos de datos de resultado
4.3.3 Reglas de conversión para operaciones que combinan series
4.4 sentencia select
4.4.1 cláusula order-by
4.4.2 cláusula update
4.4.3 cláusula read-only
4.4.4 cláusula optimize
4.4.5 cláusula isolation
4.4.6 Ejemplos de una sentencia select
5.0 Capítulo 5. Sentencias
5.1 Cómo se invocan las sentencias SQL
5.2 Códigos de retorno SQL
5.3 Comentarios SQL
5.4 ALTER TABLE
5.4.1 Invocación
5.4.2 Autorización
5.4.3 Sintaxis
5.4.4 Descripción
5.4.5 ADD COLUMN
5.4.6 ALTER COLUMN
5.4.7 DROP COLUMN
5.4.8 ADD Restricción-unicidad
5.4.9 ADD restricción-referencial
5.4.10 DROP
5.4.11 Notas
5.4.12 Efectos en cascada
5.4.13 Ejemplos
5.5 BEGIN DECLARE SECTION
5.5.1 Invocación
5.5.2 Autorización
5.5.3 Sintaxis
5.5.4 Descripción
5.5.5 Ejemplos
5.6 CALL
5.6.1 Invocación
5.6.2 Autorización
5.6.3 Sintaxis
5.6.4 Descripción
5.6.5 Notas
5.6.6 Ejemplo
5.7 CLOSE
5.7.1 Invocación
5.7.2 Autorización
5.7.3 Sintaxis
5.7.4 Descripción
5.7.5 Notas
5.7.6 Ejemplo
5.8 COMMENT ON
5.8.1 Invocación
5.8.2 Autorización
5.8.3 Sintaxis
5.8.4 Descripción
5.8.5 Ejemplos
5.9 COMMIT
5.9.1 Invocación
5.9.2 Autorización
5.9.3 Sintaxis
5.9.4 Descripción
5.9.5 Notas
5.9.6 Ejemplo
5.10 CONNECT (Tipo 1)
5.10.1 Invocación
5.10.2 Autorización
5.10.3 Sintaxis
5.10.4 Descripción
5.10.5 Notas
5.10.6 Ejemplos
5.11 CONNECT (Tipo 2)
5.11.1 Invocación
5.11.2 Autorización
5.11.3 Sintaxis
5.11.4 Descripción
5.11.5 Notas
5.11.6 Ejemplos
5.12 CREATE COLLECTION
5.12.1 Invocación
5.12.2 Autorización
5.12.3 Sintaxis
5.12.4 Descripción
5.12.5 Notas

© Copyright IBM Corp. 1995, 1996


CONTENIDO - 3
DB2/400 Manual de Consulta SQL V3R7
Contenido
5.12.6 Ejemplo
5.13 CREATE INDEX
5.13.1 Invocación
5.13.2 Autorización
5.13.3 Sintaxis
5.13.4 Descripción
5.13.5 Notas
5.13.6 Ejemplos
5.14 CREATE PROCEDURE
5.14.1 Invocación
5.14.2 Autorización
5.14.3 Sintaxis
5.14.4 Descripción
5.14.5 Notas
5.14.6 Ejemplo
5.15 CREATE SCHEMA
5.15.1 Invocación
5.15.2 Autorización
5.15.3 Sintaxis
5.15.4 Descripción
5.15.5 Notas
5.15.6 Ejemplos
5.16 CREATE TABLE
5.16.1 Invocación
5.16.2 Autorización
5.16.3 Sintaxis
5.16.4 Descripción
5.16.5 definición-columna
5.16.6 Restricción-unicidad
5.16.7 restricción-referencia
5.16.8 cláusula-grupo-nodos
5.16.9 Notas
5.16.10 Reglas para la generación de nombres del sistema
5.16.11 Ejemplos
5.17 CREATE VIEW
5.17.1 Invocación
5.17.2 Autorización
5.17.3 Sintaxis
5.17.4 Descripción
5.17.5 Notas
5.17.6 Ejemplos
5.18 DECLARE CURSOR
5.18.1 Invocación
5.18.2 Autorización
5.18.3 Sintaxis
5.18.4 Descripción
5.18.5 Notas
5.18.6 Ejemplos
5.19 DECLARE PROCEDURE
5.19.1 Invocación
5.19.2 Autorización
5.19.3 Sintaxis
5.19.4 Descripción
5.19.5 Notas
5.19.6 Ejemplo
5.20 DECLARE STATEMENT
5.20.1 Invocación
5.20.2 Autorización
5.20.3 Sintaxis
5.20.4 Descripción
5.20.5 Ejemplo
5.21 DECLARE VARIABLE
5.21.1 Invocación
5.21.2 Autorización
5.21.3 Sintaxis
5.21.4 Descripción
5.21.5 Notas
5.21.6 Ejemplo
5.22 DELETE
5.22.1 Invocación
5.22.2 Autorización
5.22.3 Sintaxis
5.22.4 Descripción
5.22.5 Reglas de DELETE
5.22.6 Notas
5.22.7 Ejemplos
5.23 DESCRIBE
5.23.1 Invocación
5.23.2 Autorización
5.23.3 Sintaxis
5.23.4 Descripción
5.23.5 Notas
5.23.6 Ejemplo
5.24 DESCRIBE TABLE
5.24.1 Invocación
5.24.2 Autorización
5.24.3 Sintaxis
5.24.4 Descripción
5.24.5 Notas
5.24.6 Ejemplo
5.25 DISCONNECT
5.25.1 Invocación
5.25.2 Autorización
5.25.3 Sintaxis
5.25.4 Descripción
5.25.5 Notas
5.25.6 Ejemplos
5.26 DROP

© Copyright IBM Corp. 1995, 1996


CONTENIDO - 4
DB2/400 Manual de Consulta SQL V3R7
Contenido
5.26.1 Invocación
5.26.2 Autorización
5.26.3 Sintaxis
5.26.4 Descripción
5.26.5 Ejemplos
5.27 END DECLARE SECTION
5.27.1 Invocación
5.27.2 Autorización
5.27.3 Sintaxis
5.27.4 Descripción
5.27.5 Ejemplos
5.28 EXECUTE
5.28.1 Invocación
5.28.2 Autorización
5.28.3 Sintaxis
5.28.4 Descripción
5.28.5 Sustitución de los marcadores de parámetros
5.28.6 Ejemplo
5.29 EXECUTE IMMEDIATE
5.29.1 Invocación
5.29.2 Autorización
5.29.3 Sintaxis
5.29.4 Descripción
5.29.5 Nota
5.29.6 Ejemplo
5.30 FETCH
5.30.1 Invocación
5.30.2 Autorización
5.30.3 Sintaxis
5.30.4 Descripción
5.30.5 operación-fetch-única
5.30.6 operación-fecth-varias-filas
5.30.7 Notas
5.30.8 Ejemplo
5.31 GRANT (Privilegios de paquete)
5.31.1 Invocación
5.31.2 Autorización
5.31.3 Sintaxis
5.31.4 Descripción
5.31.5 Nota
5.31.6 Ejemplo
5.32 GRANT (Privilegios de tabla)
5.32.1 Invocación
5.32.2 Autorización
5.32.3 Sintaxis
5.32.4 Descripción
5.32.5 Notas
5.32.6 Ejemplos
5.33 INCLUDE
5.33.1 Invocación
5.33.2 Autorización
5.33.3 Sintaxis
5.33.4 Descripción
5.33.5 Notas
5.33.6 Ejemplo
5.34 INSERT
5.34.1 Invocación
5.34.2 Autorización
5.34.3 Sintaxis
5.34.4 Descripción
5.34.5 insertar-múltiples-filas
5.34.6 Reglas de INSERT
5.34.7 Notas
5.34.8 Ejemplos
5.35 LABEL ON
5.35.1 Invocación
5.35.2 Autorización
5.35.3 Sintaxis
5.35.4 Descripción
5.35.5 Notas
5.35.6 Ejemplos
5.36 LOCK TABLE
5.36.1 Invocación
5.36.2 Autorización
5.36.3 Sintaxis
5.36.4 Descripción
5.36.5 Ejemplo
5.37 OPEN
5.37.1 Invocación
5.37.2 Autorización
5.37.3 Sintaxis
5.37.4 Descripción
5.37.5 Sustitución de los marcadores de parámetros
5.37.6 Notas
5.37.7 Ejemplos
5.38 PREPARE
5.38.1 Invocación
5.38.2 Autorización
5.38.3 Sintaxis
5.38.4 Descripción
5.38.5 Notas
5.38.6 Ejemplos
5.39 RELEASE
5.39.1 Invocación
5.39.2 Autorización
5.39.3 Sintaxis
5.39.4 Descripción
5.39.5 Notas

© Copyright IBM Corp. 1995, 1996


CONTENIDO - 5
DB2/400 Manual de Consulta SQL V3R7
Contenido
5.39.6 Ejemplos
5.40 RENAME
5.40.1 Invocación
5.40.2 Autorización
5.40.3 Sintaxis
5.40.4 Descripción
5.40.5 Notas
5.40.6 Ejemplos
5.41 REVOKE (Privilegios de paquete)
5.41.1 Invocación
5.41.2 Autorización
5.41.3 Sintaxis
5.41.4 Descripción
5.41.5 Notas
5.41.6 Ejemplo
5.42 REVOKE (Privilegios de tabla)
5.42.1 Invocación
5.42.2 Autorización
5.42.3 Sintaxis
5.42.4 Descripción
5.42.5 Notas
5.42.6 Ejemplos
5.43 ROLLBACK
5.43.1 Invocación
5.43.2 Autorización
5.43.3 Sintaxis
5.43.4 Descripción
5.43.5 Notas
5.43.6 Ejemplo
5.44 SELECT INTO
5.44.1 Invocación
5.44.2 Autorización
5.44.3 Sintaxis
5.44.4 Descripción
5.44.5 Ejemplos
5.45 SET CONNECTION
5.45.1 Invocación
5.45.2 Autorización
5.45.3 Sintaxis
5.45.4 Descripción
5.45.5 Notas
5.45.6 Ejemplo
5.46 SET OPTION
5.46.1 Invocación
5.46.2 Autorización
5.46.3 Sintaxis
5.46.4 Descripción
5.46.5 Notas
5.46.6 Ejemplos
5.47 SET RESULT SETS
5.47.1 Invocación
5.47.2 Autorización
5.47.3 Sintaxis
5.47.4 Descripción
5.47.5 Notas
5.47.6 Ejemplo
5.48 SET TRANSACTION
5.48.1 Invocación
5.48.2 Autorización
5.48.3 Sintaxis
5.48.4 Descripción
5.48.5 Notas
5.48.6 Ejemplos
5.49 UPDATE
5.49.1 Invocación
5.49.2 Autorización
5.49.3 Sintaxis
5.49.4 Descripción
5.49.5 Reglas de UPDATE
5.49.6 Notas
5.49.7 Ejemplos
5.50 WHENEVER
5.50.1 Invocación
5.50.2 Autorización
5.50.3 Sintaxis
5.50.4 Descripción
5.50.5 Notas
5.50.6 Ejemplo
A.0 Apéndice A. Límites en SQL
B.0 Apéndice B. Área de comunicaciones SQL
B.1 Descripciones de campo
B.2 Declaraciones INCLUDE SQLCA
C.0 Apéndice C. Área de descriptor SQL (SQLDA)
C.1 Descripciones de campo
C.2 Descripciones de campo en una aparición de SQLVAR
C.3 SQLTYPE y SQLLEN
C.4 SQLDATA o SQLNAME
C.5 Declaraciones INCLUDE SQLDA
D.0 Apéndice D. Palabras reservadas
E.0 Apéndice E. Valores CCSID
F.0 Apéndice F. Consideraciones para la utilización de la base de datos relacional distribuida
G.0 Apéndice G. Excepciones a los estándares
G.1 Nivel de entrada ANS/ISO/FIPS 1992
G.2 SQL de IBM
H.0 Apéndice H. Vistas de catálogo de DB2 para OS/400
H.1 Notas
H.2 SQL_LANGUAGES
H.3 SYSCOLUMNS

© Copyright IBM Corp. 1995, 1996


CONTENIDO - 6
DB2/400 Manual de Consulta SQL V3R7
Contenido
H.4 SYSCST
H.5 SYSCSTCOL
H.6 SYSCSTDEP
H.7 SYSINDEXES
H.8 SYSKEYCST
H.9 SYSKEYS
H.10 SYSPACKAGE
H.11 SYSPARMS
H.12 SYSPROCS
H.13 SYSREFCST
H.14 SYSTABLES
H.15 SYSVIEWDEP
H.16 SYSVIEWS
BIBLIOGRAFIA Bibliografía
INDICE Índice
COMENTARIOS Hoja de Comentarios

© Copyright IBM Corp. 1995, 1996


CONTENIDO - 7
DB2/400 Manual de Consulta SQL V3R7
Avisos
PORTADA_1 Avisos
Las referencias hechas en esta publicación a productos, programas o
servicios de IBM no implican que IBM tenga la intención de anunciarlos en
todos los países en los que realiza operaciones. Cualquier referencia a
un producto, programa o servicio IBM no establece ni implica que
únicamente pueda utilizarse dicho producto, programa o servicio IBM.
Puede utilizarse cualquier producto, programa o servicio funcionalmente
equivalente, siempre que no infrinja la propiedad intelectual vigente de
IBM ni otros derechos legalmente protegibles, en lugar del producto,
programa o servicio IBM. La evaluación y la verificación de la operación
conjunta con otros productos, excepto aquellos expresamente designados por
IBM, son responsabilidad del usuario.

IBM puede tener patentes o patentes pendientes de aplicación que cubran el


tema tratado en este documento. La entrega de este documento no le otorga
ninguna licencia sobre dichas patentes. Puede enviar consultas sobre las
licencias, por escrito, al IBM Director of Licensing, IBM Corporation, 500
Columbus Avenue, Thornwood, NY 10594, U.S.A.

Los usuarios bajo licencia de este programa que deseen obtener información
acerca del mismo con el propósito de habilitar: (i) el intercambio de
información entre programas creados independientemente y otros programas
(incluido éste) y (ii) la utilización mutua de la información que se haya
intercambiado, deben ponerse en contacto con el coordinador de
interoperabilidad de software. Dicha información puede estar disponible,
sujeta a los términos y condiciones apropiados, incluyendo en algunos
casos el pago de una tarifa.

Dirija sus preguntas a:

IBM Corporation
Software Interoperability Coordinator
3605 Highway 52 N
Rochester, MN 55901-7829 USA

Este manual puede contener imprecisiones técnicas y/o errores


tipográficos.

Esta publicación puede hacer referencia a productos que estén anunciados


pero que no estén disponibles actualmente en su país. Este publicación
también puede hacer referencia a productos que no se hayan anunciado en su
país. IBM no se compromete a hacer disponible ningún producto no
anunciado al que se haga referencia en esta publicación. La decisión
final de anunciar cualquier producto depende del juicio comercial y
técnico de IBM.

Este manual contiene ejemplos de datos e informes que se utilizan en


operaciones diarias de negocios. Para ilustrarlos lo más completamente
posible, los ejemplos incluyen nombres de personas, empresas, marcas y
productos. Todos estos nombres son ficticios y cualquier parecido con
nombres y direcciones utilizados por una empresa real es pura
coincidencia.

Esta publicación contiene pequeños programas que entrega IBM como ejemplos
sencillos a modo de ilustración. Estos ejemplos no se han probado
meticulosamente bajo todas las condiciones. IBM, por consiguiente, no
puede garantizar ni da por supuestos la fiabilidad, el servicio ni la
funcionalidad de estos programas. Todos los programas aquí incluidos se
proporcionan "TAL CUAL". SE DESCARTAN EXPRESAMENTE LAS GARANTÍAS DE
COMERCIABILIDAD E IDONEIDAD IMPLÍCITAS PARA UN PROPÓSITO DETERMINADO.

Subtemas
PORTADA_1.1 Información de la interfaz de programación
PORTADA_1.2 Marcas registradas

© Copyright IBM Corp. 1995, 1996


PORTADA_1 - 1
DB2/400 Manual de Consulta SQL V3R7
Información de la interfaz de programación
PORTADA_1.1 Información de la interfaz de programación

Esta publicación se propone mostrar a los programadores y administradores


de bases de datos cómo acceder a los datos de una base de datos y cómo
preparar, ejecutar y probar un programa de aplicación utilizando el
programa bajo licencia DB2 Gestor de Consultas y Kit de Desarrollo SQL. A
menos que se indique lo contrario de forma específica, la información de
esta publicación se debe utilizar sólo con el manual DB/2 for OS/400 SQL
Programming.

© Copyright IBM Corp. 1995, 1996


PORTADA_1.1 - 1
DB2/400 Manual de Consulta SQL V3R7
Marcas registradas
PORTADA_1.2 Marcas registradas

Los siguientes términos son marcas registradas de IBM Corporation en los


Estados Unidos y/o en otros países:

AIX IBM
AIX/6000 Integrated Language Environment
Application System/400 Operating System/400
AS/400 OS/2
BookManager OS/400
C/400 RPG/400
COBOL/400 SQL/DS
DB2 System/370
Distributed Relational Database ArchiteSystem/38
DRDA 400

Microsoft, Windows, y el logotipo de Windows 95 son marcas registradas de


Microsoft Corporation.

PC Direct es una marca registrada de Ziff Communications Company e IBM


Corporation la utiliza bajo licencia.

UNIX es una marca registrada en los Estados Unidos y otros países, para la
cual se concede licencia exclusivamente a través de X/Open Company
Limited.

C-bus es una marca registrada de Corollary, Inc.

Otros nombres de empresas, productos y servicios, que pueden estar


marcados con doble asterisco (**), son marcas registradas o marcas de
servicio de terceros.

© Copyright IBM Corp. 1995, 1996


PORTADA_1.2 - 1
DB2/400 Manual de Consulta SQL V3R7
Acerca de DB2/400 Manual de Consulta SQL (SC10 -963 2 (SC41 -461 2))
PREFACIO Acerca de DB2/400 Manual de Consulta SQL (SC10-9632 (SC41-4612))
En este manual se define el Lenguaje de Consulta Estructurada (SQL) tal
como se le da soporte en DB2 Gestor de Consultas y Kit de Desarrollo SQL.
Contiene información de consulta referente a las tareas propias de la
administración del sistema, administración de bases de datos, programación
de aplicaciones y funcionamiento. Este manual incluye la sintaxis, notas
sobre utilización, palabras clave y ejemplos de cada una de las sentencias
SQL utilizadas en el sistema AS/400.

|Para obtener información acerca de otras publicaciones del AS/400,


|consulte uno de las siguientes manuales:

| El manual Consulta de Publicaciones, SC10-9613 (SC41-4003), en la


| biblioteca en soporte software del AS/400.
| La interfaz Directorio de Información del AS/400, una interfaz
| multimedia exclusiva para una base de datos en la que puede buscarse y
| que contiene descripciones de títulos disponibles en IBM o en otras
| editoriales seleccionadas. El manual Directorio de Información del
| AS/400 se envía con el sistema sin gastos adicionales.

Subtemas
PREFACIO.1 Conformidad con estándares
PREFACIO.2 Supuestos relacionados con los ejemplos de sentencias SQL
PREFACIO.3 A quién va dirigido este manual
PREFACIO.4 Innovaciones de este manual
PREFACIO.5 Cómo interpretar los diagramas de sintaxis
PREFACIO.6 Convenciones para describir valores de datos mixtos

© Copyright IBM Corp. 1995, 1996


PREFACIO - 1
DB2/400 Manual de Consulta SQL V3R7
Conformidad con estándares
PREFACIO.1 Conformidad con estándares

|DB2 para OS/400 Versión 3 Release 7 se ajusta en gran medida a los


siguientes estándares SQL industriales y de IBM:

 Estándar ISO (Organización de Estándares Internacionales) 9075-1992


sobre el lenguaje SQL de bases de datos

 Estándar ANSI (Instituto Nacional Americano de Estándares) X3.135-1992


sobre el lenguaje SQL de bases de datos

 La publicación FIPS (Estándares para el Proceso de Información


Federal) 127-2 sobre el lenguaje SQL de bases de datos

 IBM SQL Reference Version 2, SC26-8416

La lista con las diferencias y omisiones conocidas de SQL de IBM y el


nivel de entrada de los estándares ISO, ANSI y FIPS se encuentra en el
Apéndice G, "Excepciones a los estándares" en el tema G.0.

Si desea consultar una lista de las publicaciones relacionadas, consulte


el apartado de bibliografía.

© Copyright IBM Corp. 1995, 1996


PREFACIO.1 - 1
DB2/400 Manual de Consulta SQL V3R7
Supuestos relacionados con los ejemplos de sentencias SQL
PREFACIO.2 Supuestos relacionados con los ejemplos de sentencias SQL

|Los ejemplos de sentencias SQL mostrados en esta guía están basados en las
|tablas de ejemplos del Apéndice A de la publicación DB/2 for OS/400 SQL
|Programming y en ellos se presupone lo siguiente:

 Se muestran en el entorno del SQL interactivo o están escritos en


COBOL. Para delimitar una sentencia SQL dentro de un programa en
COBOL, se utiliza EXEC SQL y END-EXEC. Si desea una descripción de
cómo utilizar sentencias SQL en un programa en COBOL, se facilita una
| en . el capítulo 6 del manual DB/2 for OS/400 SQL Programming.

 Cada uno de los ejemplos de SQL consta de varias líneas; cada una de
las cláusulas de la sentencia figura en una línea aparte.

 La palabras clave SQL están resaltadas.

| Los nombres de tablas que se proporcionan en el apéndice A de la


| publicación DB/2 for OS/400 SQL Programming utilizan la colección
CORPDATA. Los nombres de tablas que no se proporcionan en el apéndice
| A de la publicación DB/2 for OS/400 SQL Programming deben utilizar las
colecciones creadas por el usuario.

 La columnas calculadas están encerradas entre paréntesis, ().

 Se utiliza el convenio de denominación de SQL.

 Se presuponen las opciones de precompilador APOST y APOSTSQL (aunque


no sean valores por omisión en COBOL). Las constantes de serie de
caracteres dentro de SQL y las sentencias de lenguaje principal están
delimitadas por medio de apóstrofos (').

 Se utiliza la secuencia de clasificación *HEX.

Siempre que los ejemplos se aparten de estos supuestos, se indicará


oportunamente.

© Copyright IBM Corp. 1995, 1996


PREFACIO.2 - 1
DB2/400 Manual de Consulta SQL V3R7
A quién va dirigido este manual
PREFACIO.3 A quién va dirigido este manual
Este manual está pensado para programadores que deseen escribir
aplicaciones que utilicen SQL para acceder a una base de datos de AS/400.

Se supone que usted ya posee conocimientos de administración del sistema,


|administración de base de datos o de programación de aplicaciones para el
|AS/400, tal y como se indica en el manual DB/2 for OS/400 SQL Programming,
SC41-4611, así como conocimientos de:

 COBOL/400, ILE C/400, ILE COBOL/400, ILE RPG/400, AS/400 PL/I, REXX, o
el lenguaje de programación RPG/400

Las referencias hechas en este manual a RPG y COBOL se refieren al


lenguaje RPG o COBOL en general. Las referencias hechas a COBOL/400,
ILE COBOL/400, ILE RPG/400 o RPG/400 se refieren a elementos
específicos del producto en los que difieren unos de otros.

 Lenguaje de Consulta Estructurada (SQL)

Este manual es un libro de consulta más que una guía de aprendizaje. Se


da por supuesto que usted ya está familiarizado con la programación en
SQL. También se da por supuesto que va a escribir aplicaciones única y
exclusivamente para el AS/400.

|Si necesita más información sobre la utilización de sentencias SQL, la


|sintaxis de las sentencias y los parámetros, consulte el manual DB/2 for
|OS/400 SQL Programming.

Si desea diseñar aplicaciones que sean transportables a otros entornos


IBM, será preciso que consulte los manuales correspondientes a dichos
entornos, además del presente manual (por ejemplo IBM SQL Reference
Version 2, SC26-8416).

© Copyright IBM Corp. 1995, 1996


PREFACIO.3 - 1
DB2/400 Manual de Consulta SQL V3R7
Innovaciones de este manual
PREFACIO.4 Innovaciones de este manual
Las innovaciones más importantes incorporadas en este manual son:

 Sentencia RENAME

 COMMENT ON INDEX

 Soporte de DB2 Multisystem for OS/400

Una línea vertical (|) a la izquierda del texto señala un cambio o una
adición.

© Copyright IBM Corp. 1995, 1996


PREFACIO.4 - 1
DB2/400 Manual de Consulta SQL V3R7
Cómo interpretar los diagramas de sintaxis
PREFACIO.5 Cómo interpretar los diagramas de sintaxis

En este manual la sintaxis se describe utilizando la siguiente estructura:

 Los diagramas de sintaxis se leen de izquierda a derecha, y de arriba


a abajo, siguiendo la dirección de la línea.

El símbolo --- indica el principio de la sentencia.

El símbolo --- indica que la sintaxis de la sentencia continúa en la


línea siguiente.

El símbolo --- indica que la sentencia viene de la línea anterior.

El símbolo ---  indica el final de una sentencia.

Los diagramas correspondientes a unidades sintácticas que no sean


sentencias completas empiezan con el símbolo --- y terminan con el
símbolo --- .

 Los elementos obligatorios aparecen en la línea horizontal (línea


principal).

>>--elemento_obligatorio--------------------------------------------><

 Los elementos opcionales aparecen debajo de la línea principal.

>>--elemento_obligatorio--------------------------------------------><
+-elemento_opcional-+

Si aparece algún elemento opcional por encima de la línea principal,


ese elemento no tiene ninguna repercusión en la ejecución de la
sentencia y sólo se utiliza para mayor claridad.

+-elemento_opcional-+
>>--elemento_obligatorio--------------------------------------------><

 Si se puede elegir entre dos o más elementos, éstos aparecen


verticalmente formado una pila.

Si debe elegir uno de los elementos de la pila, uno de ellos aparecerá


en la línea principal.

>>--elemento_obligatorio----elección_obligatoria1-------------------><
+-elección_obligatoria2-+

Si la elección de uno de los elementos es opcional, la pila entera


aparece debajo de la línea principal.

>>--elemento_obligatorio--------------------------------------------><
+-elección_opcional1-¦
+-elección_opcional2-+

Si uno de los elementos es el valor por omisión, éste aparecerá por


encima de la línea principal y las restantes opciones aparecerán
debajo de la línea.

+-elección_por_omisión-+
>>--elemento_obligatorio--+----------------------+------------------><
+-elección_opcional----¦
+-elección_opcional----+

 Para indicar que un elemento puede repetirse, aparece una flecha que
retrocede hacia la izquierda por encima de la línea principal.

<--------------------+
>>--elemento_obligatorio----elemento_repetible----------------------><

Si la flecha de repetición contiene una coma, significa que debe


separar los elementos repetidos con una coma.

<-,------------------+
>>--elemento_obligatorio----elemento_repetible----------------------><

Si la flecha de repetición está situada encima de una pila, esto


indica que puede repetir los elementos contenidos en la pila.

 Las palabras clave aparecen en mayúsculas (por ejemplo, FROM). Deben


escribirse exactamente igual que se indica. Las variables aparecen
todas en minúsculas (por ejemplo, nombre-columna). Representan
nombres o valores dados por el usuario.

 Si aparecen signos de puntuación, paréntesis, operadores aritméticos u


otros símbolos, debe introducirlos como parte de la sintaxis.

© Copyright IBM Corp. 1995, 1996


PREFACIO.5 - 1
DB2/400 Manual de Consulta SQL V3R7
Convenciones para describir valores de datos mixtos
PREFACIO.6 Convenciones para describir valores de datos mixtos

Cuando en los ejemplos se incluyen valores de datos mixtos, se aplican las


convenciones siguientes:

© Copyright IBM Corp. 1995, 1996


PREFACIO.6 - 1
DB2/400 Manual de Consulta SQL V3R7
Capítulo 1. Conceptos
1.0 Capítulo 1. Conceptos

Subtemas
1.1 Base de datos relacional
1.2 Lenguaje de Consulta Estructurada
1.3 SQL estático
1.4 SQL dinámico
1.5 SQL interactivo
1.6 Interfaz de nivel de llamada de SQL
1.7 Colecciones
1.8 Tablas
1.9 Claves
1.10 Claves principales y claves exclusivas
1.11 Integridad referencial
1.12 Desencadenantes
1.13 Índices
1.14 Vistas
1.15 Paquetes y planes de acceso
1.16 Procedimientos
1.17 Catálogo
1.18 Procesos de aplicación, concurrencia y recuperación
1.19 Nivel de aislamiento
1.20 Base de datos relacional distribuida
1.21 Conversión de caracteres
1.22 Secuencia de clasificación
1.23 Autorización y privilegios

© Copyright IBM Corp. 1995, 1996


1.0 - 1
DB2/400 Manual de Consulta SQL V3R7
Base de datos relacional
1.1 Base de datos relacional

Una base de datos relacional es una base de datos que puede percibirse
como un conjunto de tablas y que puede manipularse de acuerdo con el
modelo relacional de datos. Una base de datos relacional es un conjunto
de objetos utilizados para almacenar, acceder y gestionar datos. El
conjunto de objetos incluye tablas, vistas, índices y paquetes.

En los sistemas AS/400 sólo existe una base de datos relacional. Consta
de todos los objetos de base de datos almacenados localmente en el sistema
AS/400. El nombre de la base de datos relacional local puede asignarse
mediante el mandato ADDRDBDIRE (añadir la entrada de directorio RDB).
También se puede acceder a otras bases de datos relacionales de otros
sistemas de forma remota.

El gestor de base de datos es el nombre que se utiliza de forma genérica


para identificar el Código Interno bajo Licencia del AS/400 y la parte DB2
para OS/400 del código que gestiona la base de datos relacional.

© Copyright IBM Corp. 1995, 1996


1.1 - 1
DB2/400 Manual de Consulta SQL V3R7
Lenguaje de Consulta Estructurada
1.2 Lenguaje de Consulta Estructurada

El Lenguaje de Consulta Estructurada (SQL) es un lenguaje estandarizado


para definir y manipular datos de una base de datos relacional. De
acuerdo con el modelo relacional de los datos, se conceptúa la base de
datos como un conjunto de tablas, las relaciones se representan mediante
los valores contenidos en las tablas, y los datos se recuperan
especificando una tabla de resultados derivable a partir de una o más
tablas base.

Las sentencias SQL las ejecuta el gestor de base de datos. Una de las
funciones del gestor de base de datos consiste en transformar la
especificación de una tabla de resultados en una secuencia de operaciones
internas que optimicen la recuperación de datos. Esta transformación se
produce cuando la sentencia SQL está preparada. Dicha transformación
recibe también el nombre de enlace.

Todas las sentencias SQL ejecutables deben prepararse antes de poderlas


ejecutar. El resultado de la preparación es el formato ejecutable u
operativo de la sentencia. El método de preparar una sentencia SQL y la
continuidad de su formato operativo es lo que distingue al SQL estático
del SQL dinámico.

© Copyright IBM Corp. 1995, 1996


1.2 - 1
DB2/400 Manual de Consulta SQL V3R7
SQL estático
1.3 SQL estático

El formato fuente de una sentencia SQL estática está hospedado en un


programa de aplicación escrito en un lenguaje principal como COBOL. La
sentencia se prepara antes de que se ejecute el programa y el formato
operativo de la sentencia continúa después de la ejecución del programa.

Antes de que se compile un programa fuente que contenga sentencias SQL


estáticas, debe procesarlo un precompilador SQL. El precompilador
comprueba la sintaxis de las sentencias SQL, las transforma en comentarios
del lenguaje principal y genera sentencias de lenguaje principal para
llamar al gestor de base de datos.

La preparación de un programa de aplicación SQL incluye la precompilación,


la preparación de sus sentencias SQL estáticas y la compilación del
programa fuente modificado.

© Copyright IBM Corp. 1995, 1996


1.3 - 1
DB2/400 Manual de Consulta SQL V3R7
SQL dinámico
1.4 SQL dinámico

Una sentencia SQL dinámica se prepara durante la ejecución de la


aplicación SQL y el formato operativo de la misma no continúa más allá de
la unidad de trabajo (a menos que se utilice COMMIT HOLD o ROLLBACK
HOLD). (1) El formato fuente de la sentencia es una serie de caracteres
que el programa pasa al gestor de bases de datos utilizando la sentencia
de SQL estática PREPARE o EXECUTE IMMEDIATE.

Las sentencias SQL hospedadas en una aplicación REXX son sentencias de SQL
dinámicas. Las sentencias SQL sometidas al recurso de SQL interactivo
también son sentencias de SQL dinámicas.

(1) Se exceptúan las sentencias SELECT preparadas que están


asociadas con un cursor declarado con WITH HOLD.

© Copyright IBM Corp. 1995, 1996


1.4 - 1
DB2/400 Manual de Consulta SQL V3R7
SQL interactivo
1.5 SQL interactivo

Con cada gestor de bases de datos hay asociado un recurso de SQL


interactivo. En esencia, cada recurso de SQL interactivo es un programa
de aplicación SQL que lee sentencias de un terminal, las prepara y ejecuta
dinámicamente y visualiza los resultados al usuario. De tales sentencias
SQL se dice que se emiten interactivamente. Los recursos interactivos de
DB2 para OS/400 se invocan mediante el mandato STRSQL o el mandato STRQM.
Para obtener más información acerca de los recursos interactivos de SQL,
consulte los manuales DB2/400 Utilización de Gestor de Consultas y DB/2
for OS/400 SQL Programming.

© Copyright IBM Corp. 1995, 1996


1.5 - 1
DB2/400 Manual de Consulta SQL V3R7
Interfaz de nivel de llamada de SQL
1.6 Interfaz de nivel de llamada de SQL

DB2 para OS/400 da soporte a la Interfaz de nivel de llamada X/Open de


SQL. Esto permite a los usuarios de cualquier lenguaje del ILE acceder a
las funciones SQL directamente a través de llamadas de procedimiento a un
programa de servicio que proporciona DB2 para OS/400. Utilizando la
Interfaz de nivel de llamada de SQL se pueden ejecutar todas las funciones
SQL sin que sea necesaria una precompilación. Se trata de un conjunto de
llamadas de procedimiento estándar para preparar sentencias SQL, ejecutar
sentencias SQL, buscar filas de datos, e incluso realizar funciones
avanzadas como por ejemplo acceder a los catálogos, y enlazar variables de
programa con columnas de salida.

Para obtener una descripción completa de todas las funciones disponibles y


su sintaxis, consulte el manual DB2 for OS/400 SQL Call Level Interface.

© Copyright IBM Corp. 1995, 1996


1.6 - 1
DB2/400 Manual de Consulta SQL V3R7
Colecciones
1.7 Colecciones

Los objetos de una base de datos relacional se organizan en conjuntos


llamados colecciones. Una colección proporciona una clasificación lógica
de los objetos de la base de datos. Las colecciones también reciben el
nombre de esquemas.

Cuando se crea una tabla, una vista o un índice, se asignan a una sola
colección. La colección a la que se asigna un objeto viene determinada
por el nombre del objeto. CREATE TABLE C.X, por ejemplo, crea la tabla X
en la colección C.

© Copyright IBM Corp. 1995, 1996


1.7 - 1
DB2/400 Manual de Consulta SQL V3R7
Tablas
1.8 Tablas
Una tabla es un objeto en el que se almacenan datos de usuario. Las
tablas son estructuras lógicas mantenidas por el gestor de bases de datos.
Están compuestas de filas y columnas. Dentro de la tabla no existe un
orden inherente en las filas. En la intersección de cada fila y columna
hay un dato específico llamado valor. Una columna es un conjunto de
valores del mismo tipo. Una fila es una secuencia de valores tal que en
ella el enésimo valor es un valor de la enésima columna de la tabla.

Con la sentencia CREATE TABLE se crean tablas base, que se utilizan para
contener datos de usuario permanentes. Una tabla de resultados es un
conjunto de filas que el gestor de base de datos selecciona o genera a
partir de una o más tablas base.

Toda tabla base tiene un nombre propio y puede tener un nombre del sistema
diferente. El nombre del sistema es el nombre que utiliza el OS/400. Se
acepta cualquiera de los dos nombres para especificar un nombre de tabla
en sentencias SQL. Para obtener más información consulte el apartado
"CREATE TABLE" en el tema 5.16.

Una columna de una tabla base tiene un nombre y puede tener un nombre de
columna del sistema diferente. El nombre de columna del sistema es el
nombre que utiliza el OS/400. Se acepta cualquiera de los dos nombres
para especificar un nombre de columna en sentencias SQL. Para obtener más
información consulte el apartado "CREATE TABLE" en el tema 5.16.

|Un grupo de nodos es un objeto que proporciona una agrupación lógica de un


|conjunto de dos o más sistemas AS/400. Una tabla distribuida es una tabla
|cuyos datos están particionados a lo largo de un grupo de nodos. Una
|clave de partición es un conjunto de una o varias columnas de una tabla
|distribuida que se utilizan para determinar a qué sistema AS/400 pertenece
|una fila. Para obtener más información sobre tablas distribuidas,
|consulte la publicación DB2 Multisystem for OS/400.

© Copyright IBM Corp. 1995, 1996


1.8 - 1
DB2/400 Manual de Consulta SQL V3R7
Claves
1.9 Claves

Una clave es una o más columnas que se identifican como tales en la


descripción de un índice, restricción de unicidad o restricción de
referencia. Una misma columna puede formar parte de más de una clave.
Una clave compuesta por más de una columna recibe el nombre de clave
compuesta.

Una clave compuesta es un conjunto ordenado de columnas de la misma tabla.


La ordenación de las columnas no está restringida por su orden dentro de
la tabla. El término valor, cuando se utiliza con respecto a una clave
compuesta, denota un valor compuesto. Por tanto, una regla como "el valor
de la clave foránea debe ser igual al valor de la clave principal"
significa que cada uno de los componentes del valor de la clave foránea
debe ser igual al componente correspondiente del valor de la clave
principal.

© Copyright IBM Corp. 1995, 1996


1.9 - 1
DB2/400 Manual de Consulta SQL V3R7
Claves principales y claves exclusivas
1.10 Claves principales y claves exclusivas

Una restricción de unicidad es la regla que establece que los valores de


una clave son válidos únicamente si son exclusivos. Una clave restringida
a tener valores exclusivos recibe el nombre de clave exclusiva y puede
definirse utilizando la sentencia CREATE UNIQUE INDEX. El índice
exclusivo resultante lo utiliza el gestor de bases de datos para asegurar
que se respeta la exclusividad de la clave durante la ejecución de las
sentencias INSERT y UPDATE. De manera alternativa, la claves exclusivas
se pueden definir:

 Como claves principales utilizando una sentencia CREATE TABLE o ALTER


TABLE. Una tabla no puede tener más de una clave principal y las
columnas de la clave deben estar definidas como NOT NULL. El índice
exclusivo de una clave principal recibe el nombre de índice principal.

 Utilizando la cláusula UNIQUE de las sentencias CREATE TABLE o ALTER


TABLE. Una tabla puede tener un número arbitrario de claves
exclusivas.

Una clave exclusiva a la que haga referencia la clave foránea de una


restricción de referencia recibe el nombre de clave padre. Una clave
padre es o bien una clave primaria o una clave exclusiva. Cuando una
tabla está definida como padre en una restricción de referencia, la clave
padre por omisión es su clave principal.

© Copyright IBM Corp. 1995, 1996


1.10 - 1
DB2/400 Manual de Consulta SQL V3R7
Integridad referencial
1.11 Integridad referencial

Integridad referencial es el estado de una base de datos en la que todos


los valores de todas las claves foráneas son válidos. Una clave foránea
es una clave que forma parte de la definición de una restricción de
referencia. Una restricción de referencia es la regla que establece que
los valores de la clave foránea son válidos si:

 Aparecen como valores de una clave padre o bien

 Alguno de los componentes de la clave foránea es nulo.

La tabla que contiene la clave padre recibe el nombre de tabla padre de la


restricción de referencia y de la que contiene la clave foránea se dice
que es dependiente de dicha tabla.

Las restricciones de referencia son opcionales y pueden definirse en


sentencias CREATE TABLE y ALTER TABLE. El gestor de bases de datos se
encarga de asegurar el cumplimiento de las restricciones de referencia
durante la ejecución de las sentencias INSERT, UPDATE y DELETE. El
cumplimiento se realiza de forma efectiva al finalizar la sentencia
excepto en el caso de las reglas de supresión y actualización de RESTRICT,
que se hacen cumplir a medida que se procesan las filas.

Las restricciones de referencia con una regla de actualización o supresión


de RESTRICT se hacen cumplir siempre antes de cualquier otra restricción
de referencia. Las demás restricciones de referencia se hacen cumplir de
una manera independiente del orden. Es decir, el orden no afecta al
resultado de la operación. Dentro de una sentencia SQL:

 Una fila puede estar marcada para su supresión por un número


cualquiera de restricciones de referencia con una regla de supresión
de CASCADE.
 Una fila sólo puede actualizarla una restricción de referencia con una
regla de supresión de SET NULL o SET DEFAULT.
 Una fila actualizada por una restricción de referencia no puede estar
marcada también para su supresión por otra restricción de referencia
con una regla se supresión de CASCADE.

Las reglas de integridad referencial abarcan los siguientes conceptos y


terminología:

Clave padre Clave principal o exclusiva de una restricción de


referencia.

Fila padre Fila que tiene al menos una fila dependiente.

Tabla padre Tabla que es padre en al menos una restricción de


referencia. Una tabla puede estar definida como
padre en un número arbitrario de restricciones de
referencia.

Tabla dependiente Tabla que es dependiente en al menos una


restricción de referencia. Una tabla puede estar
definida como dependiente en un número arbitrario
de restricciones de referencia. Una tabla
dependiente también puede ser una tabla padre.

Tabla descendiente Una tabla es descendiente de una tabla T si es


dependiente de T o es descendiente de una
dependiente de T.

Fila dependiente Fila que tiene al menos una fila padre.

Fila descendiente Una fila es descendiente de una fila p si es


dependiente de p o a una descendiente de una
dependiente de p.

Ciclo de referencia Conjunto de restricciones de referencia tal que


cada una de la tablas del conjunto es descendiente
de sí misma.

Fila autorreferente Fila que es padre de sí misma.

Tabla autorreferente Tabla que es padre y dependiente en la misma


restricción de referencia. La restricción recibe
el nombre de restricción autorreferente.

La regla de inserción de una restricción de referencia es que un valor de


inserción no nulo de la clave foránea debe coincidir con algún valor de la
clave padre de la tabla padre. El valor de una clave foránea compuesta es
nulo si cualquiera de los componentes del valor es nulo.

La regla de actualización de una restricción de referencia se especifica


cuando se define la restricción. La opciones son NO ACTION y RESTRICT.
La regla de actualización se aplica cuando se actualiza una fila de la
tabla padre o dependiente. La regla de actualización es que un valor de
actualización no nulo de una clave foránea debe coincidir con algún valor
de la clave padre de la tabla padre. El valor de una clave foránea
compuesta es nulo si cualquiera de los componentes del valor es nulo.

La regla de supresión de una restricción de referencia se especifica


cuando se define la restricción. Las opciones son NO ACTION, RESTRICT,
CASCADE, SET NULL o SET DEFAULT. SET NULL puede especificarse sólo si
alguna de las columnas de la clave foránea permite valores nulos.

© Copyright IBM Corp. 1995, 1996


1.11 - 1
DB2/400 Manual de Consulta SQL V3R7
Integridad referencial

La regla de supresión de una restricción de referencia se aplica cuando se


suprime una fila de la tabla padre. Más exactamente, se aplica cuando una
fila de la tabla padre es el objeto de una operación de supresión
propagada (definida más abajo) o de supresión simplemente y dicha fila
tiene dependientes en la tabla dependiente de la restricción de
referencia. Sea P la tabla padre, D la tabla dependiente y p una fila
padre objeto de una operación de supresión o de supresión propagada. Si
la regla de supresión es:

 RESTRICT o NO ACTION, se produce un error y no se suprime ninguna fila

 CASCADE, la operación de supresión se propaga a las dependientes de p


en D

 SET NULL, cada una de las columnas anulables de la clave foránea de


cada dependiente de p en D queda establecida como nula

 SET DEFAULT, cada una de las columnas de la clave foránea de cada


dependiente de p en D queda establecida en su valor por omisión

Cada restricción de referencia en la que una tabla sea padre tiene su


propia regla de supresión y para determinar el resultado de una operación
de supresión se utilizan todas las reglas de supresión aplicables. Por
tanto, una fila no puede suprimirse si tiene dependientes en una
restricción de referencia con una regla de supresión de RESTRICT o NO
ACTION, o si la supresión afecta en cascada a cualquiera de sus
descendientes que sean dependientes en una restricción de referencia con
una regla de supresión de RESTRICT o NO ACTION.

La supresión de una fila de la tabla padre P implica a otras tablas y


puede afectar a las filas de éstas:

 Si la tabla D es una dependiente de P y la regla de supresión es


RESTRICT o NO ACTION, D se ve implicada en la operación, pero no así
afectada por ella.

 Si D es una dependiente de P y la regla de supresión es SET NULL, D se


ve implicada en la operación y las filas de D pueden actualizarse
durante la operación.

 Si D es una dependiente de P y la regla de supresión es SET DEFAULT, D


se ve implicada en la operación y las filas de D pueden actualizarse
durante la operación.

 Si D es una dependiente de P y la regla de supresión es CASCADE, D se


ve implicada en la operación y las filas de D pueden suprimirse
durante la operación.

Si las filas de D se suprimen, se dice que la operación de supresión


realizada en P se ha propagado a D. Si D es también una tabla padre, las
acciones descritas en esta lista se aplican, a su vez, a las dependientes
de D.

De cualquier tabla que pueda verse implicada en una operación de supresión


en P se dice que está conectada por supresión a P. Así pues, una tabla
estará conectada por supresión a la tabla P si es una dependiente de P o
una dependiente de una tabla a la que afecten en cascada las operaciones
de supresión a partir de P.

© Copyright IBM Corp. 1995, 1996


1.11 - 2
DB2/400 Manual de Consulta SQL V3R7
Desencadenantes
1.12 Desencadenantes

Un desencadenante es un conjunto de acciones que se ejecutan


automáticamente cada vez que se produce un evento especificado en una
tabla base especificada. Un desencadenante puede definirse de manera que
se ejecute antes del evento o después del mismo. El evento puede se una
operación de inserción, actualización o supresión.

El conjunto de acciones puede incluir casi cualquier operación que se


permita en el sistema AS/400. Algunas operaciones, no obstante, no están
permitidas, como son:

 Comprometer o retrotraer (si se utiliza la misma definición de


compromiso para las acciones del desencadenante y el evento de
desencadenamiento)
 Las sentencias CONNECT, SET CONNECTION, DISCONNECT y RELEASE

Para obtener una lista completa de restricciones, consulte el manual


DB2/400 Programación de la base de datos, SC10-9634 (SC41-4701).

Dado que el gestor de bases de datos ejecuta los desencadenantes


automáticamente, si debe realizarse un conjunto de acciones cada vez que
se produce una operación determinada, las aplicaciones no tienen que
duplicar las acciones en cada programa de aplicación que realice la
operación. Esto puede dar como resultado una mejor productividad del
programador, una mayor coherencia y, en el caso de aplicaciones
distribuidas, un mejor rendimiento.

Las acciones realizadas en el desencadenante están consideradas como parte


de la operación que ha provocado la ejecución del desencadenante. Por
tanto, cuando el nivel de aislamiento es cualquier otro que no sea NC (No
compromiso) y las acciones del desencadenante se realizan utilizando la
misma definición de compromiso que el evento desencadenante:

 El gestor de bases de datos se asegura de que la operación y los


desencadenantes ejecutados como resultado de dicha operación se
completen o se restituyan. Las operaciones que se hayan producido
antes de la operación desencadenante no se ven afectadas.
 El gestor de bases de datos comprueba de manera efectiva todas las
restricciones (excepto si se trata de una restricción con una regla de
supresión RESTRICT) después de que se hayan ejecutado la operación y
los desencadenantes asociados.

|Un desencadenante tiene un atributo que especifica si puede suprimir o


|actualizar una fila que ya se haya insertado o actualizado en la sentencia
|SQL que causó la ejecución del desencadenante.

| Si se especifica ALWREPCHG(*YES) cuando se define el desencadenante,


| entonces en una sentencia SQL:

| - El desencadenante puede actualizar o suprimir cualquier fila que


| la misma sentencia SQL haya actualizado o insertado. Esto también
| incluye todas las filas insertadas o actualizadas por un
| desencadenante o restricción referencial causada por la misma
| sentencia SQL.

| Si se especifica ALWREPCHG(*NO) al definir el desencadenante, entonces


| en una sentencia SQL:

- Un desencadenante puede suprimir una fila sólo si ésta no la ha


insertado o actualizado esa misma sentencia SQL. Si el nivel de
aislamiento es cualquier otro que no sea NC (No compromiso) y las
acciones del desencadenante se realizan utilizando la misma
definición de compromiso que el evento desencadenante, esto
incluye también cualquier inserción o actualización realizadas por
un desencadenante o restricción de referencia provocadas por la
misma sentencia SQL.
- Un desencadenante puede actualizar una fila sólo si ésta no la ha
insertado o actualizado ya la misma sentencia SQL. Si el nivel de
aislamiento es cualquier otro que no sea NC (No compromiso) y las
acciones del desencadenante se realizan utilizando la misma
definición de compromiso que el evento desencadenante, esto
incluye también cualquier inserción o actualización realizadas por
un desencadenante o restricción de referencia provocadas por la
misma sentencia SQL.

Un desencadenante puede realizar operaciones que hagan que se disparen


otros desencadenantes. Asimismo, las operaciones realizadas en un
desencadenante pueden provocar la ejecución de reglas de restricción de
referencia.

Los desencadenantes pueden definirse utilizando el mandato CL CADDPFTRG


(añadir desencadenante de archivo físico). Se eliminan utilizando el
mandato CL RMVPFTRG (eliminar desencadenante de archivo físico). Para
obtener más información, consulte el manual DB2/400 Programación de la
base de datos.

© Copyright IBM Corp. 1995, 1996


1.12 - 1
DB2/400 Manual de Consulta SQL V3R7
Índices
1.13 Índices

Un índice es un conjunto ordenado de punteros que señalan a las filas de


una tabla base. Cada índice está basado en los valores de los datos de
una o más columnas de tabla. Un índice es un objeto que está separado de
los datos de la tabla. Cuando se solicita un índice, el gestor de base de
datos crea esta estructura y la mantiene de forma automática.

Un índice tiene un nombre propio y puede tener un nombre del sistema


distinto. El nombre del sistema es el nombre que utiliza el OS/400.
Cualquiera de los dos nombres es aceptable para especificar un nombre de
índice en sentencias SQL. Para obtener más información consulte el
apartado "CREATE INDEX" en el tema 5.13.

El gestor de la base de datos utiliza los índices para:

 Mejorar el rendimiento. En la mayoría de los casos el acceso a los


datos se realiza con mayor rapidez que sin un índice.

 Asegurar la exclusividad. Una tabla con un índice exclusivo no puede


tener filas con claves idénticas.

© Copyright IBM Corp. 1995, 1996


1.13 - 1
DB2/400 Manual de Consulta SQL V3R7
Vistas
1.14 Vistas
Una vista proporciona un método alternativo de ver los datos de una o más
tablas.

Una vista es una especificación con nombre de una tabla de resultados. La


especificación es una sentencia SELECT que se ejecuta de forma efectiva
cada vez que se hace referencia a la vista en una sentencia SQL. Así
pues, cabe pensar en una vista como compuesta de filas y columnas,
exactamente igual que una tabla base. A efectos de recuperación de datos,
las vistas pueden utilizarse exactamente igual que las tablas base. Si
una vista puede usarse en un operación de inserción, actualización o
supresión dependerá de su definición según se explica en la descripción de
CREATE VIEW (véase "CREATE VIEW" en el tema 5.17 para más información).

No pueden crearse índices para las vistas. No obstante, un índice creado


para una tabla sobre la cual se basa una vista, puede mejorar el
rendimiento de las operaciones efectuadas en la vista.

Cuando la columna de una vista deriva directamente de una columna de la


tabla base, hereda las restricciones que se apliquen a la columna de la
tabla base. Si, por ejemplo, una vista incluye la clave foránea de su
tabla base, las operaciones INSERT y UPDATE que utilicen dicha vista están
sujetas a las mismas restricciones de referencia que la tabla base.
Igualmente, si la tabla base de una vista es una tabla padre, las
operaciones DELETE que utilicen dicha vista están sujetas a las mismas
reglas que las operaciones DELETE de la tabla base. Una vista hereda
también todos los desencadenantes que se apliquen a su tabla base. Por
ejemplo, si la tabla base de una vista tiene un desencadenante de
actualización, éste se disparará cuando se realice una actualización en la
vista.

Una vista tiene un nombre propio y puede tener un nombre del sistema
distinto. El nombre del sistema es el nombre que utiliza el OS/400. Se
acepta cualquiera de los dos nombres para especificar un nombre de vista
en sentencias SQL. Para obtener más información consulte el apartado
"CREATE VIEW" en el tema 5.17.

Una columna de una vista tiene un nombre propio y puede tener un nombre de
columna del sistema distinto. El nombre de columna del sistema es el
nombre que utiliza el OS/400. Se acepta cualquiera de los dos nombres
para especificar un nombre de columna en sentencias SQL. Para obtener más
información consulte el apartado "CREATE VIEW" en el tema 5.17.

© Copyright IBM Corp. 1995, 1996


1.14 - 1
DB2/400 Manual de Consulta SQL V3R7
Paquetes y planes de acceso
1.15 Paquetes y planes de acceso

Para programas SQL distribuidos, un paquete es un objeto que contiene


estructuras de control y que se utiliza para ejecutar sentencias SQL. Los
paquetes se producen durante la preparación del programa. Una estructura
de control es comparable al formato operativo o enlazado de las sentencias
SQL. Todas las estructuras de control de un paquete se derivan de las
sentencias SQL incorporadas en un único programa fuente.

También pueden crearse paquetes con la API QSQPRCED. Los paquetes creados
por la API QSQPRCED sólo puede utilizarlos dicha API. No pueden
utilizarse en un servidor de la aplicación mediante los protocolos DRDA.
La API QSQPRCED ofrece a los usuarios la posibilidad del SQL dinámico
ampliado. Al igual que ocurre con el SQL dinámico, con esta API pueden
prepararse, describirse y ejecutarse las sentencias. A diferencia de lo
que ocurre con el SQL dinámico, las sentencias preparadas en un paquete
por esta API continúan hasta que el paquete o la sentencia se eliminan
explícitamente. Para obtener más información, consulte el manual System
API Reference, SC41-4801.

Para los programas SQL no distribuidos, las estructuras de control que se


utilizan para ejecutar sentencias SQL se almacenan en el espacio asociado
del programa SQL no distribuido.

El término plan de acceso se utiliza en general para describir las


estructuras de control del espacio asociado de un programa SQL o un
paquete SQL que se utiliza para ejecutar sentencias SQL.

© Copyright IBM Corp. 1995, 1996


1.15 - 1
DB2/400 Manual de Consulta SQL V3R7
Procedimientos
1.16 Procedimientos

Un procedimiento (llamado también con frecuencia procedimiento almacenado)


es una estructura de programación que puede llamarse para realizar un
conjunto de operaciones. Las operaciones pueden contener sentencias de
lenguaje principal y sentencias SQL.

Los procedimientos se clasifican habitualmente como procedimientos SQL o


procedimientos externos. Los procedimientos SQL contienen sentencias SQL
únicamente. Los procedimientos externos hacen referencia a un programa de
lenguaje principal (o, en el caso de REXX, un miembro de archivo fuente)
que puede o no contener sentencias SQL. En DB2 para OS/400 se da soporte
a los procedimientos externos.

Los procedimientos escritos en SQL reportan los mismos beneficios que los
procedimientos escritos en un lenguaje principal. Es decir, una parte de
código común precisa escribirse y mantenerse una sola vez y puede llamarse
desde varios programas. Tanto los lenguajes principales como SQL pueden
llamar a procedimientos que existan en el sistema local. Sin embargo, SQL
puede llamar también a un procedimiento que exista en un sistema remoto.
De hecho, la mayor ventaja de los procedimientos escritos en SQL es que
pueden utilizarse para mejorar las características de rendimiento de las
aplicaciones distribuidas.

Suponga que deben ejecutarse varias sentencias SQL en un sistema remoto.


Cuando se ejecute la primera sentencia SQL, el peticionario de la
aplicación enviará una petición al servidor de la aplicación para que
realice la operación. Esperará entonces a que llegue una respuesta que
indique si la sentencia se ha ejecutado satisfactoriamente o no y que,
opcionalmente, devuelva los resultados. Cuando se ejecute la segunda
sentencia SQL y cada una de las posteriores, el peticionario de la
aplicación enviará otra petición y esperará otra respuesta. Si las mismas
sentencias SQL están almacenadas en un procedimiento en el servidor de la
aplicación, se puede ejecutar una sentencia CALL que haga referencia al
procedimiento remoto. Cuando se ejecute la sentencia CALL, el
peticionario de la aplicación enviará una única petición al servidor
actual para llamar al procedimiento. Esperará entonces a que llegue una
sola respuesta que indique si la sentencia se ha ejecutado
satisfactoriamente y que, de forma opcional, devuelva los resultados.

Las dos figuras siguientes ilustran la manera en que pueden utilizarse los
procedimientos almacenados en una aplicación distribuida para eliminar
algunas de las peticiones remotas.

+------------------+ +------------------+
¦ ¦ ¦ ¦
¦ +------------+ ¦ ¦ +------------+ ¦
¦ ¦ Programa ¦ ¦ ¦ ¦ Paquete ¦ ¦
¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
¦ ¦ ¦ ¦ Petición para ¦ ¦ ¦ ¦
¦ ¦ ¦ ¦ ejecutar UPDATE ¦ ¦ ¦ ¦
¦ ¦ UPDATE ... ¦-------------------------------- ¦ UPDATE ... ¦ ¦
¦ ¦ ¦ --------------------------------¦ ¦ ¦
¦ ¦ ¦ ¦ Resultados de UPDATE ¦ ¦ ¦ ¦
¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
¦ ¦ ¦ ¦ Petición para ejecutar ¦ ¦ ¦ ¦
¦ ¦ ¦ ¦ INSERT ¦ ¦ ¦ ¦
¦ ¦ INSERT ... ¦-------------------------------- ¦ INSERT ... ¦ ¦
¦ ¦ ¦ --------------------------------¦ ¦ ¦
¦ ¦ ¦ ¦ Resultados de INSERT ¦ ¦ ¦ ¦
¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
¦ ¦ ¦ ¦ Petición para ejecutar ¦ ¦ ¦ ¦
¦ ¦ ¦ ¦ SELECT ¦ ¦ ¦ ¦
¦ ¦ SELECT ... ¦-------------------------------- ¦ SELECT ... ¦ ¦
¦ ¦ ¦ --------------------------------¦ ¦ ¦
¦ ¦ ¦ ¦ Resultados de SELECT ¦ ¦ ¦ ¦
¦ +------------+ ¦ ¦ +------------+ ¦
¦ ¦ ¦ ¦
+------------------+ +------------------+
Peticionario de Servidor de
la aplicación la aplicación

Figura 1. Aplicación sin procedimiento remoto

+------------------+ +----------------------------------+
¦ ¦ ¦ ¦
¦ +------------+ ¦ ¦ +------------+ +------------+ ¦
¦ ¦ Programa ¦ ¦ ¦ ¦ Paquete ¦ ¦ Programa x ¦ ¦
¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
¦ ¦ ¦ ¦ Petición de ejecutar CALL ¦ ¦ ¦ ¦ ¦ ¦
¦ ¦ CALL x ¦-------------------------------- ¦ CALL x ¦- ¦ UPDATE ... ¦ ¦
¦ ¦ ¦ --------------------------------¦ ¦ -¦ ¦ ¦
¦ ¦ ¦ ¦ Resultados de CALL ¦ ¦ ¦ ¦ ¦ ¦
¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ INSERT ... ¦ ¦
¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ SELECT ... ¦ ¦
¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
¦ +------------+ ¦ ¦ +------------+ +------------+ ¦
¦ ¦ ¦ ¦
+------------------+ +----------------------------------+
Peticionario de Servidor de
la aplicación la aplicación

© Copyright IBM Corp. 1995, 1996


1.16 - 1
DB2/400 Manual de Consulta SQL V3R7
Procedimientos

Figura 2. Aplicación con procedimiento remoto

© Copyright IBM Corp. 1995, 1996


1.16 - 2
DB2/400 Manual de Consulta SQL V3R7
Catálogo
1.17 Catálogo
El gestor de base de datos mantiene un conjunto de tablas que contiene
información sobre los datos de la base de datos. Estas tablas se conocen
colectivamente con el nombre de catálogo. Las tablas de catálogo
|contienen información acerca de tablas, parámetros, procedimientos,
paquetes, vistas, índices y restricciones del sistema AS/400.

El gestor de bases de datos facilita vistas sobre las tablas del catálogo.
Las vistas proporcionan una mayor coherencia con las vistas del catálogo
de otros productos SQL de IBM y las vistas del catálogo del estándar ANSI
e ISO (llamado esquema de información en el estándar). Las vistas del
catálogo de QSYS2 contienen información acerca de todas las tablas,
paquetes, vistas, índices y restricciones del sistema AS/400. De forma
adicional, una colección SQL contendrá un conjunto de estas vistas que
sólo contenga información sobre tablas, paquetes, vistas, índices y
restricciones de la colección.

Las tablas y vistas del catálogo son como cualquier otra tabla o vista de
base de datos. Si dispone de la autorización necesaria, puede utilizar
sentencias SQL para consultar los datos de las vistas del catálogo de la
misma manera que recuperaría datos de cualquier otra tabla del sistema
AS/400. El gestor de base de datos se encarga de que el catálogo contenga
descripciones exactas de los objetos de la base de datos en cualquier
momento.

Para obtener más información acerca de vistas y tablas de catálogo,


consulte el Apéndice H, "Vistas de catálogo de DB2 para OS/400" en el
tema H.0.

© Copyright IBM Corp. 1995, 1996


1.17 - 1
DB2/400 Manual de Consulta SQL V3R7
Procesos de aplicación, concurrencia y recuperación
1.18 Procesos de aplicación, concurrencia y recuperación

Todos los programas SQL se ejecutan como parte de un proceso de


aplicación. En OS/400, los procesos de aplicación se denominan trabajos.
Un proceso de aplicación está constituido por uno o más grupos de
activación. Cada grupo de activación conlleva la ejecución de uno o más
programas. Los programas se ejecutan en un grupo de activación que no sea
por omisión o en el grupo de activación por omisión. Todos los programas,
excepto los creados por los compiladores ILE, se ejecutan en el grupo de
activación por omisión.

Para obtener más información acerca de grupos de activación, consulte el


manual AS/400 ILE Conceptos, SC10-9631 (SC41-4606).

Un proceso de aplicación que utilice control de compromiso puede


ejecutarse con una o más definiciones de compromiso. Una definición de
compromiso facilita los medios de acotar el ámbito de un control de
compromiso a nivel de un grupo de activación o a nivel de un trabajo. En
todo momento, un grupo de activación que utilice el control de compromiso
está asociado con una sola de las definiciones de compromiso.

Las definiciones de compromiso pueden arrancarse explícitamente mediante


el mandato STRCMTCL (Arrancar Control de Compromiso). Si todavía no está
arrancada, la definición de compromiso se arranca de forma implícita
cuando se ejecuta la primera sentencia SQL en un nivel de aislamiento
distinto de COMMIT(*NONE). Una definición de compromiso de trabajo puede
estar compartida por más de un grupo de activación.

La Figura 3 muestra la relación de un proceso de aplicación, los grupos de


activación del mismo y las definiciones de compromiso. Los grupos de
activación A y B se ejecutan con un control de compromiso cuyo ámbito sea
el grupo de activación. Estos grupos de activación tienen sus propias
definiciones de compromiso. El grupo de activación C no se ejecuta con
ningún control de compromiso y no tiene ninguna definición de compromiso.

Figura 3. Grupos de activación sin definición de compromiso de trabajo

La Figura 4 muestra un proceso de aplicación, los grupos de activación del


mismo y las definiciones de compromiso. Algunos de los grupos de
activación se ejecutan con la definición de compromiso de trabajo. Los
grupos de activación A y B se ejecutan en la definición de compromiso de
trabajo. Cualquier operación de compromiso o de retrotracción llevada a
acabo en el grupo A o B afecta a ambos porque el ámbito del control de
compromiso está acotado a la misma definición de compromiso. El grupo de
activación C de este ejemplo tiene una definición de compromiso aparte.
Las operaciones de compromiso y de retrotracción realizadas en este grupo
de activación afectan sólo a las operaciones efectuadas dentro de C.

© Copyright IBM Corp. 1995, 1996


1.18 - 1
DB2/400 Manual de Consulta SQL V3R7
Procesos de aplicación, concurrencia y recuperación

Figura 4. Grupos de activación con definición de compromiso de trabajo

Para obtener más información acerca de definiciones de compromiso,


consulte el manual Backup and Recovery - Advanced, SC41-4305.

Cada definición de compromiso conlleva la ejecución de una o más unidades


de trabajo. Una unidad de trabajo (también llamada unidad de trabajo
lógica y unidad de recuperación) es una secuencia recuperable de
operaciones. En todo momento, la definición de compromiso dispone de una
sola unidad de trabajo. Una unidad de trabajo se arranca o bien cuando
arranca la definición de compromiso o bien cuando una operación de
compromiso o de retrotracción finaliza la unidad de trabajo anterior.

Las unidades de trabajo las finalizan las operaciones de compromiso, las


operaciones de retrotracción o la finalización del grupo de activación.
Una operación de compromiso o de retrotracción afecta sólo a los cambios
de la base de datos realizados dentro de la unidad de trabajo que finalice
el compromiso o la retrotracción. Mientras los cambios queden sin
comprometer, otros grupos de activación que utilicen definiciones de
compromiso diferentes y que se ejecuten en un nivel de aislamiento
COMMIT(*CS), COMMIT(*RS) y COMMIT(*RR) no podrán percibir los cambios.
Los cambios pueden restituirse hasta que se comprometan. Una vez se han
comprometido los cambios, otros grupos que se ejecuten en definiciones de
compromiso distintas podrán acceder a ellos y ya no podrán restituirse más
los cambios.

Los procesos de aplicación y los grupos de activación que utilicen


distintas definiciones de compromiso pueden solicitar el acceso a los
mismos datos al mismo tiempo. Para mantener la integridad de los datos en
tales circunstancias, se utilizan bloqueos. Estos evitan situaciones
tales como que dos procesos de aplicación actualicen simultáneamente la
misma fila de datos.

El gestor de bases de datos adquiere bloqueos para conseguir que los


cambios no comprometidos de un grupo de activación no sean detectados por
otro grupo de activación que utilice una definición de compromiso
diferente. Los bloqueos de objeto y otros recursos se asignan a un grupo
de activación. Los bloqueos de fila se asignan a una definición de
compromiso.

Cuando un grupo de activación que no sea el grupo por omisión finaliza


normalmente, el gestor de bases de datos libera todos los bloqueos
obtenidos por el grupo de activación. Los usuarios también pueden
solicitar explícitamente que se liberen antes la mayoría de los bloqueos.
Esta operación recibe el nombre de comprometer. Los bloqueos de objeto
asociados con los cursores que permanezcan abiertos después de
comprometerlos no se liberan.

© Copyright IBM Corp. 1995, 1996


1.18 - 2
DB2/400 Manual de Consulta SQL V3R7
Procesos de aplicación, concurrencia y recuperación
Las funciones de recuperación del gestor de bases de datos facilitan los
medios de restituir los cambios no comprometidos realizados en una
definición de compromiso. El gestor de bases de datos puede restituir
implícitamente los cambios no comprometidos si se dan las circunstancias
siguientes:

 Cuando finaliza el proceso de aplicación, se restituyen los cambios


realizados en la definición de compromiso asociada con el grupo de
activación por omisión. Cuando un grupo de activación que no sea el
grupo de activación por omisión finaliza anormalmente, se restituyen
todos los cambios realizados en la definición de compromiso asociada
con ese grupo de activación.

 Cuando se utiliza la unidad de trabajo distribuida y se produce una


anomalía al intentar comprometer los cambios en un sistema remoto, se
restituyen todos los cambios realizados en la definición de compromiso
asociada con la conexión remota.

 Cuando se utiliza la Unidad de trabajo distribuida y se recibe una


petición de restitución desde un sistema remoto a causa de una
anomalía en dicho sistema, se restituyen todos los cambios realizados
en la definición de compromiso asociada con la conexión remota.

Los usuarios también pueden solicitar explícitamente que se restituyan los


cambios que hayan realizado en la base de datos. Esta operación recibe el
nombre de retrotraer.

Los bloqueos adquiridos por el gestor de bases de datos en nombre de un


proceso de aplicación se mantienen hasta la finalización de la unidad de
trabajo. Los bloqueos adquiridos explícitamente por una sentencia LOCK
TABLE se pueden mantener después de la finalización de una unidad de
trabajo siempre que para finalizarla haya utilizado COMMIT HOLD o ROLLBACK
HOLD.

Un cursor puede bloquear implícitamente la fila en la que está situado.


Este bloqueo evita que:

 Otros cursores asociados con una definición de compromiso diferente


bloqueen la misma fila.
 Una sentencia DELETE o UPDATE asociada con una definición de
compromiso diferente bloquee la misma fila.

El inicio y el final de una unidad de trabajo definen los puntos de


coherencia dentro de un grupo de activación. Por ejemplo, una transacción
bancaria podría suponer la transferencia de fondos desde una cuenta a
otra. Dicha transacción significaría restar a la primera cuenta los
fondos mencionados y añadirlos a la segunda cuenta. Después del paso de
sustracción, los datos no cuadran. La coherencia sólo se restablece
después de añadir los fondos a la segunda cuenta. Una vez efectuados
ambos pasos, se puede utilizar la operación de compromiso para finalizar
la unidad de trabajo. Después de realizar la operación de compromiso, los
cambios quedan a la disposición de los grupos de activación que utilicen
definiciones de compromiso distintas.

Figura 5. Unidad de trabajo con una sentencia de compromiso

Si se produce una anomalía antes de que finalice la unidad de trabajo, el


gestor de bases de datos restituye los cambios no comprometidos para
restaurar la coherencia de los datos que supone existían cuando se ha
arrancado la unidad de trabajo.

© Copyright IBM Corp. 1995, 1996


1.18 - 3
DB2/400 Manual de Consulta SQL V3R7
Procesos de aplicación, concurrencia y recuperación

Figura 6. Unidad de trabajo con una sentencia de retrotracción

© Copyright IBM Corp. 1995, 1996


1.18 - 4
DB2/400 Manual de Consulta SQL V3R7
Nivel de aislamiento
1.19 Nivel de aislamiento
El nivel de aislamiento que se utiliza durante la ejecución de sentencias
SQL determina el grado en que el grupo de activación se aísla respecto a
los grupos de activación que se ejecutan de forma concurrente. Por tanto,
cuando el grupo de activación P ejecuta una sentencia SQL, el nivel de
aislamiento determina:

 El grado de disponibilidad de las filas recuperadas por P y los


cambios realizados por P en la base de datos para otros grupos de
activación que se ejecutan de forma concurrente.

 El grado en que los cambios realizados en la base de datos por los


grupos de activación que se ejecutan de forma concurrente puede
afectar a P.

El nivel de aislamiento se especifica como un atributo de un programa SQL


o de un paquete SQL y se aplica a los grupos de activación que utilicen el
paquete SQL o el programa SQL. DB2 para OS/400 proporciona los medios
para especificar el nivel de aislamiento a través del parámetro COMMIT en
los mandatos CRTSQLxxx, STRSQL y RUNSQLSTM. En REXX, el nivel de
aislamiento se especifica en la sentencia SET OPTION. La sentencia SET
TRANSACTION puede utilizarse para alterar temporalmente el nivel de
aislamiento dentro de una unidad de trabajo. Al finalizar la unidad de
trabajo, el nivel de aislamiento vuelve al valor que tenía al principio de
la misma. En las sentencias SELECT, SELECT INTO, INSERT, UPDATE, DELETE y
DECLARE CURSOR, se puede especificar el nivel de aislamiento utilizando
una cláusula de aislamiento; el nivel de aislamiento entra en vigor sólo
para la ejecución de la sentencia que contiene la cláusula de aislamiento.

Se da soporte a estos niveles de aislamiento bloqueando automáticamente


los datos adecuados. Dependiendo del tipo de bloqueo, éste limita o
impide el acceso a los datos a los grupos de activación concurrentes que
utilicen definiciones de compromiso diferentes. Cada gestor de base de
datos da soporte al menos dos tipos de bloqueos:

Compartidos Limita los grupos de activación concurrentes que


utilicen definiciones de compromiso diferentes en las
operaciones de sólo lectura de los datos.

Exclusivos Impide que los grupos de activación concurrentes que


utilicen definiciones de compromiso diferentes
actualicen o supriman los datos. Impide que los
grupos de activación concurrentes que utilicen
definiciones de compromiso diferentes y que ejecuten
COMMIT(*RS), COMMIT(*CS) o COMMIT(*RR) lean los datos.
Los grupos de activación concurrentes que utilicen
definiciones de compromiso diferentes y que ejecuten
COMMIT(*UR) o COMMIT(*NC) tienen permitida la lectura
de los datos.

Las siguientes descripciones de los niveles de aislamiento hacen


referencia al bloqueo de datos en unidades de filas. Las implantaciones
individuales pueden bloquear datos en unidades físicas mayores que la
filas de tablas base. Sin embargo, lógicamente, el bloqueo se produce a
nivel de fila de tabla base en todos los productos. Igualmente, un gestor
de bases de datos puede expandir el bloqueo a un nivel superior. Los
grupos de activación tienen garantizado al menos el nivel de bloqueo
mínimo solicitado.

DB2 para OS/400 da soporte a cinco niveles de aislamiento. Para todos los
niveles de aislamiento, excepto No compromiso, el gestor de base de datos
coloca bloqueos exclusivos en cada fila que se inserte, actualice o
suprima. De este modo se asegura que ningún otro grupo de activación que
utilice una definición de compromiso diferente efectúe cambios en ninguna
fila cambiada durante una unidad de trabajo hasta que finalice la unidad
de trabajo. Los niveles de aislamiento son:

RR (Lectura repetible): El nivel RR garantiza que:

 Cualquier fila leída durante una unidad de trabajo no sufre ninguna


modificación por parte de otros grupos de activación que utilicen
definiciones de compromiso diferentes hasta que finalice la unidad de
| trabajo. (2)

| Cualquier fila cambiada (o una fila que esté actualmente bloqueada con
| bloqueo de fila UPDATE) por otro grupo de activación que utilice una
| definición de compromiso diferente no puede leer hasta que dicho
cambio se comprometa.

Aparte de todos los bloqueos exclusivos, un grupo de activación que se


ejecute a nivel RR adquiere como mínimo bloqueos compartidos de todas las
filas que lea. Además, el bloqueo se realiza de manera que el grupo de
activación quede aislado por completo de los efectos de los grupos de
activación concurrentes que utilicen definiciones de compromiso
diferentes.

DB2 para OS/400 da soporte a la lectura repetible mediante COMMIT(*RR).


Se da soporte al nivel de aislamiento de lectura repetible bloqueando
exclusivamente las tablas que contengan filas leídas o actualizadas. En
los estándares ANS e ISO, la lectura repetible recibe el nombre de
serializable.

Estabilidad de lectura (RS): Al igual que el nivel RR, el nivel RS

© Copyright IBM Corp. 1995, 1996


1.19 - 1
DB2/400 Manual de Consulta SQL V3R7
Nivel de aislamiento
garantiza que:

 Cualquier fila leída durante una unidad de trabajo no sufre ninguna


modificación por parte de otros grupos de activación que utilicen
definiciones de compromiso diferentes hasta que finalice la unidad de
| trabajo. (2)

| Cualquier fila cambiada (o una fila que esté actualmente bloqueada con
| bloqueo de fila UPDATE) por otro grupo de activación que utilice una
| definición de compromiso diferente no puede leer hasta que dicho
cambio se comprometa.

A diferencia de RR, RS no aísla por completo al grupo de activación de los


efectos de los grupos de activación concurrentes que utilicen una
definición de compromiso diferente. A nivel RS, los grupos de activación
que emitan las misma consulta más de una vez podrían ver filas
adicionales. Estas filas adicionales reciben el nombre de filas fantasma.

Se pueden producir filas fantasmas en las situaciones siguientes, por


ejemplo:

1. El grupo de activación P1 lee el conjunto de filas n que cumple cierta


condición de búsqueda.

2. El grupo de activación P2 inserta una o más filas que cumplen la


condición de búsqueda y compromete dichas inserciones.

3. P1 lee de nuevo el conjunto de filas con la misma condición de


búsqueda y obtiene tanto las filas originales como las insertadas por
P2.

Aparte de todos los bloqueos exclusivos, un grupo de activación que se


ejecute a nivel RS adquiere como mínimo bloqueos compartidos de todas las
filas que lea.

DB2 para OS/400 da soporte a la estabilidad de lectura mediante


COMMIT(*ALL) o COMMIT(*RS). En los estándares ANS e ISO, la Estabilidad
de lectura recibe el nombre de Lectura repetible.

Estabilidad de cursor (CS): Al igual que los niveles RR y RS, el nivel CS


|asegura que cualquier fila que haya sido modificada (o una fila que esté
|bloqueada actualmente con un bloqueo de fila UPDATE) por otro grupo de
|activación utilizando una definición de compromiso diferente no pueda
leerse hasta que dicho cambio se comprometa. A diferencia de RR y RS, el
nivel CS sólo garantiza que otros grupos de activación que utilicen
definiciones de compromiso distintas no modificarán la fila actual de cada
cursor actualizable. Así, otros grupos de activación que utilicen una
definición de compromiso diferente pueden cambiar las filas leídas durante
una unidad de trabajo. Además de todos los bloqueos exclusivos, un grupo
de activación que se ejecute a nivel CS tiene al menos un bloqueo
compartido para la fila actual de cada cursor.

DB2 para OS/400 da soporte a la estabilidad de cursor mediante


COMMIT(*CS). En los estándares ANS e ISO la estabilidad de cursor recibe
el nombre de Lectura comprometida.

UR (Lectura No Comprometida): Para una sentencia SELECT INTO, una


operación FETCH con un cursor de sólo lectura, una subconsulta o una
subselección que se utilice en una sentencia INSERT, el nivel UR permite
que:

 Otros grupos de activación que se ejecuten en una definición de


compromiso diferente puedan cambiar las filas leídas durante la unidad
de trabajo.

| Se lea cualquier fila cambiada (o una fila que esté actualmente


| bloqueada con un bloqueo de fila UPDATE) por otro grupo de activación
| que se ejecute en una definición de compromiso diferente incluso si no
se ha comprometido el cambio.

Para otras operaciones, se aplican las reglas del nivel CS.

DB2 para OS/400 da soporte a la lectura no comprometida mediante


COMMIT(*CHG) o COMMIT(*UR). En los estándares ANS e ISO, la lectura no
comprometida recibe el nombre de Lectura no comprometida.

NC (No compromiso): Para todas las operaciones rigen las reglas del nivel
UR, excepto

 Las operaciones de compromiso y retrotracción no tienen ningún efecto


sobre las sentencias SQL. Las sentencias preparadas no se desechan,
los cursores no se cierran y los bloqueos LOCK TABLE no se liberan.
Sin embargo, finalizan las conexiones en estado pendiente de
liberación.
 Los cambios se comprometen de forma efectiva al final de cada
operación de cambio satisfactoria, y otros grupos de aplicación que
utilicen definiciones de compromiso distintas pueden acceder a ellos o
cambiarlos inmediatamente.

DB2 para OS/400 da soporte a No compromiso mediante COMMIT(*NONE) o


COMMIT(*NC).

© Copyright IBM Corp. 1995, 1996


1.19 - 2
DB2/400 Manual de Consulta SQL V3R7
Nivel de aislamiento
|Para obtener una descripción detallada de duraciones de bloqueo, vea la
|Tabla 20-1 de la publicación DB/2 for OS/400 SQL Programming, SC41-4611.

Nota para aplicaciones distribuidas: Cuando no se da soporte a un nivel


de aislamiento solicitado mediante el servidor de la aplicación, el nivel
de aislamiento se extiende al siguiente nivel de aislamiento superior al
que se da soporte. Por ejemplo, si no se da soporte a RS mediante el
servidor de la aplicación, se utiliza el nivel de aislamiento RR.

| (2) Para los cursores WITH HOLD, estas reglas se aplican cuando
| se han leído realmente las filas. Para WITH HOLD de sólo
| lectura, las filas pueden haberse leído previamente en una
| unidad de trabajo anterior.

© Copyright IBM Corp. 1995, 1996


1.19 - 3
DB2/400 Manual de Consulta SQL V3R7
Base de datos relacional distribuida
1.20 Base de datos relacional distribuida

Una base de datos relacional distribuida consta de un conjunto de tablas y


otros objetos que se reparten en diferentes sistemas interconectados.
Cada sistema dispone de un gestor de bases de datos relacionales que
gestiona las tablas dentro de su entorno. Los gestores de bases de datos
se comunican y cooperan entre ellos de modo que permiten a un gestor de
base de datos ejecutar sentencias SQL en otro sistema.

Las bases de datos relacionales distribuidas están construidas en base a


protocolos y funciones de peticionario-servidor formales. Un peticionario
de la aplicación da soporte al final de la aplicación de una conexión.
Transforma una petición de base de datos procedente de la aplicación en
protocolos de comunicación apropiados para que se puedan utilizar en la
red de bases de datos distribuidas. Dichas peticiones las recibe y
procesa un servidor de la aplicación al otro extremo de la conexión. En
su trabajo conjunto, el peticionario de la aplicación y el servidor de la
aplicación manejan las consideraciones de comunicaciones y de ubicación de
manera que la aplicación quede aislada de dichas consideraciones y pueda
funcionar como si estuviera accediendo a una base de datos local. La
Figura 7 sirve de ilustración de una base de datos relacional distribuida
sencilla.

Figura 7. Entorno de bases de datos relacionales distribuidas

Para obtener más información acerca de los protocolos de comunicaciones de


la Arquitectura de bases de datos relacionales Distribuidas (DRDA),
consulte la publicación Distributed Relational Database Architecture
Reference, SC26-4651.

Subtemas
1.20.1 Servidores de la aplicación
1.20.2 CONNECT (tipo 1) y CONNECT (tipo 2)
1.20.3 Unidad de trabajo remota
1.20.4 Unidad de trabajo distribuida dirigida por la aplicación
1.20.5 Consideraciones sobre la representación de datos

© Copyright IBM Corp. 1995, 1996


1.20 - 1
DB2/400 Manual de Consulta SQL V3R7
Servidores de la aplicación
1.20.1 Servidores de la aplicación

Para que las sentencias SQL que hacen referencia a tablas o vistas puedan
ejecutarse, el grupo de activación debe estar conectado al servidor de la
aplicación del gestor de bases de datos.

Una conexión es una asociación entre un grupo de activación y un servidor


de la aplicación local o remoto. La aplicación gestiona las conexiones.
La sentencia CONNECT puede utilizarse para establecer una conexión con un
servidor de aplicación y hacer que dicho servidor de aplicación sea el
servidor actual del grupo de activación.

El servidor de la aplicación puede ser local o remoto con respecto al


entorno en el que se arranca el grupo de activación (Incluso sin utilizar
bases de datos relacionales, el servidor de aplicación estará presente).
Este entorno incluye un directorio local que describe los servidores de la
aplicación que pueden identificarse en una sentencia CONNECT. Para
obtener más información acerca del directorio, consulte los manuales DB/2
for OS/400 SQL Programming, SC41-4611, Distributed Database Programming,
SC41-3702, y CL Reference, SC41-4722 (de forma específica, los mandatos de
directorio siguientes: ADDRDBDIRE, CHGRDBDIRE, DSPRDBDIRE, RMVRDBDIRE y
WRKRDBDIRE).

Para ejecutar una sentencia SQL estática que haga referencia a tablas o
vistas, el servidor de aplicación utiliza el formato enlazado de la
sentencia. Esta sentencia enlazada se obtiene de un paquete creado
previamente por el gestor de base de datos mediante una operación de
enlace lógico. El paquete adecuado viene determinado por la combinación
de:

 El nombre del paquete especificado por el parámetro SQLPKG de los


mandatos CRTSQLxxx. Consulte el manual DB/2 for OS/400 SQL
Programming, SC41-4611, para obtener una descripción de los mandatos
CRTSQLxxx.
 El testigo de coherencia interna que asegura que el paquete y el
programa se crearon a partir del mismo fuente y al mismo tiempo.

Todos los productos de bases de datos relacionales dan soporte a las


ampliaciones a SQL de IBM. Algunas de estas ampliaciones son específicas
de determinados productos y otras las comparten más de un producto.

La mayoría de las veces, una aplicación puede utilizar las sentencias y


cláusulas soportadas por el gestor de bases de datos del servidor al que
está actualmente conectada, incluso si dicha aplicación se está ejecutando
por medio de un peticionario del gestor de bases de datos que no dé
soporte a algunas de dichas sentencias y cláusulas. Las restricciones
figuran en la lista del Apéndice F, "Consideraciones para la utilización
de la base de datos relacional distribuida" en el tema F.0.

© Copyright IBM Corp. 1995, 1996


1.20.1 - 1
DB2/400 Manual de Consulta SQL V3R7
CONNECT (tipo 1) y CONNECT (tipo 2)
1.20.2 CONNECT (tipo 1) y CONNECT (tipo 2)

Hay dos tipos de sentencias CONNECT que tienen la misma sintaxis pero
diferente semántica:

 CONNECT (tipo 1) se utiliza para unidades de trabajo remotas. Véase


el apartado "CONNECT (Tipo 1)" en el tema 5.10.
 CONNECT (tipo 2) se utiliza para unidades de trabajo distribuidas.
Consulte el apartado "CONNECT (Tipo 2)" en el tema 5.11.

Consulte el apartado "Diferencias entre CONNECT (Tipo 1) y CONNECT (Tipo


2)" en el tema F.1 para obtener un resumen de las diferencias.

© Copyright IBM Corp. 1995, 1996


1.20.2 - 1
DB2/400 Manual de Consulta SQL V3R7
Unidad de trabajo remota
1.20.3 Unidad de trabajo remota

El recurso de unidad de trabajo remota permite la preparación y ejecución


remotas de las sentencias SQL. Un grupo de activación situado en el
sistema informático A puede conectarse a un servidor de la aplicación
situado en el sistema informático B. Dicho grupo, dentro de una o más
unidades de trabajo, podrá ejecutar entonces un número cualquiera de
sentencias SQL dinámicas o estáticas que hagan referencia a los objetos de
B. Después de que finalice una unidad de trabajo en B, el grupo de
activación puede conectarse a un servidor de aplicación situado en el
sistema C, y así sucesivamente.

La mayoría de las sentencias SQL pueden prepararse y ejecutarse de forma


remota con las siguientes restricciones:

 Todos los objetos a los que se hace referencia en una única sentencia
SQL debe gestionarlos el mismo gestor de bases de datos.

 Todas las sentencias SQL de una unidad de trabajo debe ejecutarlas el


mismo servidor de la aplicación.

Subtemas
1.20.3.1 Gestión de la conexión de unidades de trabajo remotas

© Copyright IBM Corp. 1995, 1996


1.20.3 - 1
DB2/400 Manual de Consulta SQL V3R7
Gestión de la conexión de unidades de trabajo remotas
1.20.3.1 Gestión de la conexión de unidades de trabajo remotas

Un grupo de activación se encuentra en uno de los tres estados siguientes


en todo momento:

Conectable y conectado
No conectable y conectado
Conectable y no conectado

El diagrama siguiente ilustra las transiciones de estado:

Iniciar proceso

¦
¦

+---------------+ +---------------+
+--¦ ¦ Sentencia CONNECT satisfactoria ¦ ¦
¦ ¦ Conectable ¦ --------------------------------¦ Conectable ¦
CONNECT ¦ ¦ y ¦ ¦ y ¦
+- ¦ conectado +-------------------------------- ¦ no conectado ¦
¦ ¦ ¦ ¦
+---------------+ +---------------+
 ¦ CONNECT con anomalía del sistema o ¦
¦ ¦ COMMIT con la conexión en ¦
¦ ¦ estado pendiente de liberación. ¦
¦ ¦ ¦
ROLLBACK o ¦ ¦ Sentencia SQL que no sea CONNECT, ¦ Anomalía del
COMMIT ¦ ¦ COMMIT ni ROLLBACK ¦ sistema con
satisfactorio ¦ ¦ ¦ retrotracción
¦ ¦ ¦
¦ ¦ +-----------------+ ¦
¦ ¦ ¦ ¦ ¦
¦ +-----------¦ No conectable ¦ ¦
¦ ¦ y +---------------+
+---------------------¦ conectado ¦
¦ ¦
+-----------------+

Figura 8. Transición de estado de conexión de grupo de activación de unidad de trabajo remota

El estado inicial de un grupo de activación es conectable y conectado. El


servidor de aplicación al que se conecta el grupo de activación viene
determinado por el parámetro RBD de los mandatos CRTSQLxxx y STRSQL y
puede conllevar una operación CONNECT implícita. Una operación CONNECT
implícita no puede producirse si ya ha tenido lugar una operación CONNECT
implícita o explícita de forma satisfactoria o insatisfactoria. Por
tanto, un grupo de activación no puede conectarse implícitamente a un
servidor de aplicación en más de una ocasión.

Estado conectable y conectado: Un grupo de activación está conectado a un


servidor de aplicación y se pueden ejecutar sentencias CONNECT. El grupo
de activación entra en este estado cuando finaliza una retrotracción o un
compromiso satisfactorio desde el estado no conectable y conectado, o
cuando se ejecuta satisfactoriamente una sentencia CONNECT desde el estado
conectable y no conectado.

Estado no conectable y conectado: Un grupo de activación está conectado a


un servidor de aplicación, pero no puede ejecutarse satisfactoriamente una
sentencia CONNECT para cambiar los servidores de aplicación. El grupo de
activación entra en este estado desde el estado conectable y conectado
cuando ejecuta cualquier sentencia SQL que no sea CONNECT, COMMIT ni
ROLLBACK.

Estado conectable y no conectado: El grupo de activación no está


conectado a un servidor de la aplicación. La única sentencia SQL que se
puede ejecutar es CONNECT.

El grupo de activación entra en este estado cuando:

 Se ha liberado previamente la conexión y se ha ejecutado una sentencia


COMMIT satisfactoria.
 La conexión se ha desconectado utilizando la sentencia SQL DISCONNECT.
 La conexión se hallaba en un estado conectable, pero la sentencia
CONNECT no ha sido satisfactoria.

Se pueden ejecutar de forma satisfactoria sentencias CONNECT consecutivas


ya que CONNECT no aparta al grupo de activación del estado conectable.
Una sentencia CONNECT emitida hacia el servidor de aplicación con el que
está conectado el grupo de activación actualmente se ejecuta como
cualquier otra sentencia CONNECT. CONNECT no se puede ejecutar de forma
satisfactoria cuando va precedida de cualquier sentencia SQL que no sea
CONNECT, COMMIT, DISCONNECT, SET CONNECTION, RELEASE ni ROLLBACK (a menos
que se ejecute con COMMIT(*NC)). Para evitar errores, ejecute una
operación de compromiso o retrotracción antes de que se ejecute una
sentencia CONNECT.

© Copyright IBM Corp. 1995, 1996


1.20.3.1 - 1
DB2/400 Manual de Consulta SQL V3R7
Unidad de trabajo distribuida dirigida por la aplicación
1.20.4 Unidad de trabajo distribuida dirigida por la aplicación
El recurso de unidad de trabajo distribuida dirigida por la aplicación
también permite la preparación y ejecución remotas de las sentencias SQL
de la misma manera que la unidad de trabajo remota. Al igual que la
unidad de trabajo remota, un grupo de activación situado en el sistema A
puede conectarse a un servidor de aplicación situado en el sistema B y
ejecutar un número cualquiera de sentencias SQL dinámicas o estáticas que
hagan referencia a los objetos de B antes de finalizar la unidad de
trabajo. Todos los objetos a los que se hace referencia en una única
sentencia SQL debe gestionarlos el mismo gestor de bases de datos. Sin
embargo, a diferencia de la unidad de trabajo remota, en la misma unidad
de trabajo pueden participar un número cualquiera de servidores de la
aplicación. La unidad de trabajo la finaliza una operación de compromiso
o de retrotracción.

Subtemas
1.20.4.1 Gestión de conexión de unidad de trabajo distribuida dirigida por la aplicación
1.20.4.2 Estados de conexión
1.20.4.3 Estados de conexión del grupo de activación
1.20.4.4 Cuando finaliza una conexión

© Copyright IBM Corp. 1995, 1996


1.20.4 - 1
DB2/400 Manual de Consulta SQL V3R7
Gestión de conexión de unidad de trabajo distribuida dirigida por la aplicación
1.20.4.1 Gestión de conexión de unidad de trabajo distribuida dirigida por la aplicación

En todo momento:

 Un grupo de activación está siempre en el estado conectado o no


conectado y tiene un conjunto de cero o más conexiones. Cada una de
las conexiones de un grupo de activación está identificada de forma
exclusiva por el nombre del servidor de la aplicación de la conexión.
 Una conexión SQL siempre está en uno de los siguientes estados:
- Actual y retenido
- Actual y pendiente de liberación
- Latente y retenido
- Latente y pendiente de liberación

Estado inicial de un grupo de activación: Un grupo de activación se


encuentra inicialmente en el estado conectado y tiene exactamente una
conexión. El estado inicial de una conexión es actual y retenido.

El diagrama siguiente ilustra las transiciones de estado:

Iniciar proceso
¦
¦ +----------------------- Estados de conexión SQL -----------------------+
¦ ¦ ¦
¦ ¦ Sentencia CONNECT satisfactoria ¦
¦ ¦ o SET CONNECTION que especifique ¦
¦ ¦ +-------------+ otra conexión SQL +-------------+ ¦
¦ ¦ ¦ +--------------------------- ¦ ¦ ¦
+------------- ¦ Actual ¦ ¦ Latente ¦ ¦
¦ ¦ ¦ ¦ ---------------------------¦ ¦ ¦
¦ ¦ +-------------+ Sentencia CONNECT +-------------+ ¦
¦ ¦ satisfactoria o ¦
¦ ¦ SET CONNECTION que especifique ¦
¦ ¦ una conexión latente existente ¦
¦ ¦ ¦
¦ ¦ ¦
¦ ¦ +-------------+ +-------------+ ¦
¦ ¦ ¦ ¦ RELEASE ¦ ¦ ¦
+------------- ¦ Retenido +--------------------------- ¦ Pendiente ¦ ¦
¦ ¦ ¦ ¦ ¦ liberación ¦ ¦
¦ ¦ +-------------+ +-------------+ ¦
¦ ¦ ¦
¦ +-----------------------------------------------------------------------+
¦
¦
¦ +----------------- Estados conexión de grupo activación ---------------+
¦ ¦ ¦
¦ ¦ La conexión actual finaliza ¦
¦ ¦ de forma intencionada, o ¦
¦ ¦ produce un error que provoca ¦
¦ ¦ +-------------+ la pérdida de la conexión +--------------+ ¦
¦ ¦ ¦ +--------------------------- ¦ ¦ ¦
+------------- ¦ Conectado ¦ ¦ No conectado ¦ ¦
¦ ¦ ¦ ---------------------------¦ ¦ ¦
¦ +-------------+ Sentencias CONNECT o +--------------+ ¦
¦ SET CONNECTION satisfactorias ¦
¦ ¦
+-----------------------------------------------------------------------+

Figura 9. Transiciones de estado de conexión de grupo de activación y conexión de unidad de trabajo


distribuida dirigida por la aplicación

© Copyright IBM Corp. 1995, 1996


1.20.4.1 - 1
DB2/400 Manual de Consulta SQL V3R7
Estados de conexión
1.20.4.2 Estados de conexión

Si un proceso de aplicación ejecuta una sentencia CONNECT


satisfactoriamente:

 La conexión actual pasa al estado latente y retenido.

 El nombre del servidor se añade al conjunto de conexiones y la nueva


conexión pasa al estado actual y retenido.

Si el nombre del servidor ya está incluido en el conjunto de conexiones


existentes del grupo de activación, se produce un error.

Una conexión en estado latente pasa al estado actual por medio de la


sentencia SET CONNECTION. Cuando una conexión pasa al estado actual, la
conexión actual anterior, si la hay, pasa al estado latente. En todo
momento no puede haber más de una conexión actual en el conjunto de
conexiones existentes de un grupo de activación. El cambio del estado de
una conexión de actual a latente o de latente a actual no tiene ninguna
incidencia sobre su estado retenido o pendiente de liberación.

Una conexión pasa al estado pendiente de liberación mediante la sentencia


RELEASE. Cuando un grupo de activación ejecuta una operación de
compromiso, finaliza toda conexión pendiente de liberación del grupo de
activación. El cambio del estado de una conexión de retenido a pendiente
de liberación no tiene ninguna incidencia sobre su estado actual o
latente. Por tanto, una conexión en estado pendiente de liberación
todavía puede utilizarse hasta la siguiente operación de compromiso. No
existe forma de cambiar el estado de una conexión de pendiente de
liberación a retenido.

© Copyright IBM Corp. 1995, 1996


1.20.4.2 - 1
DB2/400 Manual de Consulta SQL V3R7
Estados de conexión del grupo de activación
1.20.4.3 Estados de conexión del grupo de activación

Por medio de la ejecución explícita o implícita de una sentencia CONNECT


puede establecerse un servidor de la aplicación diferente. Las reglas que
rigen son las siguientes:

 Un grupo de activación no puede tener más de una conexión con el mismo


servidor de la aplicación a la vez.

 Cuando un grupo de activación ejecuta una sentencia SET CONNECTION, el


nombre de ubicación especificado debe ser una conexión existente en el
conjunto de conexiones del grupo de activación.

 Cuando un grupo de activación ejecuta una sentencia CONNECT, el nombre


de servidor especificado no debe ser una conexión existente en el
conjunto de conexiones del grupo de activación.

Si un grupo de activación tiene una conexión actual, el grupo se halla en


el estado conectado. El registro especial CURRENT SERVER contiene el
nombre del servidor de la aplicación de la conexión actual. El grupo de
activación puede ejecutar sentencias SQL que hagan referencia a los
objetos gestionados por el servidor de la aplicación.

Un grupo de activación que se halle en el estado no conectado entra en el


estado conectado cuando ejecuta satisfactoriamente una sentencia CONNECT o
SET CONNECTION.

Si un grupo de activación no tiene una conexión actual, el grupo se halla


en el estado no conectado. El contenido del registro especial CURRENT
SERVER son blancos. Las únicas sentencias SQL que se pueden ejecutar son
CONNECT, DISCONNECT, SET CONNECTION, RELEASE, COMMIT y ROLLBACK.

Un grupo de activación que se halle en el estado conectado entra en el


estado no conectado cuando se finaliza intencionadamente su conexión
actual, o cuando la ejecución de una sentencia SQL no es satisfactoria
debido a un error que provoca una operación de retrotracción en el
servidor actual y la pérdida de la conexión. Las conexiones se finalizan
intencionadamente cuando un grupo de activación ejecuta de forma
satisfactoria una operación de compromiso y la conexión se encuentra en el
estado pendiente de liberación, o cuando un proceso de aplicación ejecuta
la sentencia DISCONNECT de forma satisfactoria.

© Copyright IBM Corp. 1995, 1996


1.20.4.3 - 1
DB2/400 Manual de Consulta SQL V3R7
Cuando finaliza una conexión
1.20.4.4 Cuando finaliza una conexión

Cuando finaliza una conexión, se desasignan todos los recursos adquiridos


por el grupo de activación a través de la conexión y todos los utilizados
para crear y mantener la misma. Por ejemplo, si el proceso de aplicación
P ha colocado la conexión del servidor de aplicación X en el estado
pendiente de liberación, todos los cursores de P en X se cerrarán y
desasignarán cuando la conexión finalice durante la siguiente operación de
compromiso.

Una conexión también puede finalizarse como resultado de un error de


comunicaciones, en cuyo caso el grupo de activación pasa al estado de no
conectado. Todas las conexiones de un grupo de activación finalizan
cuando finaliza el grupo de activación.

© Copyright IBM Corp. 1995, 1996


1.20.4.4 - 1
DB2/400 Manual de Consulta SQL V3R7
Consideraciones sobre la representación de datos
1.20.5 Consideraciones sobre la representación de datos

Cada sistema representa los datos de distinto modo. Cuando se trasladan


datos de un sistema a otro, en ocasiones se debe realizar una conversión
de datos. Los productos que dan soporte DRDA llevarán a cabo de forma
automática cualquier conversión necesaria en el sistema receptor.

Con los datos numéricos, la información necesaria para realizar la


conversión se reduce al tipo de datos y al tipo de entorno del sistema
emisor. Por ejemplo, cuando una variable de coma flotante de un
peticionario de aplicación DB2 para OS/400 se asigna a una columna de una
tabla en un servidor de aplicación MVS, el número se convierte del formato
IEEE al formato System/370*.

Con los datos de tipo carácter y gráfico, no basta con el tipo de datos y
el tipo de entorno del sistema emisor. Se necesita información adicional
para poder convertir las series de tipo carácter y gráfico. La conversión
de estas series depende del juego de caracteres codificados de los datos y
de la operación a realizar con estos datos. Las conversiones de series se
efectúan de acuerdo con la Arquitectura de Representación de Datos de Tipo
Carácter (CDRA) de IBM. Para más información sobre la conversión de
caracteres, véase la publicación Character Data Representation
Architecture Level 1 Reference, SC09-1390.

© Copyright IBM Corp. 1995, 1996


1.20.5 - 1
DB2/400 Manual de Consulta SQL V3R7
Conversión de caracteres
1.21 Conversión de caracteres

Una serie es una secuencia de bytes que puede representar caracteres.


Dentro de una serie, todos los caracteres se representan mediante una
representación de codificación común. En algunos casos, puede resultar
necesario convertir estos caracteres a una representación de codificación
diferente. Este proceso de conversión se conoce por conversión de
caracteres. (3)

La conversión de caracteres puede producirse cuando una sentencia SQL se


ejecuta remotamente. Considérense, por ejemplo, estos dos casos:

 Los valores de variables del lenguaje principal que se envían desde el


peticionario de la aplicación al servidor actual.
 Los valores de las columnas de resultados que se envían desde el
servidor actual al peticionario de la aplicación.

En ambos casos, la serie podría tener una representación distinta en el


sistema emisor y en el sistema receptor. También se puede producir la
conversión durante las operaciones de serie en el mismo sistema.

La lista siguiente define algunos de los términos utilizados en la


explicación de la conversión de caracteres.

juego de caracteres Un juego de caracteres definido. El juego de


caracteres siguiente, por ejemplo, aparece en
varias páginas de códigos:

 26 letras no acentuadas de la A a la Z
 26 letras no acentuadas de la a a la z
 dígitos del 0 al 9
 . , : ; ? ( ) ' " / - _ (subrayado) & + % * =
< >

página de códigos Un conjunto de asignaciones de caracteres a


elementos de código. En EBCDIC, por ejemplo, a
la 'A' se le asigna el elemento de código X'C1' y
a la 'B' se le asigna el elemento de código
X'C2'. En una página de códigos, cada elemento
de código tiene un único significado concreto.

elemento de código Un patrón de bits exclusivo que representa un


carácter.

juego de caracteres codificados


Conjunto de reglas sin ambigüedades que
establecen un juego de caracteres y las
relaciones biunívocas entre los caracteres del
juego y sus representaciones codificadas.

esquema de codificación Conjunto de reglas utilizado para representar


datos de tipo carácter. Por ejemplo:

 EBCDIC de un solo byte


 ASCII de un solo byte (4)
 EBCDIC mixto de un solo byte y de doble byte
 ASCII mixto de un solo byte y de doble byte
 UCS-2 (juego de caracteres codificado
universal).

carácter de sustitución Carácter exclusivo que se sustituye durante la


conversión de caracteres por cualquier carácter
de la representación de codificación origen que
no tenga ningún carácter correspondiente en la
representación de codificación destino.

(3) La conversión de caracteres, si es necesaria, se realiza


automáticamente y es transparente para la aplicación cuando
es satisfactoria. Por lo tanto, no es necesario conocer el
proceso de conversión cuando todas las series especificadas
en la ejecución de una sentencia se representan del mismo
modo. Así pues, para muchos lectores, la conversión de
caracteres puede carecer de interés.

(4) El término ASCII se utiliza en este manual para hacer


referencia a datos PC de IBM o a datos ISO 8.

Subtemas
1.21.1 Juegos de caracteres y páginas de códigos
1.21.2 Juegos de caracteres codificados y CCSID
1.21.3 CCSID por omisión

© Copyright IBM Corp. 1995, 1996


1.21 - 1
DB2/400 Manual de Consulta SQL V3R7
Juegos de caracteres y páginas de códigos
1.21.1 Juegos de caracteres y páginas de códigos

El ejemplo siguiente muestra cómo un juego de caracteres típico puede


correlacionarse con distintos elementos de código en dos páginas de
códigos diferentes.

Incluso con el mismo esquema de codificación, existen muchos juegos de


caracteres diferentes, y el mismo elemento de código puede representar un
carácter diferente en distintos juegos de caracteres. Es más, un byte en
una serie de caracteres no representa necesariamente un carácter de un
juego de caracteres de un sólo byte (SBCS). Las series de caracteres
también se utilizan en datos mixtos (una mezcla de caracteres de un sólo
byte y de caracteres de doble byte) y en datos que no están asociados a
ningún juego de caracteres (llamados datos de bit). Este no es el único
caso con series de tipo gráfico; el gestor de bases de datos supone que
cada par de bytes de todas las series de tipo gráfico representa un
carácter de un juego de caracteres de doble byte (DBCS) o juego de
caracteres codificado universal (UCS-2).

Un CCSID de un esquema de codificación nativo es uno de los juegos de


caracteres codificados con que pueden almacenarse datos en el sistema. Un
CCSID de un esquema de codificación foráneo es uno de los juegos de
caracteres codificados con que no pueden almacenarse los datos en dicho
sistema. Por ejemplo, DB2 para OS/400 puede almacenar datos en un CCSID
con un esquema de codificación EBCDIC, pero no con un esquema de
codificación ASCII.

Una variable del lenguaje principal que contenga datos en un esquema de


codificación foráneo se convierte siempre a un CCSID del esquema de
codificación nativo cuando la variable del lenguaje principal se utiliza
en una función o en la lista de selecciones. Una variable del lenguaje
principal que contenga datos en un esquema de codificación foráneo también
se convierte de forma efectiva a un CCSID del esquema de codificación
nativo cuando se utiliza en comparaciones o en una operación que combine
series. El CCSID del esquema de codificación nativo al que se convierten
los datos se basa en el CCSID foráneo y el CCSID por omisión.

Para obtener más detalles sobre la conversión de caracteres, véase:

 "Reglas de conversión para asignaciones" en el tema 2.7.3


 "Reglas de conversión para comparación" en el tema 2.7.7
 "Reglas de conversión para operaciones que combinan series" en el
tema 4.3.3
 Apéndice F, "Consideraciones para la utilización de la base de datos
relacional distribuida" en el tema F.0

© Copyright IBM Corp. 1995, 1996


1.21.1 - 1
DB2/400 Manual de Consulta SQL V3R7
Juegos de caracteres codificados y CCSID
1.21.2 Juegos de caracteres codificados y CCSID

La Arquitectura de Representación de Datos de Tipo Carácter (CDRA) de IBM


trata las diferencias de representación y codificación de series. El
Identificador de Juego de Caracteres Codificados (CCSID) es un elemento
clave de esta arquitectura. Un CCSID es un número binario (sin signo) de
2 bytes que identifica de forma exclusiva a un esquema de codificación y a
uno o más pares de juegos de caracteres y de páginas de códigos.

Un CCSID es un atributo de las series, del mismo modo que la longitud es


también un atributo de las series. Todos los valores de la misma columna
de serie tiene el mismo CCSID.

En cada gestor de base de datos, la conversión de caracteres conlleva la


utilización de una tabla para la selección de conversiones CCSID. La
tabla para la selección de conversiones contiene una lista de
combinaciones origen y destino válidas. Para cada par de CCSID, la tabla
para selección de conversiones contiene información que se utiliza para
realizar la conversión de un juego de caracteres a otro. Esta información
incluye una indicación de si es necesaria o no la conversión (en algunos
casos, no es necesario realizar ninguna conversión, aunque las series en
cuestión tengan distintos CCSID).

© Copyright IBM Corp. 1995, 1996


1.21.2 - 1
DB2/400 Manual de Consulta SQL V3R7
CCSID por omisión
1.21.3 CCSID por omisión

Todos los servidores de la aplicación y peticionarios de la aplicación


tienen un CCSID por omisión (o CCSID por omisión en instalaciones que den
soporte a datos DBCS). El CCSID de los siguientes tipos de series se
determina en el servidor actual:

 Las constantes de serie (incluidas las constantes de serie que


representan valores de fecha y hora) cuando el CCSID del origen está
en un esquema de codificación foráneo
 Registros especiales con valores de serie (como USER y CURRENT SERVER)
 Resultados de las funciones escalares CHAR, DIGITS y HEX
 Resultados de las funciones escalares VARCHAR y VARGRAPHIC cuando no
se especifica un CCSID como un argumento
 Las columnas de serie definidas mediante las sentencias CREATE TABLE o
ALTER TABLE cuando no se especifica un CCSID explícito para la columna
(5)

En un programa SQL distribuido, el CCSID por omisión de las variables del


lenguaje principal lo determina el peticionario de la aplicación. En un
programa SQL no distribuido, el CCSID por omisión de las variables del
lenguaje principal lo determina el servidor de aplicación. En OS/400, el
CCSID por omisión lo determina el atributo de trabajo CCSID. Para obtener
más información acerca de los CCSID, consulte el manual International
Application Development, SC41-4603.

(5) Si el CCSID por omisión es 65535, las columnas de series de


caracteres no utilizarán 65535. En lugar de ello, el CCSID
utilizado será el valor del atributo de trabajo DFTCCSID.

© Copyright IBM Corp. 1995, 1996


1.21.3 - 1
DB2/400 Manual de Consulta SQL V3R7
Secuencia de clasificación
1.22 Secuencia de clasificación

Una secuencia de clasificación defina la forma en que los caracteres de un


juego de caracteres se relacionan entre sí cuando se comparan y ordenan.
Para quienes desean ordenar sus datos en un idioma específico les
resultarán útiles distintas secuencias de clasificación. Las listas, por
ejemplo, pueden ordenarse tal y como se ven en un idioma específico. Una
secuencia de clasificación puede utilizarse también para tratar a
determinados caracteres como equivalentes; por ejemplo, a y A. Una
secuencia de clasificación funciona en todas las comparaciones que afectan
a datos de tipo carácter SBCS y a la parte SBCS de los datos mixtos.

El soporte de secuencia de clasificación se implanta utilizando una tabla


de 256 bytes. Cada byte de la tabla se corresponde con un elemento de
código o carácter de una página de códigos SBCS. Dado que la secuencia de
clasificación se puede aplicar a datos de tipo carácter, debe haber un
CCSID asociado con la tabla. Los bytes de la tabla de secuencia de
clasificación se establecen tomando como base la forma en la que se ha de
comparar cada elemento de código con los demás en dicha página de códigos.
Si, por ejemplo, los caracteres a y A han de tratarse como equivalentes a
efectos de comparación, los bytes de la tabla de secuencia de
clasificación correspondiente a sus elementos de código contendrán el
mismo valor o peso.

Cuando dos o más bytes de una tabla de secuencia de clasificación tienen


el mismo valor, se dice que la secuencia de clasificación es de pesos
compartidos. Si cada byte de una tabla de secuencia de clasificación
tiene un valor exclusivo, la secuencia de clasificación es de pesos
exclusivos. Para muchos idiomas, las secuencias de clasificación de pesos
compartidos y exclusivos se adjuntan en el sistema AS/400 como parte del
sistema operativo. Si precisa secuencias de clasificación para otros
idiomas o necesidades, puede definirlas utilizando el mandato CRTTBL
(Crear Tabla).

Es importante recordar que los datos en sí no se ven alterados por la


secuencia de clasificación. Para realizar la comparación, se utiliza una
representación ponderada de los datos. En SQL, la secuencia de
clasificación se especifica en los mandatos CRTSQLxxx, STRSQL y RUNSQLSTM.
En SQL para REXX, se especifica una secuencia de clasificación en la
sentencia SQL SET OPTION. La secuencia de clasificación se aplica a todas
las comparaciones de caracteres realizadas en las sentencias SQL. La
secuencia de clasificación por omisión en el sistema AS/400 es la
secuencia EBCDIC estándar. Esta es la secuencia que se obtiene cuando se
especifica SRTSEQ(*HEX). Para los programas precompilados con un release
del producto que sea anterior a la Versión 2 Release 3, la secuencia de
clasificación es *HEX.

Para obtener más información acerca de los CCSID, consulte el manual


International Application Development, SC41-4603. Para obtener más
información acerca de secuencias de clasificación y de las secuencias que
se adjuntan con el sistema, consulte el manual National Language Support,
SC41-4101.

© Copyright IBM Corp. 1995, 1996


1.22 - 1
DB2/400 Manual de Consulta SQL V3R7
Autorización y privilegios
1.23 Autorización y privilegios

Lo usuarios podrán ejecutar satisfactoriamente las sentencias SQL sólo si


tienen la autorización para realizar la función especificada. Para crear
una tabla, el usuario debe estar autorizado a crear tablas; para eliminar
una tabla, debe estar autorizado a eliminar tablas, y así sucesivamente.

Las personas con autorización de administrador están encargadas de de la


tarea de controlar el gestor de bases de datos y son responsables de la
seguridad e integridad de los datos. También controlan quiénes tendrán
acceso al gestor de bases de datos y el alcance de dicho acceso. Los
usuarios con autorización de administrador tienen autorización para
realizar todas las operaciones en todos los objetos independientemente de
si se les han otorgado privilegios específicos o no. El responsable de
seguridad y todos los usuarios con autorización *ALLOBJ tienen
autorización de administrador.

Los Privilegios son aquellas actividades que la autorización de


administrador permite realizar al usuario. Los usuarios autorizados
pueden crear cualquier objeto, tener acceso a los objetos de su propiedad
y transmitir los privilegios sobre sus propios objetos a otros usuarios
mediante la sentencia GRANT. Para revocar privilegios otorgados
anteriormente, puede utilizarse la sentencia REVOKE

Cuando se crea un objeto, se asigna la propiedad del objeto a un ID de


autorización. La propiedad otorga al usuario el control absoluto sobre el
objeto, incluido el privilegio de eliminar el objeto. El propietario
puede revocarse a sí mismo un privilegio sobre un objeto de su propiedad.
En este caso, no podrá realizar temporalmente ninguna operación que
requiera dicho privilegio. No obstante, y puesto que se trata del
propietario, siempre se le permite volver a otorgarse el privilegio a sí
mismo.

|La autorización otorgada a *PUBLIC en los objetos de SQL depende del


|convenio de denominación utilizado en el momento de la creación del
|objeto. Si se utiliza el convenio de denominación *SYS, *PUBLIC adquiere
|la autorización de la biblioteca en la que se creó el objeto. Si se
|utiliza el convenio de denominación *SQL, *PUBLIC adquiere la autorización
|*EXCLUDE.

En los apartados dedicados a autorizaciones de este manual se presupone


que al propietario de un objeto no se le ha revocado ningún privilegio
sobre él desde la creación inicial del mismo. Si el objeto es una vista,
también se supone que al propietario de ella no se le ha revocado la
autorización del sistema *READ sobre ninguna tabla ni vista de las que
dicha vista sea directa o indirectamente dependiente. El propietario
tiene la autorización del sistema *READ para todas las tablas y vistas a
las que se haga referencia en la definición de vista y, si se hace
referencia a una vista, todas las tablas y vistas a las que se haga
referencia en su definición, y así sucesivamente. Para obtener más
información acerca de la autorización y los privilegios, consulte el
manual Security - Reference, SC41-4302.

© Copyright IBM Corp. 1995, 1996


1.23 - 1
DB2/400 Manual de Consulta SQL V3R7
Capítulo 2. Elementos del lenguaje
2.0 Capítulo 2. Elementos del lenguaje
En este capítulo se define la sintaxis básica de SQL y de los elementos de
lenguaje que son comunes a muchas de las sentencias SQL.

Subtemas
2.1 Caracteres
2.2 Símbolos
2.3 Identificadores
2.4 Convenios de denominación
2.5 ID de autorización y nombres-autorización
2.6 Tipos de datos
2.7 Asignaciones y comparaciones
2.8 Constantes
2.9 Registros especiales
2.10 Nombres de columna
2.11 Referencias a variables del lenguaje principal
2.12 Estructuras del lenguaje principal en C, COBOL, PL/I y RPG
2.13 Matrices de estructuras del lenguaje principal en C, COBOL, PL/I y RPG
2.14 Expresiones
2.15 Predicados
2.16 Condiciones de búsqueda

© Copyright IBM Corp. 1995, 1996


2.0 - 1
DB2/400 Manual de Consulta SQL V3R7
Caracteres
2.1 Caracteres

Los símbolos básicos de las palabras clave y los operadores del lenguaje
SQL son caracteres de un solo byte que forman parte de todos los juegos de
caracteres a los que dan soporte los productos de bases de datos
relacionales de IBM. Los caracteres del lenguaje se clasifican en letras,
dígitos o caracteres especiales.

Una letra es cualquiera de las 26 mayúsculas (de la A a la Z) y las 26


minúsculas (de la a a la z) del alfabeto inglés. (6)

Un dígito es cualquiera de los caracteres comprendidos entre 0 y 9.

Un carácter especial es cualquiera de los caracteres que figuran en la


lista que sigue a continuación. (7)

+------------------------------------------------------------------------+
¦ ¦ espacio ¦ - ¦ signo menos ¦
+--------+---------------------------+--------+--------------------------¦
¦ " ¦ comillas ¦ . ¦ punto ¦
+--------+---------------------------+--------+--------------------------¦
¦ % ¦ tanto por cierto ¦ / ¦ barra inclinada ¦
+--------+---------------------------+--------+--------------------------¦
¦ & ¦ signo de Y ¦ : ¦ dos puntos ¦
+--------+---------------------------+--------+--------------------------¦
¦ ' ¦ apóstrofo o comillas ¦ ; ¦ punto y coma ¦
¦ ¦ simples ¦ ¦ ¦
+--------+---------------------------+--------+--------------------------¦
¦ ( ¦ paréntesis de apertura ¦ < ¦ menor que ¦
+--------+---------------------------+--------+--------------------------¦
¦ ) ¦ paréntesis de cierre ¦ = ¦ igual que ¦
+--------+---------------------------+--------+--------------------------¦
¦ * ¦ asterisco ¦ > ¦ mayor que ¦
+--------+---------------------------+--------+--------------------------¦
¦ + ¦ signo más ¦ ? ¦ signo de interrogación ¦
+--------+---------------------------+--------+--------------------------¦
¦ , ¦ coma ¦ _ ¦ subrayado ¦
+--------+---------------------------+--------+--------------------------¦
¦ | (8) ¦ barra vertical ¦ ¦ ¦
+------------------------------------------------------------------------+

(6) Las letras también también incluyen tres elementos de código


reservados como ampliadores alfabéticos para idiomas
nacionales (#,@ y $ en los Estados Unidos). Debe evitarse la
utilización de estos tres elementos de código porque
representan caracteres diferentes dependiendo del CCSID.

(7) El símbolo (¬) es también un carácter especial utilizado por


DB2 para OS/400. Debe evitarse su utilización porque es un
carácter variante.

(8) La utilización del carácter de barra vertical (|) puede


inhibir la portabilidad del código entre productos de bases
relacionales de IBM. Es preferible utilizar el operador
CONCAT en lugar del operador de concatenación (||). La
utilización de la barra vertical debe evitarse porque es un
carácter variante.

© Copyright IBM Corp. 1995, 1996


2.1 - 1
DB2/400 Manual de Consulta SQL V3R7
Símbolos
2.2 Símbolos

Las unidades sintácticas básicas del lenguaje se denominan símbolos. Un


símbolo consta de uno o más caracteres, excluyendo los espacios en blanco
y los caracteres con una constante de tipo serie o un identificador
delimitado (estos términos se definirán más adelante).

Los símbolos se clasifican como ordinarios o delimitadores:

 Un símbolo ordinario es una constante numérica, un identificador


ordinario, un identificador del lenguaje principal o una palabra
clave.

 Un símbolo delimitador es una constante de tipo serie, un


identificador delimitado, un símbolo de operador o cualquiera de los
caracteres especiales mostrados en los diagramas de sintaxis. Un
signo de interrogación (?) es también un símbolo delimitador siempre
que funcione como marcador de parámetros, tal como se explica en el
apartado "PREPARE" en el tema 5.38.

Espacios: Un espacio es una secuencia de uno o más caracteres en blanco.


Los símbolos que no sean constantes de tipo serie y ciertos
identificadores delimitados no deben incluir un espacio. Cualquier
símbolo puede ir seguido de un espacio. Todos los símbolos ordinarios
deben ir seguidos por un símbolo delimitador o un espacio. Si la sintaxis
no permite que un símbolo ordinario vaya seguido de un símbolo
delimitador, dicho símbolo no debe ir seguido de un espacio. Los ejemplos
siguientes ilustran la regla expuesta en este apartado.

He aquí algunos ejemplos de símbolos ordinarios:

1 .1 +2 SELECT E 3

He aquí algunos ejemplos de combinaciones de los símbolos ordinarios


anteriores que, en efecto, cambian los símbolos:

1.1 .1+2 SELECTE .1E E3 SELECT1

Esto demuestra por qué los símbolos ordinarios deben ir seguidos de un


símbolo delimitador o un espacio.

He aquí algunos ejemplos de símbolos delimitadores:

, 'serie' "fld1" = .

He aquí algunos ejemplos de combinaciones de los símbolos ordinarios


anteriores y de los símbolos delimitadores que, en efecto, cambian los
símbolos:

1. .3

El punto (.) es un símbolo delimitador cuando se utiliza como separador en


la calificación de nombres. En ella, el punto se utiliza en combinación
con un símbolo ordinario de una constante numérica. Así pues, la sintaxis
no permite que un símbolo ordinario vaya seguido de un símbolo
delimitador. En lugar de ello, el símbolo ordinario debe ir seguido de un
espacio.

Si el valor del sistema QDECFMT está establecido como el valor J, de


acuerdo con lo descrito en el apartado "Coma decimal" en el tema 2.8.6, la
coma se interpreta como coma decimal. He aquí algunos ejemplos de estas
constantes numéricas:

1,2 ,1 1, 1,e1

Si se quiere que '1,2' y '1,e1' sean dos unidades, tanto el símbolo


ordinario (1) como el delimitador (,) deben ir seguidos de un espacio, a
fin de evitar que la coma se interprete como una coma decimal. Aunque la
coma es, normalmente, un símbolo delimitador, forma parte del número
cuando se interpreta como coma decimal. Por lo tanto, la sintaxis no
permite que un símbolo ordinario (1) vaya seguido de un símbolo
delimitador (,). En lugar de ello, un símbolo ordinario debe ir seguido
de un espacio.

Comentarios: Las sentencias SQL estáticas pueden incluir comentarios del


lenguaje principal o comentarios de SQL. Cualquiera de estos dos tipos de
comentarios puede especificarse siempre que pueda especificarse un
espacio, excepto dentro de un símbolo delimitador o entre las palabras
clave EXEC y SQL. Los comentarios SQL van precedidos por dos guiones
consecutivos (--) y no pueden extenderse más allá del final de la línea.
Para obtener más información, consulte el apartado "Comentarios SQL" en el
tema 5.3.

Mayúsculas y minúsculas: Las letras en mayúsculas que se utilicen en un


símbolo ordinario que no sea una variable del lenguaje principal C se
pasará a minúsculas. Los signos delimitadores nunca se convierten a
mayúsculas. Así, la sentencia:

select * from EMP where apell = 'Pérez';

es equivalente, después de convertirla, a:

SELECT * FROM EMP WHERE APELL = 'Pérez';

© Copyright IBM Corp. 1995, 1996


2.2 - 1
DB2/400 Manual de Consulta SQL V3R7
Identificadores
2.3 Identificadores

Un identificador es un símbolo utilizado para formar un nombre. Un


identificador en una sentencia SQL es un identificador SQL, un
identificador del sistema o un identificador del lenguaje principal.

Nota: $, @, # y todos los demás caracteres variables no deben utilizarse


en los identificadores porque los elementos de código utilizados
para representarlos varían dependiendo del CCSID de la serie que
los contiene. Si se utilizan, pueden producirse resultados
imprevisibles. Para obtener más información acerca de los
caracteres variables, consulte el manual National Language Support,
SC41-4101.

Subtemas
2.3.1 Identificadores de SQL
2.3.2 Identificadores del sistema
2.3.3 Identificadores del lenguaje principal

© Copyright IBM Corp. 1995, 1996


2.3 - 1
DB2/400 Manual de Consulta SQL V3R7
Identificadores de SQL
2.3.1 Identificadores de SQL
Hay dos tipos de identificadores de SQL: identificadores ordinarios e
identificadores delimitados.

 Un identificador ordinario es una letra mayúscula seguida de cero o


| más caracteres, cada uno de los cuales es una letra mayúscula, un
dígito o el carácter de subrayado. Tenga presente que los
identificadores ordinarios se convierten a mayúsculas. Un
identificador ordinario no debe ser una palabra reservada. Consulte
el Apéndice D, "Palabras reservadas" si desea ver una lista de las
palabras reservadas. Si se utiliza una palabra reservada como
identificador en SQL, debe especificarse en mayúsculas y debe
encerrarse entre los caracteres de escape de SQL.

 Un identificador delimitado es una secuencia de uno o más caracteres


encerrados entre caracteres de escape SQL. La secuencia debe constar
de uno o más caracteres. Los blancos iniciales de la secuencia son
significativos. Los blancos finales de la secuencia no lo son. La
longitud de un identificador delimitado incluye los dos caracteres de
escape de SQL para nombres de columna, pero no para otros nombres SQL.
Tenga presente que los identificadores delimitados no se convierten a
mayúsculas. El carácter de escape son las comillas ("), excepto en
los casos que se citan a continuación, en los que el carácter de
escape es el apóstrofo ('):

- SQL interactivo cuando el delimitador de serie SQL está


establecido como comillas en la modalidad de sentencia de
comprobación de sintaxis COBOL

- SQL dinámico en un programa COBOL cuando el parámetro


OPTION(*QUOTESQL) de CRTSQLCBL o CRTSQLCBLI especifica que el
delimitador de serie son las comillas (")

- El programa de aplicación COBOL cuando cuando el parámetro


OPTION(*QUOTESQL) de CRTSQLCBL o CRTSQLCBLI especifica que el
delimitador de serie son las comillas (")

Dentro de los identificadores delimitados no están permitidos los


caracteres siguientes:

- de X'00' hasta X'3F' y X'FF'

© Copyright IBM Corp. 1995, 1996


2.3.1 - 1
DB2/400 Manual de Consulta SQL V3R7
Identificadores del sistema
2.3.2 Identificadores del sistema

Los identificadores del sistema se utilizan para formar el nombre de los


objetos del sistema en OS/400. Hay dos tipos de identificadores del
sistema: los ordinarios y los delimitados.

 Las reglas para formar un identificador ordinario del sistema son


idénticas a las reglas para formar un identificador ordinario de SQL.

 Las reglas para formar un identificador delimitado del sistema son


idénticas a las reglas para formar identificadores delimitados de SQL,
excepto en los puntos siguientes:

- En un identificador delimitado del sistema no están permitidos los


caracteres especiales siguientes:

- Un blanco (X'40')

- Un asterisco (X'5C')

- Un apóstrofo (X'7D')

- Un signo de interrogación (X'6F')

- Comillas (X'7F')

- Los bytes necesarios para los caracteres de escape están incluidos


en la longitud del identificador a menos que los caracteres
comprendidos entre los delimitadores formen un identificador
ordinario.

Por ejemplo, "PRIVILEGIOS" está en mayúsculas y los caracteres


comprendidos entre los delimitadores forman un identificador
ordinario; por lo tanto, tiene una longitud de 10 bytes y es un
nombre del sistema válido para una columna. Por el contrario,
"privilegios" está en minúsculas, tiene una longitud de 12 bytes y
no es un nombre del sistema válido para una columna porque los
bytes necesarios para los delimitadores deben incluirse en la
longitud del identificador.

Subtemas
2.3.2.1 Ejemplos

© Copyright IBM Corp. 1995, 1996


2.3.2 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplos
2.3.2.1 Ejemplos

SUELSEM SUEL_SEM "SUEL_SEM" "SINDIC" "suel_sem"

© Copyright IBM Corp. 1995, 1996


2.3.2.1 - 1
DB2/400 Manual de Consulta SQL V3R7
Identificadores del lenguaje principal
2.3.3 Identificadores del lenguaje principal
Un identificador del lenguaje principal es un nombre declarado en el
programa del lenguaje principal. Las reglas para formar un identificador
del lenguaje principal son las del lenguaje principal; la única excepción
es que no pueden utilizarse caracteres DBCS. Por ejemplo, las reglas para
formar un identificador del lenguaje principal en un programa en COBOL son
las mismas que las reglas para formar una palabra definida por el usuario
en COBOL. No deben utilizarse los nombres que empiezan por los caracteres
'SQ' (9), 'SQL', 'sql', 'RDI' o 'DSN' porque los precompiladores generan
variables del lenguaje principal que empiezan por estos caracteres.

(9) 'SQ' se permite en C, COBOL y PL/I; no debe utilizarse en


RPG

© Copyright IBM Corp. 1995, 1996


2.3.3 - 1
DB2/400 Manual de Consulta SQL V3R7
Convenios de denominación
2.4 Convenios de denominación

Las reglas para formar un nombre dependen del tipo de objeto designado por
el nombre y de la opción de denominación (*SQL o *SYS). La opción de
denominación se especifica en los mandatos CRTSQLxxx, RUNSQLSTM y STRSQL.
En REXX, se especifica en la sentencia SET OPTION. Los diagramas de
sintaxis utilizan términos diferentes para los distintos tipos de nombres.
En la lista siguiente se definen dichos términos.

nombre-autorización Identificador del sistema que designa al usuario


o grupo de usuarios. Un nombre de autorización
es un nombre de perfil de usuario del AS/400.
No debe ser un identificador delimitado que
incluya letras minúsculas o caracteres
especiales. Consulte el apartado "ID de
autorización y nombres-autorización" en el
tema 2.5 para obtener la distinción entre un
nombre de autorización y un ID de autorización.

nombre-colec Nombre calificado o no calificado con el que se


pueden agrupar de forma lógica los objetos SQL.
Los nombres de colección se utilizan como
calificadores del nombre de una tabla, vista,
índice o paquete. La forma no calificada de un
nombre de colección es un identificador del
sistema. La forma calificada de un nombre de
colección depende de la opción de denominación.

Para nombres SQL, el nombre de colección no


calificado de una sentencia SQL está calificado
implícitamente por el nombre-servidor. La forma
calificada es un nombre-servidor seguido de un
(.) y un identificador del sistema. El
nombre-servidor debe identificar el servidor
actual.

Para nombres del sistema, el nombre de colección


no calificado de una sentencia SQL está
calificado implícitamente por el
nombre-servidor. La forma calificada es un
nombre-servidor seguido de una barra inclinada
(/) y un identificador del sistema. El
nombre-servidor debe identificar el servidor
actual.

Nota: Nombre-colección hace referencia a una


colección creada por la sentencia CREATE
COLLECTION o CREATE SCHEMA o a una biblioteca
del OS/400.

nombre-col Nombre calificado o no calificado que designa a


una columna de una tabla o vista. La forma no
calificada de un nombre de columna es un
identificador SQL. La forma calificada es un
calificador seguido de un punto y de un
identificador SQL. El calificador es un nombre
de tabla, un nombre de vista o un nombre de
correlación.

Los nombres de columna no pueden estar


calificados por nombres del sistema en forma de
nombre-colección/nombre-tabla.nombre-columna,
excepto en las sentencias COMMENT ON y LABEL ON.
Si es necesario calificar los nombres de columna
y se permiten los nombres de correlación en la
sentencia, debe utilizarse un nombre de
correlación para calificar la columna.

Un nombre-columna puede especificar el nombre de


columna o el nombre de columna de sistema de una
columna de una tabla o vista.

nombre-restricción Nombre calificado o no calificado que designa a


una restricción de una tabla. La forma
calificada de un nombre de restricción depende
de la opción de denominación. Para nombres SQL,
la forma calificada es un nombre-colección
seguido de un punto (.) y un identificador del
sistema. Para nombres del sistema, la forma
calificada es un nombre-colección seguido de una
barra inclinada (/) seguida de un identificador
SQL.

La forma no calificada es un identificador SQL.


Queda calificada implícitamente de acuerdo con
lo siguiente:

 Si el parámetro DFTRDBCOL está especificado


en el mandato CRTSQLxxx, todos los
nombres-restricción no calificados de las
sentencias estáticas quedan calificados por
el valor especificado para el parámetro.
 En todos los demás casos, la forma no
calificada queda implícitamente calificada
de acuerdo con el convenio para nombres.
- Para dar nombres SQL, el
nombre-restricción está calificado
implícitamente por el identificador de

© Copyright IBM Corp. 1995, 1996


2.4 - 1
DB2/400 Manual de Consulta SQL V3R7
Convenios de denominación
autorización de la sentencia.
- Para dar nombres del sistema, el
nombre-restricción está implícitamente
calificado por el nombre-colección de la
colección que contiene a la tabla.

nombre-correlación Identificador SQL que designa una tabla, una


vista o filas individuales de una tabla o vista.

nombre-cursor Identificador SQL que designa un cursor SQL.

nombre-descriptor Dos puntos seguidos por un identificador del


lenguaje principal que designa a un área de
descriptor SQL (SQLDA). Véase el apartado
"Referencias a variables del lenguaje principal"
en el tema 2.11 que contiene una una descripción
de lo qué es un identificador del lenguaje
principal. Una variable del lenguaje principal
que designe un área de descriptor SQL no debe
tener ninguna variable de indicador. No se
permite la forma
:variable-lenguaje-principal:variable-indicador.

nombre-programa-externo Nombre calificado, no calificado o serie de


caracteres que designa a un programa externo.
La forma calificada de un
nombre-programa-externo depende de la opción de
denominación. Para nombres SQL, la forma
calificada es un nombre-colección seguido de un
punto (.) y un identificador del sistema. Para
dar nombres del sistema, la forma calificada es
un nombre-colección seguido de una barra
inclinada (/) seguida de un identificador del
sistema.

La forma no calificada es un identificador del


sistema. Queda calificada implícitamente de
acuerdo con lo siguiente:

 Si el parámetro DFTRDBCOL está especificado


en el mandato CRTSQLxxx, todos los
nombres-programa-externo no calificados de
las sentencias estáticas quedan calificados
por el valor especificado para el parámetro.
 En todos los demás casos, la forma no
calificada queda implícitamente calificada
de acuerdo con el convenio para nombres.
- Para dar nombres SQL, el
nombre-programa-externo está calificado
implícitamente por el identificador de
autorización de la sentencia.
- Para dar nombres del sistema, el
nombre-programa-externo está
implícitamente calificado por la lista
de bibliotecas del trabajo (*LIBL).

El formato de la serie de caracteres es uno de


los dos siguientes:

 Un nombre de programa calificado de OS/400


('nombre-biblioteca/nombre-programa').
 Un nombre de archivo fuente calificado de
OS/400 seguido de un paréntesis de apertura,
seguido de un nombre de miembro de OS/400 y
un paréntesis de cierre
('nombre-biblioteca/nombre-archivo-fuente
(nombre-miembro)'). Esta forma sólo es
válida cuando se llama a un procedimiento
REXX.

etiqueta-lenguaje-principal
Símbolo que designa una etiqueta del programa de
lenguaje principal.

variable-lenguaje-principal
Secuencia de símbolos que designan a una
variable del lenguaje principal. Una
variable-lenguaje-principal incluye al menos un
identificador-lenguaje-principal, según se
explica en el apartado "Referencias a variables
del lenguaje principal" en el tema 2.11.

nombre-índice Nombre calificado o no calificado que designa un


índice. La forma calificada de un nombre-índice
depende de la opción de denominación. Para
nombres SQL, la forma calificada es un
nombre-colección seguido de un punto (.) y de
un identificador SQL. Para nombres del sistema,
la forma calificada es un nombre-colección
seguido de una barra inclinada (/) seguida de un
identificador SQL.

La forma no calificada es un identificador SQL.


Queda calificada implícitamente de acuerdo con
lo siguiente:

 Si el parámetro DFTRDBCOL está especificado


en el mandato CRTSQLxxx, todos los

© Copyright IBM Corp. 1995, 1996


2.4 - 2
DB2/400 Manual de Consulta SQL V3R7
Convenios de denominación
nombres-índice no calificados de las
sentencias estáticas quedan calificados por
el valor especificado para el parámetro.

 En todos los demás casos, la forma no


calificada queda implícitamente calificada
de acuerdo con el convenio para nombres.

- Para dar nombres SQL, el nombre-índice


está implícitamente calificado por el
identificador de autorización de la
sentencia.

- Para dar nombres del sistema, el


nombre-índice está implícitamente
calificado por la lista de bibliotecas
del trabajo (*LIBL).

Un nombre-índice puede especificar el nombre del


índice o el nombre de índice del sistema del
índice.

|nombre-grupo-nodos Un nombre calificado o no calificado que designa


| un grupo de nodos. Un grupo de nodos es un
| grupo de AS/400 entre los que se distribuye una
| tabla. Para obtener más información acerca de
| las tablas distribuidas y los grupos de nodos,
| consulte la publicación DB2 Multisystem for
| OS/400, SC41-3705.

| La forma calificada de nombre-grupo-nodos


| depende de la opción de denominación. Para
| nombres SQL, la forma calificada es un
| nombre-colección seguido de un punto (.) y un
| identificador del sistema. Para dar nombres del
| sistema, la forma calificada es un
| nombre-colección seguido de una barra inclinada
| (/) seguida de un identificador del sistema.

| La forma no calificada es un identificador del


| sistema. Queda calificada implícitamente de
| acuerdo con lo siguiente:

|  Si se especifica el parámetro DFTRDBCOL en


| el mandato CRTSQLxxx, todos los nombres de
| grupo de nodos no calificados en sentencias
| estáticas se califican por el valor
| especificado para el parámetro.

|  En todos los demás casos, la forma no


| calificada queda implícitamente calificada
| de acuerdo con el convenio para nombres.

| - Para dar nombres SQL, el


| nombre-grupo-nodos está implícitamente
| calificado por el identificador de
| autorización de la sentencia.

| - Para dar nombres del sistema, el


| nombre-grupo-nodos está implícitamente
| calificado por la lista de bibliotecas
| de trabajo (*LIBL).

nombre-paquete Nombre calificado o no calificado que designa a


un paquete. La forma calificada de un
nombre-paquete depende de la opción de
denominación. Para nombres SQL, la forma
calificada es un nombre-colección seguido de un
punto (.) y un identificador del sistema. Para
dar nombres del sistema, la forma calificada es
un nombre-colección seguido de una barra
inclinada (/) seguida de un identificador del
sistema.

La forma no calificada es un identificador del


sistema. Queda calificada implícitamente de
acuerdo con lo siguiente:

 Si el parámetro DFTRDBCOL está especificado


en el mandato CRTSQLxxx, todos los
nombres-paquete no calificados de las
sentencias estáticas quedan calificados por
el valor especificado para el parámetro.

 En todos los demás casos, la forma no


calificada queda implícitamente calificada
de acuerdo con el convenio para nombres.

- Para dar nombres SQL, el nombre-paquete


está calificado implícitamente por el
identificador de autorización de la
sentencia.

- Para dar nombres del sistema, el

© Copyright IBM Corp. 1995, 1996


2.4 - 3
DB2/400 Manual de Consulta SQL V3R7
Convenios de denominación
nombre-paquete está implícitamente
calificado por la lista de bibliotecas
del trabajo (*LIBL).

|nombre-parámetro Un identificador ordinario que designa a un


| parámetro de procedimiento. El identificador
| puede ir precedido por un punto y coma.

nombre-procedimiento Nombre calificado o no calificado que designa a


un procedimiento. La forma calificada de un
nombre-procedimiento depende de la opción de
denominación. Para nombres SQL, la forma
calificada es un nombre-colección seguido de un
punto (.) y de un identificador SQL. Para
nombres del sistema, la forma calificada es un
nombre-colección seguido de una barra inclinada
(/) seguida de un identificador SQL.

La forma no calificada es un identificador SQL.


Queda calificada implícitamente de acuerdo con
lo siguiente:

 Si el parámetro DFTRDBCOL está especificado


en el mandato CRTSQLxxx, todos los
nombres-procedimiento no calificados de las
sentencias estáticas quedan calificados por
el valor especificado para el parámetro.

 En todos los demás casos, la forma no


calificada queda implícitamente calificada
de acuerdo con el convenio para nombres.

- Para dar nombres SQL, el


nombre-procedimiento está calificado
implícitamente por el identificador de
autorización de la sentencia.

- Para dar nombres del sistema, el


nombre-procedimiento está implícitamente
calificado por la lista de bibliotecas
del trabajo (*LIBL).

nombre-servidor Identificador SQL que designa un servidor de la


aplicación. No debe incluir letras en
minúsculas ni caracteres especiales.

nombre-sentencia Identificador SQL que designa a una sentencia


SQL preparada.

nombre-columna-sistema Nombre no calificado que designa el nombre de


| columna de OS/400 de una tabla o una vista. Un
| nombre-columna-sistema es un identificador del
| sistema. Los nombres-columna-sistema pueden ser
identificadores delimitados, pero los caracteres
comprendidos entre los delimitadores no pueden
incluir letras en minúsculas ni caracteres
especiales.

|nombre-objeto-sistema Nombre no calificado que designa el nombre


| OS/400 de una tabla, vista o índice. Un
| nombre-objeto-sistema es un identificador del
| sistema.

| Si el nombre no calificado de la tabla, vista o


| índice es un identificador válido del sistema,
| el nombre-objeto-sistema de la tabla, vista o
| índice es el nombre no calificado de la tabla,
| vista o índice.

nombre-tabla Nombre calificado o no calificado que designa


una tabla. La forma calificada de un
nombre-tabla depende de la opción de
denominación. Para nombres SQL, la forma
calificada es un nombre-colección seguido de un
punto (.) y de un identificador SQL. Para
nombres del sistema, la forma calificada es un
nombre-colección seguido de una barra inclinada
(/) seguida de un identificador SQL.

La forma no calificada es un identificador SQL.


Queda calificada implícitamente de acuerdo con
lo siguiente:

 Si el parámetro DFTRDBCOL está especificado


en el mandato CRTSQLxxx, todos los
nombres-tabla no calificados de las
sentencias estáticas quedan calificados por
el valor especificado para el parámetro.

 En todos los demás casos, la forma no


calificada queda implícitamente calificada
de acuerdo con el convenio para nombres.

- Para dar nombres SQL, el nombre-tabla

© Copyright IBM Corp. 1995, 1996


2.4 - 4
DB2/400 Manual de Consulta SQL V3R7
Convenios de denominación
está calificado implícitamente por el
identificador de autorización de la
sentencia.

- Para dar nombres del sistema, el


nombre-tabla está implícitamente
calificado por la lista de bibliotecas
del trabajo (*LIBL).

Un nombre-tabla puede especificar el nombre de


la tabla o el nombre de tabla del sistema de la
tabla.

nombre-vista Nombre calificado o no calificado que designa


una vista. La forma calificada de un
nombre-vista depende de la opción de
denominación. Para nombres SQL, la forma
calificada es un nombre-colección seguido de un
punto (.) y de un identificador SQL. Para
nombres del sistema, la forma calificada es un
nombre-colección seguido de una barra inclinada
(/) seguida de un identificador SQL.

La forma no calificada es un identificador SQL.


Queda calificada implícitamente de acuerdo con
lo siguiente:

 Si el parámetro DFTRDBCOL está especificado


en el mandato CRTSQLxxx, todos los
nombres-vista no calificados de las
sentencias estáticas quedan calificados por
el valor especificado para el parámetro.

 En todos los demás casos, la forma no


calificada queda implícitamente calificada
de acuerdo con el convenio para nombres.

- Para dar nombres SQL, el nombre-vista


está calificado implícitamente por el
identificador de autorización de la
sentencia.

- Para dar nombres del sistema, el


nombre-vista está implícitamente
calificado por la lista de bibliotecas
del trabajo (*LIBL).

Un nombre-vista puede especificar el nombre de


la vista o el nombre de vista del sistema de la
vista.

+------------------------------------------------------------------------+
¦ Tabla 1. Límites de longitud del identificador (en bytes) ¦
+------------------------------------------------------------------------¦
¦ Tipo de identificador ¦ Longitud máxima ¦
+------------------------------------------------+-----------------------¦
¦ Nombre de autorización ¦ 10 ¦
+------------------------------------------------+-----------------------¦
¦ Nombre de correlación ¦ 128 ¦
+------------------------------------------------+-----------------------¦
¦ Nombre de cursor ¦ 18 ¦
+------------------------------------------------+-----------------------¦
¦ Identificador del lenguaje principal ¦ 64 ¦
+------------------------------------------------+-----------------------¦
¦ Nombre de servidor ¦ 18 ¦
+------------------------------------------------+-----------------------¦
¦ Nombre de sentencia ¦ 18 ¦
+------------------------------------------------+-----------------------¦
¦ Nombre de colección no calificado ¦ 10 ¦
+------------------------------------------------+-----------------------¦
¦ Nombre de columna no calificado ¦ 30 ¦
+------------------------------------------------+-----------------------¦
¦ Nombre de restricción no calificado ¦ 128 ¦
+------------------------------------------------+-----------------------¦
¦ Nombre de programa externo no calificado (10) ¦ 10 ¦
+------------------------------------------------+-----------------------¦
|¦ Nombre de grupo de nodos no calificado ¦ 10 ¦
+------------------------------------------------+-----------------------¦
¦ Nombre de paquete no calificado ¦ 10 ¦
+------------------------------------------------+-----------------------¦
¦ Nombre de procedimiento no calificado ¦ 128 ¦
+------------------------------------------------+-----------------------¦
¦ Nombre de columna de sistema no calificado ¦ 10 ¦
+------------------------------------------------+-----------------------¦
|¦ Nombre de objeto del sistema no calificado ¦ 10 ¦
+------------------------------------------------+-----------------------¦
¦ Nombre de índice, vista y tabla no calificado ¦ 128 ¦
+------------------------------------------------------------------------+

(10) Para procedimientos REXX, el límite es 33.

Subtemas
2.4.1 Nombres SQL y nombres del sistema: consideraciones especiales

© Copyright IBM Corp. 1995, 1996


2.4 - 5
DB2/400 Manual de Consulta SQL V3R7
Nombres SQL y nombres del sistema: consideraciones esp eci al es
2.4.1 Nombres SQL y nombres del sistema: consideraciones especiales

El CL mandato OVRDBF (Alterar Temporalmente Archivo de Base de Datos)


puede especificarse para alterar temporalmente un nombre SQL o del sistema
con otro nombre de objeto para sentencias SQL de manipulación local de
datos. Las alteraciones temporales no se tienen en cuenta en el caso de
sentencias SQL de definición de datos y de manipulación de datos que se
ejecuten en una base de datos relacional remota. Consulte el manual
Gestión de datos, SC10-9635 (SC41-4710), para obtener más información
acerca de la función de alteración temporal.

Puede tener acceso a las tablas o vistas utilizando nombres SQL o nombres
del sistema. Si opta por utilizar nombres SQL, las reglas que rigen son
las siguientes:

 Si se especifica un nombre calificado, el gestor de bases de datos


intenta encontrar el objeto en la colección especificada.

 Si se especifica un nombre de objeto no calificado en una sentencia


SQL estática y el parámetro DFTRDBCOL está especificado en los
mandatos CRTSQLxxx, el gestor de bases de datos intenta encontrar el
objeto en la colección especificada en el parámetro DFTRDBCOL.

 Si un objeto no está calificado en una sentencia SQL dinámica o


estática y el parámetro DFTRDBCOL no está especificado en los mandatos
CRTSQLxxx, queda calificado implícitamente por el ID de autorización
de la sentencia. Dado que el ID de autorización puede variar
dependiendo del usuario, la mayoría de los nombres de sintaxis SQL
deben estar calificados.

Si opta por utilizar nombres del sistema, las reglas que rigen son las
siguientes:

 Si se especifica un nombre calificado, el gestor de base de datos


busca el objeto en la biblioteca especificada.

 Si se especifica un nombre de objeto no calificado en una sentencia


SQL estática y el parámetro DFTRDBCOL está especificado en los
mandatos CRTSQLxxx, el gestor de bases de datos intenta encontrar el
objeto en la colección especificada en el parámetro DFTRDBCOL.

 Si se especifica un nombre de objeto no calificado en una sentencia


SQL dinámica o en una estática y no se ha especificado el parámetro
DFTRDBCOL en los mandatos CRTSQLxxx, se busca en la lista de
bibliotecas (*LIBL).

© Copyright IBM Corp. 1995, 1996


2.4.1 - 1
DB2/400 Manual de Consulta SQL V3R7
ID de autorización y nombres-autorización
2.5 ID de autorización y nombres-autorización

Un ID de autorización es una serie de caracteres obtenida a través del


gestor de base de datos cuando se establece una conexión entre el gestor
de base de datos y un proceso de aplicación o un proceso de preparación de
programa. Designa a un conjunto de privilegios. También puede designar a
un usuario o a un grupo de usuarios, pero el gestor de base de datos no
controla esta propiedad.

El gestor de base de datos utiliza los ID de autorización para


proporcionar:

 Comprobación de autorización de sentencias SQL


 Los calificadores implícitos para los nombres de tablas, vistas,
restricciones, paquetes e índices.

Los ID de autorización se aplican a todas las sentencias SQL. El ID de


autorización que se aplica a una sentencia SQL estática depende del valor
USRPRF que se especifica en el mandato del precompilador:

 Si se especifica USRPRF(*OWNER), o se especifica USRPRF(*NAMING) y se


utiliza la modalidad de denominación de SQL, el ID de autorización de
la sentencia es el propietario del programa SQL no distribuido. Para
programas SQL distribuidos, es el propietario del paquete SQL.

 Si se especifica USRPRF(*USER), o se especifica USRPRF(*NAMING) y se


utiliza la modalidad de denominación del sistema, el ID de
autorización de la sentencia es el ID de autorización del usuario que
ejecuta el programa SQL no distribuido.

El ID de autorización aplicado a una sentencia SQL dinámica depende de


dónde y cómo se ejecuta la sentencia:

 Si la sentencia se prepara y se ejecuta desde un programa no


distribuido:
- Si el valor USRPRF es *USER y el valor DYNUSRPRF es *USER para el
programa, el ID de autorización que se aplica es el ID del usuario
que ejecuta el programa no distribuido. A esto se le llama el ID
de autorización en tiempo de ejecución.
- Si el valor USRPRF es *OWNER y el valor DYNUSRPRF es *USER para el
programa, el ID de autorización que se aplica es el ID del usuario
que ejecuta el programa no distribuido.
- Si el valor USRPRF es *OWNER y el valor DYNUSRPRF es *OWNER para
el programa, el ID de autorización que se aplica es el ID del
propietario del programa no distribuido.
 Si la sentencia se prepara y se ejecuta desde un programa distribuido:
- Si el valor USRPRF es *USER y el valor DYNUSRPRF es *USER para el
paquete SQL, el ID de autorización que se aplica es el ID del
usuario que ejecuta el paquete SQL en el servidor actual. A esto
se le llama también ID de autorización en tiempo de ejecución.
- Si el valor USRPRF es *OWNER y el valor DYNUSRPRF es *USER para el
paquete SQL, el ID de autorización que se aplica es el ID del
usuario que ejecuta el paquete SQL en el servidor actual.
- Si el valor USRPRF es *OWNER y el valor DYNUSRPRF es *OWNER para
el paquete SQL, el ID de autorización que se aplica es el ID del
propietario del paquete SQL en el servidor actual.
 Si la sentencia se emite de forma interactiva, el ID de autorización
que se aplica es el ID del usuario que haya emitido el mandato STRSQL
(Arrancar SQL).
 Si la sentencia se ejecuta desde el mandato RUNSQLSTM, el ID de
autorización que se aplica es el ID del usuario que ha emitido el
mandato RUNSQLSTM.
 Si la sentencia se ejecuta desde REXX, el ID de autorización que se
aplica es el ID del usuario que ha emitido el mandato STRREXPRC.

En OS/400, el ID de autorización en tiempo de ejecución es el perfil de


usuario del trabajo.

No debe confundirse un nombre-autorización especificado en una sentencia


SQL con el ID de autorización de la sentencia. Un nombre-autorización es
un identificador que se utiliza en las sentencias GRANT y REVOKE para
designar el destino de dichas operaciones. La premisa de un otorgamiento
de privilegios X es que X será a partir de entonces el ID de autorización
de las sentencias que precisen dichos privilegios. También se puede
utilizar un perfil de usuario de grupo al comprobar la autorización de una
sentencia SQL. Para obtener información acerca de perfiles de usuario de
grupo, consulte el manual Security - Reference, SC41-4302.

Subtemas
2.5.1 Ejemplos

© Copyright IBM Corp. 1995, 1996


2.5 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplos
2.5.1 Ejemplos

 Supongamos que su ID de usuario es LOPEZ; en este caso, LOPEZ será el


ID de autorización cuando ejecute la siguiente sentencia de forma
interactiva:

GRANT SELECT ON TDEPT TO PEREZ

LOPEZ es el ID de autorización de la sentencia. Por tanto, se


comprueba si LOPEZ tiene autorización para ejecutar la sentencia;
LOPEZ es el calificador implícito de TDEPT.

PEREZ es un nombre-autorización especificado en la sentencia. A PEREZ


se le otorga el privilegio SELECT en LOPEZ.TDEPT.

 Suponga que LOPEZ tiene autorización de administrador y que es el ID


de autorización de las sentencias siguientes:

DROP TABLE TDEPT

Elimina la tabla LOPEZ.TDEPT.

DROP TABLE LOPEZ.TDEPT

Elimina la tabla LOPEZ.TDEPT.

DROP TABLE PEREZ.TDEPT

Elimina la tabla PEREZ.TDEPT.

© Copyright IBM Corp. 1995, 1996


2.5.1 - 1
DB2/400 Manual de Consulta SQL V3R7
Tipos de datos
2.6 Tipos de datos

Si desea información sobre la especificación de los tipos de datos de las


columnas, consulte el apartado "CREATE TABLE" en el tema 5.16.

La unidad de datos más pequeña que puede manipularse en SQL se denomina


valor. El modo en que se interpretan los valores depende del tipo de
datos de su origen. El origen de los valores puede ser:

 Columnas
 Constantes
 Expresiones
 Funciones
 Variables del lenguaje principal
 Registros especiales

La siguiente figura ilustra los diferentes tipos de datos a los que da


soporte el programa DB2 para OS/400.

Nulos: Todos los tipos de datos incluyen el valor nulo. El valor nulo es
un valor especial distinto de todos los valores no nulos y por esa razón
denota la ausencia de un valor (no nulo). Si bien todos los tipos de
datos incluyen el valor nulo, las columnas definidas como NOT NULL no
pueden contener valores nulos.

Subtemas
2.6.1 Series de caracteres
2.6.2 Subtipos de caracteres
2.6.3 Series gráficas
2.6.4 Subtipos gráficos
2.6.5 Números
2.6.6 Valores de fecha y hora

© Copyright IBM Corp. 1995, 1996


2.6 - 1
DB2/400 Manual de Consulta SQL V3R7
Series de caracteres
2.6.1 Series de caracteres

Una serie de caracteres es una secuencia de bytes. La longitud de la


serie es el número de bytes de la secuencia. Si la longitud es cero, el
valor se denomina serie vacía. No debe confundirse la serie vacía con el
valor nulo.

Subtemas
2.6.1.1 Series de caracteres de longitud fija
2.6.1.2 Series de caracteres de longitud variable
2.6.1.3 Variables del lenguaje principal de serie de caracteres

© Copyright IBM Corp. 1995, 1996


2.6.1 - 1
DB2/400 Manual de Consulta SQL V3R7
Series de caracteres de longitud fija
2.6.1.1 Series de caracteres de longitud fija

Todos los valores de una columna de serie de caracteres de longitud fija


tienen la misma longitud. Esta viene determinada por el atributo de
longitud de la columna. El atributo de longitud debe estar comprendido
entre 1 y 32766, ambos inclusive.

© Copyright IBM Corp. 1995, 1996


2.6.1.1 - 1
DB2/400 Manual de Consulta SQL V3R7
Series de caracteres de longitud variable
2.6.1.2 Series de caracteres de longitud variable

Todos los valores de una columna de serie de caracteres de longitud


variable tienen la misma longitud máxima, que viene determinada por el
atributo de longitud de la columna. El atributo de longitud debe estar
comprendido entre 1 y 32740, ambos inclusive.

© Copyright IBM Corp. 1995, 1996


2.6.1.2 - 1
DB2/400 Manual de Consulta SQL V3R7
Variables del lenguaje principal de serie de caracteres
2.6.1.3 Variables del lenguaje principal de serie de caracteres

 Las variables de serie de caracteres de longitud fija pueden


utilizarse en todos los lenguajes principales, excepto REXX (En C, las
variables de serie de caracteres de longitud fija están limitadas a
una longitud de 1).

 Las variables de serie de caracteres de longitud variable pueden


utilizarse en C, COBOL, PL/I, REXX y RPG:

- En PL/I y REXX existe un tipo de datos de serie de caracteres de


longitud variable.

- En COBOL y C las series de caracteres de longitud variable se


representan en forma de estructuras.

- En C, las variables de serie de caracteres de longitud variable


también se pueden representar mediante series terminadas en NUL.

- En RPG, las variables de serie de caracteres de longitud variable


sólo pueden representarse mediante columnas VARCHAR incluidas como
resultado de una estructura de datos descrita externamente.

© Copyright IBM Corp. 1995, 1996


2.6.1.3 - 1
DB2/400 Manual de Consulta SQL V3R7
Subtipos de caracteres
2.6.2 Subtipos de caracteres

Cada serie de caracteres se define con mayor precisión como uno de los
subtipos siguientes:

datos de bit Datos no asociados con ningún juego de caracteres


codificados y que no se convierte nunca. El CCSID
correspondiente a los datos de bit es 65535.

datos SBCS Datos en los que cada carácter esta representado por un
solo byte. Cada serie de caracteres de datos SBCS tiene un
CCSID asociado. Si es necesario, una serie de caracteres
de datos SBCS se convierte antes de utilizarse en una
operación con una serie de caracteres que tenga un CCSSID
diferente.

datos mixtos Datos que pueden contener una mezcla de caracteres de un


juego de caracteres de un solo byte (SBCS) y un juego de
caracteres de doble byte (DBCS). Cada serie de caracteres
de datos mixtos tiene un CCSID asociado. Si es necesario,
una serie de caracteres de datos mixtos se convierte antes
de realizarse una operación con una serie de caracteres que
tenga un CCSID. Si los datos mixtos contienen un carácter
DBCS, no pueden convertirse a datos SBCS.

El gestor de bases de datos no reconoce las subclases de caracteres de


doble byte y no asigna ningún significado específico a ningún código de
doble byte en concreto. Sin embargo, si opta por utilizar datos mixtos,
hay dos códigos EBCDIC de un solo byte a los que se les concede un
significado especial:

 X'0E', el carácter de "desplazamiento a teclado ideográfico", se


utiliza para indicar el comienzo de una secuencia de códigos de doble
byte.

 X'0F', el carácter de "desplazamiento a teclado estándar", se utiliza


para indicar el final de una secuencia de códigos de doble byte.

A fin de que el gestor de bases de datos reconozca caracteres de doble


byte en una serie de caracteres de datos mixtos, debe cumplirse la
siguiente condición:

En la serie, los caracteres de doble byte deben estar encerrados entre


parejas de caracteres de desplazamiento a teclado ideográfico y a
teclado estándar.

El emparejamiento se detecta a medida que la serie se lee de izquierda


a derecha. El código X'0E' se reconoce como carácter de
desplazamiento a teclado ideográfico si más adelante se halla X'0F';
si no es así, no es válido. El primer X'0F' que sigue al X'0E' que
está en un límite de doble byte es el carácter de desplazamiento a
teclado estándar emparejado. Los X'0F' que no estén es un límite de
doble byte no se reconocen.

El número de bytes entre los caracteres emparejados debe ser un número


par, y cada par de bytes se considera un carácter de doble byte. En
la serie, puede haber más de un juego de parejas de caracteres de
desplazamiento a teclado ideográfico y a teclado estándar.

La longitud de una serie de caracteres de datos mixtos es el número total


de bytes, contando dos bytes para cada carácter de doble byte y uno para
cada carácter de desplazamiento a teclado ideográfico o estándar.

Cuando el CCSID del trabajo indica que se permite DBCS, CREATE TABLE
creará columnas de caracteres como campos de DBCS abierto, a menos que se
especifique FOR BIT DATA, FOR SBCS DATA o un CCSID SBCS. El usuario de
SQL las verá como campos de caracteres, pero el soporte de bases de datos
del sistema las verá como campos de DBCS abierto. Para obtener una
definición de un campo DBCS abierto, consulte el manual DB2/400
Programación de la base de datos, SC10-9634 (SC41-4701).

© Copyright IBM Corp. 1995, 1996


2.6.2 - 1
DB2/400 Manual de Consulta SQL V3R7
Series gráficas
2.6.3 Series gráficas

Una serie gráfica es una secuencia de caracteres de dos bytes. La


longitud de la serie es el número de bytes de sus caracteres. Al igual
que las series de caracteres, las series gráficas pueden estar vacías.

Subtemas
2.6.3.1 Series gráficas de longitud fija
2.6.3.2 Series gráficas de longitud variable
2.6.3.3 Variables del lenguaje principal de serie gráfica

© Copyright IBM Corp. 1995, 1996


2.6.3 - 1
DB2/400 Manual de Consulta SQL V3R7
Series gráficas de longitud fija
2.6.3.1 Series gráficas de longitud fija
Todos los valores de una columna de serie gráfica de longitud fija tienen
la misma longitud, que viene determinada por el atributo de longitud de la
columna. El atributo de longitud debe estar comprendido entre 1 y 16383,
ambos inclusive.

© Copyright IBM Corp. 1995, 1996


2.6.3.1 - 1
DB2/400 Manual de Consulta SQL V3R7
Series gráficas de longitud variable
2.6.3.2 Series gráficas de longitud variable

Los valores de una columna de serie gráfica de longitud variable pueden


tener longitudes distintas. La longitud máxima viene determinada por el
atributo de longitud de la columna. El atributo de longitud debe estar
comprendido entre 1 y 16370, ambos inclusive.

© Copyright IBM Corp. 1995, 1996


2.6.3.2 - 1
DB2/400 Manual de Consulta SQL V3R7
Variables del lenguaje principal de serie gráfica
2.6.3.3 Variables del lenguaje principal de serie gráfica

 Las variables del lenguaje principal de serie gráfica de longitud fija


pueden definirse en C e ILE RPG/400. (En C, las variables del
lenguaje principal de serie gráfica de longitud fija están limitadas a
una longitud de 1).

Aunque las variables del lenguaje principal de serie gráfica de


longitud fija no puedan definirse en PL/I, COBOL ni RPG/400, una
variable del lenguaje principal de serie de caracteres se tratará
igual que una variable del lenguaje principal de serie gráfica de
longitud fija si se ha generado en el fuente a partir de una columna
GRAPHIC de la definición externa de un archivo.

 Las variables del lenguaje principal de serie gráfica de longitud


variable pueden definirse en C y REXX.

- En REXX existe un tipo de datos de serie gráfica de longitud


variable.

- En C las series gráficas de longitud variable se representan en


forma de estructuras.

- En C, las variables de serie gráfica de longitud variable también


se pueden representar mediante series gráficas terminadas en NUL.

- Aunque las variables del lenguaje principal de serie gráfica de


longitud variable no puedan definirse en PL/I, COBOL ni RPG, una
variable del lenguaje principal de serie de caracteres se tratará
igual que una variable del lenguaje principal de serie gráfica de
longitud variable si se ha generado en el fuente a partir de una
columna VARGRAPHIC de la definición externa de un archivo.

© Copyright IBM Corp. 1995, 1996


2.6.3.3 - 1
DB2/400 Manual de Consulta SQL V3R7
Subtipos gráficos
2.6.4 Subtipos gráficos

Cada serie gráfica se define con mayor precisión como datos DBCS o datos
UCS-2.

datos DBCS Los datos en que se representa cada uno de los caracteres
mediante un carácter del juego de caracteres de doble byte
(DBCS) que no incluya los caracteres de desplazamiento a
teclado estándar o ideográfico.

Cada serie gráfica DBCS tiene un CCSID que identifica un


juego de caracteres codificado de doble byte. Si es
necesario, una serie gráfica DBCS se convierte antes de
utilizarse en una operación con una serie gráfica DBCS que
tenga un CCSID DBCS diferente.

datos UCS-2 Los datos en que se representa cada uno de los caracteres
mediante un carácter del juego de caracteres codificado
universal (UCS-2).

Cuando las variables del lenguaje principal de serie gráfica no están


identificadas explícitamente con un CCSID, se utiliza el CCSID DBCS
asociado que corresponde al CCSID del trabajo. Si no existe ningún CCSID
DBCS asociado, la variable del lenguaje principal se identifica por medio
de 65535. Una variable del lenguaje principal de serie gráfica nunca se
identifica de forma implícita con un CCSID de UCS-2. Véase la sentencia
DECLARE VARIABLE para obtener información sobre cómo identificar una
variable del lenguaje principal gráfica con un CCSID.

© Copyright IBM Corp. 1995, 1996


2.6.4 - 1
DB2/400 Manual de Consulta SQL V3R7
Números
2.6.5 Números

Todos los números tienen un signo y una precisión. La precisión es el


número total de dígitos decimales o binarios, excluyendo el signo. El
signo es positivo si el valor es cero.

Subtemas
2.6.5.1 Entero pequeño
2.6.5.2 Entero grande
2.6.5.3 Coma flotante
2.6.5.4 Decimal
2.6.5.5 Variables del lenguaje principal numéricas

© Copyright IBM Corp. 1995, 1996


2.6.5 - 1
DB2/400 Manual de Consulta SQL V3R7
Entero pequeño
2.6.5.1 Entero pequeño

Un entero pequeño es un número binario compuesto por 2 bytes (16 bits).


El rango de los enteros pequeños está comprendido entre - 32768 y +32767.

Para los enteros pequeños, se da soporte a la escala y precisión decimal


mediante los archivos de sistema COBOL, RPG y AS/400. Para obtener
información relativa a la precisión y la escala de los enteros binarios,
consulte el manual DDS Reference, SC41-4712.

© Copyright IBM Corp. 1995, 1996


2.6.5.1 - 1
DB2/400 Manual de Consulta SQL V3R7
Entero grande
2.6.5.2 Entero grande

Un entero grande es un número binario que consta de 4 bytes (32 bits). El


rango de los enteros grandes va de -2147483648 a +2147483647.

Para enteros grandes, la escala y precisión decimal está soportada por los
archivos de sistema COBOL, RPG y AS/400. Para obtener información
relativa a la precisión y la escala de los enteros binarios, consulte el
manual DDS Reference, SC41-4712.

© Copyright IBM Corp. 1995, 1996


2.6.5.2 - 1
DB2/400 Manual de Consulta SQL V3R7
Coma flotante
2.6.5.3 Coma flotante

Un número de coma flotante de precisión simple es una representación


aproximada de 32 bits de un número real. El rango de la magnitud oscila
aproximadamente entre 1,17549436 ×10(-38) y 3,40282356 ×10(38)

Un número de coma flotante de precisión doble es una representación


aproximada de 64 bits IEEE de un número real. El rango de la magnitud
oscila aproximadamente entre 2,2250738585072014 × 10(-308) y
1,7976931348623158 × 10(308).

© Copyright IBM Corp. 1995, 1996


2.6.5.3 - 1
DB2/400 Manual de Consulta SQL V3R7
Decimal
2.6.5.4 Decimal

Un valor decimal es un número decimal empaquetado o decimal con zona con


una coma decimal implícita. La posición de la coma decimal viene
determinada por la precisión y la escala del número. La escala, o sea el
número de dígitos de la parte fraccionaria del número, no puede ser
negativa o mayor que la precisión. La precisión máxima es 31 dígitos.

Todos los valores de una columna decimal tienen la misma precisión y


escala. El rango de una variable decimal o los números de una columna
decimal es de n a +n, donde el valor absoluto de n es el número más grande
que se puede representar con la precisión y escala aplicables. El rango
máximo va de 10(31) negativo+1 a 10(31) menos 1.

© Copyright IBM Corp. 1995, 1996


2.6.5.4 - 1
DB2/400 Manual de Consulta SQL V3R7
Variables del lenguaje principal numéricas
2.6.5.5 Variables del lenguaje principal numéricas

Las variables de enteros binarios pueden utilizarse en todos los lenguajes


principales. Las variables de coma flotante pueden utilizarse en todos
los lenguajes principales excepto en RPG y COBOL. Las variables decimales
se pueden utilizar en todos los lenguajes principales a los que se da
soporte.

© Copyright IBM Corp. 1995, 1996


2.6.5.5 - 1
DB2/400 Manual de Consulta SQL V3R7
Valores de fecha y hora
2.6.6 Valores de fecha y hora

En los siguientes apartados se describen los tipos de datos de fecha y


hora. Aunque los valores de fecha y hora pueden utilizarse en ciertas
operaciones aritméticas y de serie y son compatibles con ciertas series,
no son ni series ni números. Sin embargo, las series pueden representar
valores de fecha y hora; consulte el apartado "Representaciones de serie
de los valores de fecha y hora" en el tema 2.6.6.4.

Subtemas
2.6.6.1 Fecha
2.6.6.2 Hora
2.6.6.3 Indicación de la hora
2.6.6.4 Representaciones de serie de los valores de fecha y hora

© Copyright IBM Corp. 1995, 1996


2.6.6 - 1
DB2/400 Manual de Consulta SQL V3R7
Fecha
2.6.6.1 Fecha

Una fecha es un valor que consta de tres partes (día, mes y año) que
designa un punto temporal del calendario gregoriano, el cual se supone en
vigor desde el año 1 d.C. (11) . El rango válido para los años está
comprendido entre 0001 y 9999. Los formatos de fecha *JUL, *MDY, *DMY e
*YMD sólo pueden representar fechas comprendidas en el rango que va de
1940 a 2039. El rango para los meses es de 1 a 12. El rango para los
días es de 1 a x, donde x es 28, 29, 30 ó 31, según el mes y el año.

La representación interna de una fecha es una serie de 4 bytes que


contiene un entero. El entero (llamado número Scaliger) representa la
fecha.

La longitud de una columna DATE, tal como se describe en la SQLDA, es de


6, 8 ó 10 bytes, según el formato utilizado. Estas longitudes son las
adecuadas para representar el valor con una serie de caracteres.

(11) Tenga presente que las fechas históricas no siempre se


corresponden con el calendario gregoriano. Las fechas entre
el 04-10-1582 y el 15-10-1582 se consideran válidas, si bien
nunca han existido en el calendario Gregoriano.

© Copyright IBM Corp. 1995, 1996


2.6.6.1 - 1
DB2/400 Manual de Consulta SQL V3R7
Hora
2.6.6.2 Hora

Una hora es un valor que consta de tres partes (hora, minutos y segundos)
que designa una hora del día utilizando un formato horario de 24 horas.
El rango de las horas está comprendido entre 0 y 24, mientras que el de
los minutos y segundos es de 0 a 59. Si la hora es 24, las
especificaciones de minutos y segundos son cero.

La representación interna de una hora es una serie de 3 bytes. Cada byte


consta de dos dígitos decimales empaquetados. El primer byte representa
las horas, el segundo los minutos y el tercero y último los segundos.

La longitud de una columna TIME, tal como se describe en la SQLDA, es de 8


bytes, que es la longitud adecuada para representar el valor con una serie
de caracteres.

© Copyright IBM Corp. 1995, 1996


2.6.6.2 - 1
DB2/400 Manual de Consulta SQL V3R7
Indicación de la hora
2.6.6.3 Indicación de la hora

Una indicación de la hora es un valor que consta de siete partes (día,


mes, año, hora, minutos, segundos y microsegundos) que designa a una fecha
y hora tal como se ha descrito anteriormente; la única excepción es que la
hora incluye la especificación fraccionaria de microsegundos.

La representación interna de una indicación de la hora es una serie de 10


bytes. Los 4 primeros bytes representan la fecha, los 3 siguientes la
hora y los 3 últimos los microsegundos (los tres últimos bytes contienen 6
dígitos empaquetados).

La longitud de una columna TIMESTAMP, tal como se describe en la SQLDA es


de 26 bytes, que es la longitud adecuada para representar el valor con una
serie de caracteres.

© Copyright IBM Corp. 1995, 1996


2.6.6.3 - 1
DB2/400 Manual de Consulta SQL V3R7
Representaciones de serie de los valores de fecha y hora
2.6.6.4 Representaciones de serie de los valores de fecha y hora

Los valores cuyo tipo de datos son DATE, TIME, o TIMESTAMP se representan
en una forma interna transparente para el usuario de SQL. Sin embargo,
las fechas, horas e indicaciones de la hora también se pueden representar
mediante series de caracteres. Estas representaciones conciernen
directamente al usuario de SQL ya que no existen constantes ni variables
cuyos tipos de datos sean DATE, TIME o TIMESTAMP. Por tanto, para
poderlos recuperar, los valores de fecha y hora deberán estar asignados a
una variable de serie de caracteres, excepto en ILE RPG/400. ILE RPG/400
da soporte a los tipos de datos de fecha y hora. El formato de la serie
resultante dependerá de los parámetros formato de fecha (DATFMT),
separador de fecha (DATSEP), formato de hora (TIMFMT) y separador de hora
(TIMSEP), vigentes durante la preparación de la sentencia.

Cuando se utiliza una representación de serie válida para un valor de


fecha y hora en una operación con valor interno de fecha y hora, la
representación de la serie se convierte al formato interno de la fecha,
hora o indicación de la hora antes de llevarse a cabo la operación. Si el
CCSID de la serie representa un esquema de codificación foráneo (por
ejemplo ASCII), primero se convierte al juego de caracteres codificados
que se identifica mediante el CCSID por omisión antes de que la serie se
convierta al formato interno del valor de fecha y hora.

En los apartados siguientes se definen las representaciones de serie


válidas para los valores de fecha y hora.

Series de fecha: Una representación de serie de una fecha es una serie de


caracteres que empieza con un dígito y tiene una longitud mínima de 6
caracteres. Dicha serie puede incluir blancos finales. Se pueden omitir
los ceros iniciales de las partes del mes y el día cuando se utilizan los
formatos estándar SQL de IBM. Cada formato estándar SQL de IBM está
identificado por su nombre e incluye una abreviatura asociada (para su
utilización en la función CHAR). Los demás formatos carecen de dicha
abreviatura. Los separadores de los formatos de años de dos dígitos los
controla el parámetro de separador de fecha (DATSEP). En la Tabla 2 están
listados los formatos de serie válidos para fechas.

El gestor de bases de datos reconocerá como fecha a una serie cuando ésta
tenga:

 El formato especificado por los parámetros de formato de fecha


(DATFMT) y de separador de fecha (DATSEP),
 Uno de los formatos de fecha estándar SQL de IBM, o
 El formato juliano sin formatear

Los parámetros DATFMT y DATSEP se especifican en los mandatos CRTSQLxxx,


RUNSQLSTM y STRSQL. Para REXX, se especifican en la sentencia SET OPTION.

+------------------------------------------------------------------------+
¦ Tabla 2. Formatos para las representaciones de serie de las fechas ¦
+------------------------------------------------------------------------¦
¦ Nombre del formato ¦ Abreviatura ¦ Formato de ¦ Ejemplo ¦
¦ ¦ ¦ fecha ¦ ¦
+------------------------------+-------------+--------------+------------¦
¦ Organización Internacional ¦ ISO ¦ aaaa-mm-dd ¦ 1987-10-12 ¦
¦ de Estándares (*ISO) ¦ ¦ ¦ ¦
+------------------------------+-------------+--------------+------------¦
¦ Estándar estadounidense de ¦ USA ¦ mm/dd/aaaa ¦ 10/12/1987 ¦
¦ IBM (*USA) ¦ ¦ ¦ ¦
+------------------------------+-------------+--------------+------------¦
¦ Estándar europeo de IBM ¦ EUR ¦ dd.mm.aaaa ¦ 12.10.1987 ¦
¦ (*EUR) ¦ ¦ ¦ ¦
+------------------------------+-------------+--------------+------------¦
¦ Estándar industrial japonés, ¦ JIS ¦ aaaa-mm-dd ¦ 1987-10-12 ¦
¦ era Cristiana (*JIS) ¦ ¦ ¦ ¦
+------------------------------+-------------+--------------+------------¦
¦ Juliano sin formatear ¦ - ¦ aaaaddd ¦ 1987285 ¦
+------------------------------+-------------+--------------+------------¦
¦ Juliano (*JUL) ¦ - ¦ aa/ddd ¦ 87/285 ¦
+------------------------------+-------------+--------------+------------¦
¦ Mes, día, año (*MDY) ¦ - ¦ mm/dd/aa ¦ 10/12/87 ¦
+------------------------------+-------------+--------------+------------¦
¦ Día, mes, año (*DMY) ¦ - ¦ dd/mm/aa ¦ 12/10/87 ¦
+------------------------------+-------------+--------------+------------¦
¦ Año, mes, día (*YMD) ¦ - ¦ aa/mm/dd ¦ 87/12/10 ¦
+------------------------------------------------------------------------+

Series de hora: Una representación de serie de una hora es una serie de


caracteres que empieza con un dígito y que tiene una longitud mínima de 4
caracteres. Pueden incluirse blancos iniciales; se puede omitir un cero
inicial en la parte de las horas y los segundos pueden omitirse por
completo. Si opta por omitir los segundos, se supone una especificación
implícita de 0 segundos. Así pues, 13.30 equivale a 13.30.00.

En la Tabla 3 están listados los formatos de serie válidos para la hora.


Cada formato estándar SQL de IBM está identificado por su nombre e incluye
una abreviatura asociada (para su utilización en la función CHAR). El
formato restante (*HMS) no tiene ninguna abreviatura que pueda utilizar la
función CHAR. El separador correspondiente al formato *HMS lo controla el
parámetro de separador de hora (TIMSEP).

El gestor de bases de datos reconocerá como hora a una serie cuando ésta
tenga:

© Copyright IBM Corp. 1995, 1996


2.6.6.4 - 1
DB2/400 Manual de Consulta SQL V3R7
Representaciones de serie de los valores de fecha y hora
 El formato especificado por los parámetros de formato de hora (TIMFMT)
y de separador de hora (TIMSEP), o
 Uno de los formatos de hora estándar SQL de IBM

Los parámetros TIMFMT y TIMSEP se especifican en los mandatos CRTSQLxxx,


RUNSQLSTM y STRSQL. Para REXX, se especifican en la sentencia SET OPTION.

+------------------------------------------------------------------------+
¦ Tabla 3. Formatos para las representaciones de serie de la hora ¦
+------------------------------------------------------------------------¦
¦ Nombre del formato ¦ Abreviatura ¦ Formato de ¦ Ejemplo ¦
¦ ¦ ¦ hora ¦ ¦
+------------------------------+-------------+--------------+------------¦
¦ Organización Internacional ¦ ISO ¦ hh.mm.ss ¦ 13.30.05 ¦
¦ de Estándares (*ISO) ¦ ¦ (12) ¦ ¦
+------------------------------+-------------+--------------+------------¦
¦ Estándar estadounidense de ¦ USA ¦ hh:mm AM o ¦ 1:30 PM ¦
¦ IBM (*USA) ¦ ¦ PM ¦ ¦
+------------------------------+-------------+--------------+------------¦
¦ Estándar europeo de IBM ¦ EUR ¦ hh.mm.ss ¦ 13.30.05 ¦
¦ (*EUR) ¦ ¦ ¦ ¦
+------------------------------+-------------+--------------+------------¦
¦ Estándar industrial japonés, ¦ JIS ¦ hh:mm:ss ¦ 13:30:05 ¦
¦ era Cristiana (*JIS) ¦ ¦ ¦ ¦
+------------------------------+-------------+--------------+------------¦
¦ Horas, minutos, segundos ¦ - ¦ hh:mm:ss ¦ 13:30:05 ¦
¦ (*HMS) ¦ ¦ ¦ ¦
+------------------------------------------------------------------------+

En el formato de hora USA, las horas no deben ser mayores que 12 y no


pueden ser 0 excepto en un caso especial, 00:00 AM. Si se utiliza un
reloj de 24 horas, la correspondencia entre éste y el formato USA es la
siguiente:

Formato USA Reloj de 24 horas

12:01 AM hasta 12:59 AM 00.01.00 hasta 00.59.00

01:00 AM hasta 11:59 AM 01.00.00 hasta 11.59.00

12:00 PM (mediodía) hasta 11:59 PM 12.00.00 hasta 23.59.00

12:00 AM (medianoche) 24.00.00

00:00 AM (medianoche) 00.00.00

En el formato USA existe un carácter de espacio entre la parte de los


minutos de la hora del día y las siglas AM o PM.

Series de indicación de la hora: Una representación de serie de una


indicación de la hora es una serie de caracteres que empieza por un dígito
y que tiene una longitud de al menos 16 caracteres. La representación de
serie completa de una indicación de la hora tiene la forma
aaaa-mm-dd-hh.mm.ss.nnnnnn o aaaammddhhmmss. Dicha serie puede incluir
blancos finales. Se pueden omitir los ceros iniciales en la parte del
mes, día y hora de la indicación de la hora si se utiliza el formato de
indicación de la hora con separadores. Los ceros finales se pueden
truncar u omitir totalmente de los microsegundos. Si decide omitir
cualquier dígito de la parte de los microsegundos, se entenderá como una
especificación implícita de 0. Así pues, 1990-3-2-8.30.00.10 equivale a
1990-03-02-08.30.00.100000.

También se aceptan las indicaciones de la hora del tipo 24.00.00.000000.

(12) Se trata de una versión anterior del formato ISO. Se puede


utilizar JIS para obtener el formato ISO actual.

© Copyright IBM Corp. 1995, 1996


2.6.6.4 - 2
DB2/400 Manual de Consulta SQL V3R7
Asignaciones y comparaciones
2.7 Asignaciones y comparaciones

Las operaciones básicas de SQL son asignación y comparación. Las


operaciones de asignación se realizan durante la ejecución de las
sentencias CALL, INSERT, UPDATE, FETCH y SELECT INTO. Las operaciones de
comparación se realizan durante la ejecución de sentencias que incluyan
predicados y otros elementos del lenguaje, tales como MAX, MIN, DISTINCT,
GROUP BY y ORDER BY.

La regla básica de ambas operaciones es que el tipo de datos de los


operandos que intervienen debe ser compatible. La regla de compatibilidad
también rige para UNION, concatenación y las funciones escalares CONCAT,
VALUE, COALESCE, IFNULL, MIN y MAX. La matriz de compatibilidad es la
siguiente:

+---------------------------------------------------------------------------------------------------------------------------+
¦ ¦ Entero ¦ Número ¦ ¦ Serie de ¦ Serie ¦ ¦ ¦ Indicación ¦
¦ Operandos ¦ binario ¦ decimal** ¦ Coma flotante ¦ caracteres ¦ gráfica ¦ Fecha ¦ Hora ¦ de la hora ¦
+-----------------+-----------+-----------+-----------------+------------+-----------+-----------+------------+-------------¦
¦ Entero binario ¦ Sí ¦ Sí ¦ Sí ¦ No ¦ No ¦ No ¦ No ¦ No ¦
+-----------------+-----------+-----------+-----------------+------------+-----------+-----------+------------+-------------¦
¦ Número decimal ¦ Sí ¦ Sí ¦ Sí ¦ No ¦ No ¦ No ¦ No ¦ No ¦
+-----------------+-----------+-----------+-----------------+------------+-----------+-----------+------------+-------------¦
¦ Coma flotante ¦ Sí ¦ Sí ¦ Sí ¦ No ¦ No ¦ No ¦ No ¦ No ¦
+-----------------+-----------+-----------+-----------------+------------+-----------+-----------+------------+-------------¦
¦ Serie de ¦ No ¦ No ¦ No ¦ Sí ¦ No ¦ * ¦ * ¦ * ¦
¦ caracteres ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
+-----------------+-----------+-----------+-----------------+------------+-----------+-----------+------------+-------------¦
¦ Serie gráfica ¦ No ¦ No ¦ No ¦ No ¦ Sí ¦ No ¦ No ¦ No ¦
+-----------------+-----------+-----------+-----------------+------------+-----------+-----------+------------+-------------¦
¦ Fecha ¦ No ¦ No ¦ No ¦ * ¦ No ¦ Sí ¦ No ¦ No ¦
+-----------------+-----------+-----------+-----------------+------------+-----------+-----------+------------+-------------¦
¦ Hora ¦ No ¦ No ¦ No ¦ * ¦ No ¦ No ¦ Sí ¦ No ¦
+-----------------+-----------+-----------+-----------------+------------+-----------+-----------+------------+-------------¦
¦ Indicación de ¦ No ¦ No ¦ No ¦ * ¦ No ¦ No ¦ No ¦ Sí ¦
¦ la hora ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
+---------------------------------------------------------------------------------------------------------------------------¦
|¦ Notas: ¦
¦ ¦
|¦  Los valores de fecha y hora se pueden asignar a columnas y variables de series de caracteres, tal y como se explica ¦
|¦ en el apartado "Asignaciones de fecha y hora" en el tema 2.7.4. ¦
¦ ¦
|¦  Una representación de serie válida de una fecha se puede asignar a una columna de fecha, compararse con una fecha o ¦
|¦ utilizarse en una función escalar VALUE, COALESCE, IFNULL, MIN o MAX con una fecha. ¦
¦ ¦
|¦  Una representación de serie válida de una hora se puede asignar a una columna de hora, compararse con una hora o ¦
|¦ utilizarse en una función escalar VALUE, COALESCE, IFNULL, MIN o MAX con una hora. ¦
¦ ¦
|¦  Una representación de serie válida de una indicación de la hora se puede asignar a una columna de indicación de la ¦
|¦ hora, compararse con una indicación de la hora o utilizarse en una función escalar VALUE, COALESCE, IFNULL, MIN o MAX ¦
|¦ con una indicación de la hora. ¦
¦ ¦
¦ * La compatibilidad de los valores de fecha y hora con las series de caracteres está limitada a las operaciones de ¦
¦ asignación y comparación, y a las funciones escalares VALUE, COALESCE, IFNULL, MIN y MAX. ¦
¦ ¦
¦ ** Decimal se refiere tanto a los decimales empaquetados como a los decimales con zona. ¦
+---------------------------------------------------------------------------------------------------------------------------+

Una regla básica para las operaciones de asignación es que un valor nulo
no puede asignarse a una columna que no pueda contener valores nulos ni a
una variable del lenguaje principal que no tenga una variable de indicador
asociada. Véase el apartado "Referencias a variables del lenguaje
principal" en el tema 2.11 para obtener información sobre las variables de
indicador.

Subtemas
2.7.1 Asignaciones numéricas
2.7.2 Asignaciones de serie
2.7.3 Reglas de conversión para asignaciones
2.7.4 Asignaciones de fecha y hora
2.7.5 Comparaciones numéricas
2.7.6 Comparaciones de serie
2.7.7 Reglas de conversión para comparación
2.7.8 Comparaciones de fecha y hora

© Copyright IBM Corp. 1995, 1996


2.7 - 1
DB2/400 Manual de Consulta SQL V3R7
Asignaciones numéricas
2.7.1 Asignaciones numéricas

La regla básica de las asignaciones numéricas es que la parte entera de un


número decimal o entero no puede truncarse. Si es necesario, se trunca la
parte fraccionaria de los números decimales. En el caso de la asignación
a una variable del lenguaje principal, puede devolverse un valor positivo
en el SQLCODE.

Se producirá un error si:

 El truncamiento de la parte entera del número se produce en la


asignación a una columna.
 El truncamiento de la parte entera del número se produce en la
asignación a una variable del lenguaje principal que no tenga ninguna
variable de indicador

Se producirá un aviso si:

El truncamiento de la parte entera del número se produce en la


asignación a una variable del lenguaje principal con una variable de
indicador. En este caso, el número no se asigna a la variable del
lenguaje principal y la variable de indicador se establece en 2
negativo.

Nota: Decimal se refiere tanto a los decimales empaquetados como a los


decimales con zona.

|Nota: Al tomar datos decimales de un archivo que no se creó mediante una


|sentencia CREATE TABLE de SQL, un campo decimal puede contener datos no
|válidos. En este caso se devolverán y se almacenarán los datos, sin que
|se emita ningún mensaje de aviso o error. Una tabla creada por la
|sentencia CREATE TABLE de SQL no permite datos decimales no válidos.

Subtemas
2.7.1.1 De decimal o entero a coma flotante
2.7.1.2 De coma flotante o decimal a entero
2.7.1.3 De decimal a decimal
2.7.1.4 De entero a decimal
2.7.1.5 De coma flotante a decimal
2.7.1.6 A enteros COBOL y RPG

© Copyright IBM Corp. 1995, 1996


2.7.1 - 1
DB2/400 Manual de Consulta SQL V3R7
De decimal o entero a coma flotante
2.7.1.1 De decimal o entero a coma flotante

Los números con coma flotante son aproximaciones de números reales. De


aquí que, cuando un número decimal o entero se asigna a una columna o a
una variable de coma flotante, el resultado puede ser diferente del número
original.

La aproximación es más precisa si la columna o variable receptoras están


definidas como de precisión doble (64 bits) en lugar de precisión simple
(32 bits).

© Copyright IBM Corp. 1995, 1996


2.7.1.1 - 1
DB2/400 Manual de Consulta SQL V3R7
De coma flotante o decimal a entero
2.7.1.2 De coma flotante o decimal a entero

Cuando un número decimal o de coma flotante se asigna a una columna o


variable de enteros binarios, el número se convierte, si es necesario, a
la precisión y escala del elemento destino. Si la escala del elemento
destino es cero, la parte fraccionaria del número se perderá. Se añadirá
o eliminará el número necesario de ceros iniciales y, en la parte
fraccionaria del número, se añadirán los ceros finales que sean necesarios
o bien se eliminará el número necesario de dígitos finales.

© Copyright IBM Corp. 1995, 1996


2.7.1.2 - 1
DB2/400 Manual de Consulta SQL V3R7
De decimal a decimal
2.7.1.3 De decimal a decimal

Cuando se asigna un número decimal a una columna o variable decimal, el


número se convierte, si es necesario, a la precisión y escala del elemento
destino. Se añadirá o eliminará el número necesario de ceros iniciales y,
en la parte fraccionaria del número, se añadirán los ceros finales que
sean necesarios o bien se eliminará el número necesario de dígitos
finales.

© Copyright IBM Corp. 1995, 1996


2.7.1.3 - 1
DB2/400 Manual de Consulta SQL V3R7
De entero a decimal
2.7.1.4 De entero a decimal

Cuando se asigna un entero a una columna o variable decimal, el número se


convierte primero a un número decimal temporal y a continuación, si es
necesario, a la precisión y escala del elemento destino. Si la escala del
entero es cero, la precisión del número decimal temporal es 5.0 para un
entero pequeño o 11.0 para un entero grande.

© Copyright IBM Corp. 1995, 1996


2.7.1.4 - 1
DB2/400 Manual de Consulta SQL V3R7
De coma flotante a decimal
2.7.1.5 De coma flotante a decimal

Cuando se asigna un número de coma flotante a una columna o variable


decimal, primero se convierte el número a un número decimal temporal de
precisión 31 y, a continuación, si es necesario, se trunca a la precisión
y la escala del elemento destino. En esta conversión, el número se
redondea (utilizando la aritmética de coma flotante) a una precisión de 31
dígitos decimales. Como resultado, los números menores de 0,5*10(+31) se
reducen a 0. La escala recibe el mayor valor posible que permita la
representación de la parte entera del número sin pérdida de significado.

© Copyright IBM Corp. 1995, 1996


2.7.1.5 - 1
DB2/400 Manual de Consulta SQL V3R7
A enteros COBOL y RPG
2.7.1.6 A enteros COBOL y RPG

La asignación a variables del lenguaje principal de entero COBOL y RPG


toma en consideración cualquier escala especificada para la variable del
lenguaje principal. Sin embargo, las variables del lenguaje principal
utilizarán el tamaño completo del entero. Por tanto, el valor colocado en
el dato COBOL o el campo RPG puede ser mayor que la precisión máxima
especificada para la variable del lenguaje principal.

En COBOL, por ejemplo, si COL1 contiene un valor de 12345, las sentencias:

01 A PIC S9999 BINARY.


EXEC SQL SELECT COL1
INTO :A
FROM TABLAX
END+EXEC.

tienen como resultado que el valor 12345 se sitúe en A, aunque A se haya


definido con sólo 4 dígitos.

Observe que la sentencia COBOL siguiente:

MOVE 12345 TO A.

da como resultado que se coloque 2345 en A.

© Copyright IBM Corp. 1995, 1996


2.7.1.6 - 1
DB2/400 Manual de Consulta SQL V3R7
Asignaciones de serie
2.7.2 Asignaciones de serie

La regla básica para las asignaciones de series es que la longitud de una


serie asignada a una columna no debe ser superior al atributo de longitud
de la columna. (Los blancos de cola se suelen incluir en la longitud de
la serie. No obstante, para asignaciones de serie los blancos de cola no
se incluyen en la longitud de la serie).

Cuando se asigna una serie a una columna o variable del lenguaje principal
de serie de longitud fija y la longitud de la serie es menor que el
atributo de longitud del elemento destino, se rellena la serie por la
derecha con el número de blancos de un sólo byte, doble byte o UCS-2
necesarios. (13) El carácter de relleno siempre es un blanco, incluso para
datos de bits.

Cuando se asigna una serie de longitud n a una variable C de serie de


caracteres terminada en NUL con una longitud mayor que n+1:

 Si se ha especificado la opción *CNULRQD en el mandato CRTSQLCI, se


rellena la serie por la derecha con x-n-1 blancos, donde x es la
longitud de la variable. La serie rellena se asigna entonces a la
variable y el terminador NUL se coloca en la siguiente posición de
carácter.
 Si se ha especificado la opción de precompilador *NOCNULRQD en el
mandato CRTSQLCI, no se rellena la serie por la derecha. La serie se
asigna a la variable y el terminador NUL se coloca en la siguiente
posición de carácter.

Cuando se asigna una serie de longitud n a una variable de serie de


longitud variable con una longitud máxima mayor que n, los caracteres que
siguen al carácter enésimo de la variable son indefinidos.

Cuando se asigna una serie a una variable y la serie es más larga que el
atributo de longitud de la variable, se trunca la serie por la derecha y
se elimina el número de caracteres que sea necesario. Cuando esto sucede,
se asigna el valor 'W' al campo SQLWARN1 de la SQLCA. Además de esto, si
se da una variable de indicador, ésta queda establecida con la longitud
original de la serie. Si sólo se trunca el terminador NUL para una
variable del lenguaje principal C terminada en NUL y se ha especificado la
opción *NOCNULRQD en el mandato CRTSQLCI, se asigna el valor de 'N' al
campo SQLWARN1 de la SQLCA y no se coloca ningún NUL en la variable.

Cuando se asigna una serie a una columna y la serie es más larga que el
atributo de longitud de la columna, se devuelve un SQLCODE negativo.

Para obtener una descripción de la SQLCA, véase el Apéndice B, "Área de


comunicaciones SQL" en el tema B.0.

Las reglas anteriores se aplican cuando tanto el elemento origen como el


destino son series. Si interviene un tipo de datos de fecha y hora, véase
el apartado "Asignaciones de fecha y hora" en el tema 2.7.4.

Si la serie contiene datos mixtos, es posible que las reglas de asignación


requieran un truncamiento dentro de una secuencia de códigos de doble
byte. Para evitar la pérdida del carácter de desplazamiento a teclado
estándar que finaliza la secuencia de doble byte, es posible que se
trunquen más caracteres a partir del final de la serie y que se añada un
carácter de desplazamiento a teclado estándar. En el resultado truncado
hay siempre un número par de bytes entre cada carácter de desplazamiento a
teclado ideográfico y su carácter de desplazamiento a teclado estándar
emparejado.

Los tipos de datos carácter, sólo DBCS, DBCS abierto y DBCS cualquiera no
son compatibles con los tipos gráficos DBCS para asignación. Los tipos de
datos carácter, sólo DBCS, DBCS abierto, DBCS cualquiera y los tipos
gráficos DBCS son compatibles con columnas gráficas UCS-2 para asignación.

(13) UCS-2 define un carácter en blanco en el elemento de código


X'0020' y X'3000'. El gestor de bases de datos rellena con
el blanco en el elemento de código X'0020'.

© Copyright IBM Corp. 1995, 1996


2.7.2 - 1
DB2/400 Manual de Consulta SQL V3R7
Reglas de conversión para asignaciones
2.7.3 Reglas de conversión para asignaciones

Una serie asignada a una columna o variable del lenguaje principal se


convierte primero, si es necesario, al juego de caracteres codificados del
elemento destino. La conversión de caracteres sólo es necesaria si se
cumplen todas las condiciones siguientes:

 Los CCSID son diferentes.


 Ninguno de los CCSID es 65535.
 La serie no es nula ni está vacía.
 La tabla para la selección de conversiones CCSID indica que es
necesaria la conversión.

Se producirá un error si:

 Se utiliza la tabla para la selección de conversiones CCSID pero ésta


no contiene ninguna información sobre el par de CCSID.

 No puede convertirse un carácter de la serie y la operación es una


asignación a una columna o una asignación a una variable del lenguaje
principal sin una variable de indicador. Por ejemplo, un carácter de
doble byte (DBCS) no puede convertirse a una columna o variable del
lenguaje principal con un CCSID de caracteres de un solo byte (SBCS).

Se producirá un aviso si:

 Se convierte un carácter de la serie al carácter de sustitución.

 No puede convertirse un carácter de la serie y la operación es una


asignación a una variable del lenguaje principal con una variable de
indicador. Por ejemplo, un carácter DBCS no se puede convertir en una
variable del lenguaje principal con un CCSID de DBCS. En este caso,
la serie no se asigna a la variable del lenguaje principal y la
variable de indicador se establece en -2.

© Copyright IBM Corp. 1995, 1996


2.7.3 - 1
DB2/400 Manual de Consulta SQL V3R7
Asignaciones de fecha y hora
2.7.4 Asignaciones de fecha y hora

Un valor asignado a una columna DATE debe ser una fecha o una
representación de serie válida de una fecha. Una fecha sólo puede
asignarse a una columna DATE, una columna de serie de caracteres, una
variable de serie de caracteres o una variable de indicación de la hora
ILE RPG/400. Un valor asignado a una columna TIME debe ser una hora o una
representación de serie válida de una hora. Una hora sólo puede asignarse
a una columna TIME, una columna de serie de caracteres, una variable de
serie de caracteres o una variable de indicación de la hora ILE RPG/400.
Un valor asignado a una columna TIMESTAMP debe ser una indicación de la
hora o una representación de serie válida de una indicación de la hora.
Una indicación de la hora sólo puede asignarse a una columna TIMESTAMP,
una columna de serie de caracteres, una variable de serie de caracteres o
una variable de indicación de la hora ILE RPG/400.

Cuando se asigna un valor de fecha y hora a una variable o columna de


serie de caracteres, se convierte a su representación de serie. Los ceros
iniciales no se omiten de ninguna de las partes de la fecha, hora o
indicación de la hora. La longitud necesaria del elemento destino varia
según sea el formato de la representación de serie. Si la longitud del
elemento destino es mayor que la requerida, éste se rellena por la derecha
con blancos. Si la longitud del elemento destino es menor que la
necesaria, el resultado dependerá del tipo del valor de fecha y hora en
cuestión y del tipo de elemento destino.

 Si el elemento destino es una columna de serie de caracteres, no están


permitidos los truncamientos. Las reglas que rigen son las
siguientes:

DATE

El atributo de longitud de la columna debe ser 10 como mínimo si


el formato de fecha es *ISO, USA, *EUR o *JIS. Si el formato de
fecha es *YMD, *MDY o *DMY, el atributo de longitud de la columna
debe ser al menos 8. Si el formato de fecha es *JUL, la longitud
de la variable del lenguaje principal debe ser al menos 6.

TIME

El atributo de longitud de la columna deber ser al menos 8.

TIMESTAMP

El atributo de longitud de la columna deber al menos 26.

 Cuando el elemento destino es una variable del lenguaje principal, se


aplican las reglas siguientes:

DATE

La longitud de la variable del lenguaje principal debe ser al


menos 10 si el formato de fecha es *ISO, *USA, *EUR, or *JIS. Si
el formato de fecha es *YMD, *MDY o *DMY, la longitud de la
variable del lenguaje principal debe ser de al menos 8. Si el
formato de fecha es *JUL, la longitud de la variable del lenguaje
principal debe ser al menos 6.

TIME

- Si se utiliza el formato *USA, la longitud de la variable del


lenguaje principal no debe ser inferior a 8. Este formato no
incluye los segundos.

- Si se utilizan los formatos de hora *ISO, *EUR, *JIS o *HMS, la


longitud de la variable del lenguaje principal no debe ser
inferior a 5. Si la longitud es 5, 6 ó 7, la parte de la hora
correspondiente a los segundos se omite del resultado y SQLWARN1
se establece en 'W'. En este caso, la parte de la hora
correspondiente a los segundos se asigna a la variable de
indicador, si se da una, y, si la longitud es 6 ó 7, se rellena
con blancos de forma que el valor sea una representación de serie
válida de una hora.

TIMESTAMP

La longitud de la variable del lenguaje principal no debe ser


inferior a 19. Si la longitud está comprendida entre 19 y 25, la
indicación de la hora se trunca como si se tratara de una serie,
lo que provoca la omisión de uno o más dígitos de la parte de la
hora correspondiente a los microsegundos. Si la longitud es 20,
la coma decimal final se sustituye por un blanco a fin de que el
valor sea una representación de serie válida de una indicación de
la hora.

© Copyright IBM Corp. 1995, 1996


2.7.4 - 1
DB2/400 Manual de Consulta SQL V3R7
Comparaciones numéricas
2.7.5 Comparaciones numéricas

Los números se comparan de forma algebraica, es decir, teniendo en cuenta


el signo. 2 negativo, por ejemplo es menor que +1.

Si un número es un entero y el otro es un decimal, la comparación se


realiza con una copia temporal del entero, el cual se ha convertido a
decimal.

Cuando se comparan números decimales o binarios de escala no cero que


tengan escalas distintas, la comparación se realiza con una copia temporal
de uno de los números que se ha ampliado con ceros finales de forma que su
parte fraccionaria tenga el mismo número de dígitos que el otro número.

Si uno de los números es de coma flotante y el otro es un entero, decimal


o coma flotante de precisión simple, la comparación se efectúa con una
copia temporal del segundo número convertido a un número de coma flotante
de precisión doble. Sin embargo, si se compara un número de coma flotante
de precisión simple con una constante de coma flotante, la comparación se
realiza con un formato de precisión simple de la constante.

Dos números de coma flotante son iguales sólo si las configuraciones de


bit de sus formatos normalizados son idénticos.

© Copyright IBM Corp. 1995, 1996


2.7.5 - 1
DB2/400 Manual de Consulta SQL V3R7
Comparaciones de serie
2.7.6 Comparaciones de serie

Las comparaciones de series utilizan la secuencia de clasificación que


esté en vigor al ejecutar la sentencia para todos los datos SBCS y la
parte de un solo byte de los datos mixtos. Si la secuencia de
clasificación es *HEX, se comparan los bytes correspondientes de cada una
de las series. Para todas las demás secuencias de clasificación, se
comparan los bytes correspondiente del valor significativo de cada serie.
Si las series tienen longitudes diferentes, antes de realizar la
comparación se rellenará con blancos por la derecha a una copia temporal
de la serie más corta. Este relleno iguala la longitud de ambas series.
El carácter de relleno es siempre un blanco, independientemente de cual
sea la secuencia de clasificación. Para los datos de bit, el carácter de
relleno también es el blanco. Para los datos gráficos DBCS, el carácter
|de relleno es un blanco DBCS (x'4040'). Para los datos gráficos UCS-2, el
|carácter de relleno es un blanco UCS-2. (14)

Dos series son iguales si cualquiera de las siguientes condiciones es


cierta:

 Ambas series están vacías.


 Se utiliza la secuencia de clasificación *HEX y todos los bytes
correspondiente son iguales.
 Se utiliza una secuencia de clasificación que no sea *HEX y todos los
bytes correspondientes del valor significativo son iguales.

Una serie vacía es igual a una serie de blancos. La relación entre dos
series desiguales viene determinada por una comparación del primer par de
bytes desiguales (o bytes del valor significativo) a partir del extremo
izquierdo de la serie. Esta comparación se realiza de acuerdo con la
secuencia de clasificación en vigor al ejecutar la sentencia.

Dos series de longitud variable con longitudes distintas son iguales si


tan sólo difieren en el número de blancos finales. En aquellas
operaciones que seleccionen un valor de un conjunto de valores, el valor
seleccionado es arbitrario. Las operaciones que pueden conllevar tal
selección arbitraria son DISTINCT, MAX, MIN, UNION y las referencias a una
columna de agrupación. Consulte la descripción de GROUP BY para obtener
más información sobre la selección arbitraria que interviene en las
referencias a una columna de agrupación.

Carácter, sólo DBCS, DBCS abierto y DBCS cualquiera no son compatibles con
los tipos gráficos para comparación. DBCS gráfico y UCS-2 gráfico no son
tipos compatibles para la comparación. Para comparar series gráficas, se
comparan los bytes correspondientes de cada serie.

| (14) UCS-2 define un carácter en blanco en el elemento de código


| X'0020' y X'3000'. El gestor de bases de datos rellena con
| el blanco en el elemento de código X'0020'.

© Copyright IBM Corp. 1995, 1996


2.7.6 - 1
DB2/400 Manual de Consulta SQL V3R7
Reglas de conversión para comparación
2.7.7 Reglas de conversión para comparación

Cuando se comparan dos series, primero se convierte, si es necesario, una


de ellas al juego de caracteres codificados de la otra. La conversión de
caracteres sólo es necesaria si se cumplen todas las condiciones
siguientes:

 Los CCSID de ambas series son diferentes.


 Ninguno de los CCSID es 65535.
 La serie seleccionada para la conversión no es nula ni está vacía.
 La tabla para la selección de conversiones CCSID indica que es
necesaria la conversión.

Si se comparan una serie SBCS y una serie mixta y los operandos son del
mismo tipo, todas las conversiones necesarias se aplicarán a la serie
SBCS. De lo contrario, la serie seleccionada para la conversión depende
del tipo de cada operando. La tabla siguiente muestra, dados los tipos de
operandos, qué operando se selecciona para la conversión.

+------------------------------------------------------------------------+
¦ Tabla 4. Selección del operando para la conversión de caracteres ¦
+------------------------------------------------------------------------¦
¦ ¦ Segundo operando ¦
¦ +------------------------------------------------------¦
¦ ¦ ¦ ¦ ¦ ¦ Variable ¦
¦ ¦ Valor de ¦ Valor ¦ Registro ¦ ¦ lenguaje ¦
¦ Primer operando ¦ columna ¦ derivado ¦ especial ¦ Constante¦ principal¦
+-----------------+----------+----------+----------+----------+----------¦
¦ Valor de ¦ Segundo ¦ Segundo ¦ Segundo ¦ Segundo ¦ Segundo ¦
¦ columna ¦ ¦ ¦ ¦ ¦ ¦
+-----------------+----------+----------+----------+----------+----------¦
¦ Valor derivado ¦ Primero ¦ Segundo ¦ Segundo ¦ Segundo ¦ Segundo ¦
+-----------------+----------+----------+----------+----------+----------¦
¦ Registro ¦ Primero ¦ Primero ¦ Segundo ¦ Segundo ¦ Segundo ¦
¦ especial ¦ ¦ ¦ ¦ ¦ ¦
+-----------------+----------+----------+----------+----------+----------¦
¦ Constante ¦ Primero ¦ Primero ¦ Primero ¦ Segundo ¦ Segundo ¦
+-----------------+----------+----------+----------+----------+----------¦
¦ Variable ¦ Primero ¦ Primero ¦ Primero ¦ Primero ¦ Segundo ¦
¦ lenguaje ¦ ¦ ¦ ¦ ¦ ¦
¦ principal ¦ ¦ ¦ ¦ ¦ ¦
+------------------------------------------------------------------------+

Una variable del lenguaje principal que contenga datos en un esquema de


codificación foráneo se convierte siempre de forma efectiva al esquema de
codificación nativo antes de utilizarse en una operación. Las reglas
anteriores se basan en la suposición de que esta conversión ya se ha
realizado.

Se producirá un error si no se puede convertir algún carácter de la serie


o si se utiliza la tabla para la selección de conversiones CCSID pero ésta
no contiene información sobre el par de CCSID. Se producirá un aviso si
un carácter de la serie se convierte al carácter de sustitución.

© Copyright IBM Corp. 1995, 1996


2.7.7 - 1
DB2/400 Manual de Consulta SQL V3R7
Comparaciones de fecha y hora
2.7.8 Comparaciones de fecha y hora

Un valor DATE, TIME o TIMESTAMP puede compararse con otro valor del mismo
tipo de datos o con una representación de serie de ese tipo de datos.
Todas las comparaciones son cronológicas, lo que significa que cuanto más
alejada esté una fecha del día 1 de enero del año 0001, mayor será el
valor de esa fecha.

Las comparaciones entre valores de hora (TIME) y representaciones de serie


de valores de hora siempre incluyen los segundos. Si la representación de
serie omite los segundos, se da por supuesto que la parte correspondiente
a los segundos es igual a cero.

Las comparaciones entre valores de indicación de la hora (TIMESTAMP) son


cronológicas sin tener en cuenta las representaciones que podrían
considerarse equivalentes. Así, el siguiente predicado es cierto:

TIMESTAMP('1990-02-23-00.00.00') > '1990-02-22-24.00.00'

© Copyright IBM Corp. 1995, 1996


2.7.8 - 1
DB2/400 Manual de Consulta SQL V3R7
Constantes
2.8 Constantes

Una constante (a veces llamada literal) especifica un valor. Las


constantes se clasifican como constantes de tipo serie o constantes
numéricas. Las constantes de serie se clasifican a su vez como de
caracteres o gráficas. Las constantes numéricas se clasifican a su vez en
constantes de entero, de coma flotante o decimales.

Todas las constantes tienen el atributo NOT NULL. Si una constante


numérica con un valor cero tiene un signo negativo, dicho signo no se
tiene en cuenta.

Subtemas
2.8.1 Constantes de enteros
2.8.2 Constantes de coma flotante
2.8.3 Constantes decimales
2.8.4 Constantes de serie de caracteres
2.8.5 Constantes de serie gráfica
2.8.6 Coma decimal
2.8.7 Delimitadores

© Copyright IBM Corp. 1995, 1996


2.8 - 1
DB2/400 Manual de Consulta SQL V3R7
Constantes de enteros
2.8.1 Constantes de enteros

Una constante de enteros especifica un entero como un número con o sin


signo, con un máximo de 10 dígitos y que no incluye ninguna coma decimal.
El tipo de datos de una constante de enteros es entero grande y su valor
debe estar dentro del rango de un entero grande.

En los diagramas de sintaxis, el término entero se utiliza para una


constante de enteros que no debe incluir ningún signo.

Subtemas
2.8.1.1 Ejemplos

© Copyright IBM Corp. 1995, 1996


2.8.1 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplos
2.8.1.1 Ejemplos
64 -15 +100 32767 720176

© Copyright IBM Corp. 1995, 1996


2.8.1.1 - 1
DB2/400 Manual de Consulta SQL V3R7
Constantes de coma flotante
2.8.2 Constantes de coma flotante

Una constante de coma flotante especifica un número de coma flotante de


precisión doble como dos números separados por una E. El primer número
puede incluir un signo y una coma decimal; el segundo puede incluir un
signo pero no una coma decimal. El valor de la constante es el producto
del primero número y la potencia de 10 especificada por el segundo número;
debe estar dentro del rango de los números de coma flotante. El número de
caracteres de la constante no debe sobrepasar los 24. Sin contar los
ceros iniciales, el número de dígitos del primer número no debe pasar de
17 y el número de dígitos del segundo no debe pasar de 3.

Subtemas
2.8.2.1 Ejemplos

© Copyright IBM Corp. 1995, 1996


2.8.2 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplos
2.8.2.1 Ejemplos
15E1 2.E5 2.2E-1 +5.E+2

© Copyright IBM Corp. 1995, 1996


2.8.2.1 - 1
DB2/400 Manual de Consulta SQL V3R7
Constantes decimales
2.8.3 Constantes decimales

Una constante decimal especifica un número decimal como un número con o


sin signo que tiene como máximo 31 dígitos. La constante debe:

 Incluir una coma decimal o bien

 Ser mayor que 2147483647 o inferior a -2147483647

La precisión es el número total de dígitos (incluyendo los ceros iniciales


y finales); la escala es el número de dígitos situados a la derecha de la
coma decimal (incluyendo los ceros finales).

Subtemas
2.8.3.1 Ejemplos

© Copyright IBM Corp. 1995, 1996


2.8.3 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplos
2.8.3.1 Ejemplos
25.5 1000. -15. +37589.3333333333 12345678901

© Copyright IBM Corp. 1995, 1996


2.8.3.1 - 1
DB2/400 Manual de Consulta SQL V3R7
Constantes de serie de caracteres
2.8.4 Constantes de serie de caracteres

Una constante de serie de caracteres especifica una serie de caracteres de


longitud variable. Las dos formas de constante de serie de caracteres son
las siguientes:

 Una secuencia de caracteres que empieza y termina con un delimitador


de serie. El número de bytes comprendidos entre los delimitadores de
serie no puede ser superior a 32740. Para representar a un
delimitador de serie dentro de la serie de caracteres, se utilizan dos
delimitadores de serie consecutivos. Dos delimitadores de serie
consecutivos que no están contenidos dentro de una serie representan a
la serie vacía.

 Una X seguida de una secuencia de caracteres que empieza y termina con


un delimitador de serie. Los caracteres comprendidos entre los
delimitadores de serie deben ser un número par de dígitos
hexadecimales. Este número de dígitos hexadecimales no debe pasar de
32740. Un dígito hexadecimal es un dígito o una letra comprendida
entre la A y la F (en mayúsculas o en minúsculas). Siguiendo los
convenios de la notación hexadecimal, cada par de dígitos
hexadecimales representa un carácter. Esta forma de constante de
serie permite especificar caracteres que no tengan representación en
el teclado.

Las constantes de serie de caracteres pueden contener datos mixtos. Si el


CCSID del trabajo da soporte a los datos mixtos, una constante de serie de
caracteres se clasifica como datos mixtos siempre que incluya una subserie
DBCS. En todos los demás casos, las constantes de serie de caracteres se
clasifican como datos SBCS.

El CCSID asignado a la constante es el CCSID del elemento origen que


contiene la constante a menos que dicho elemento origen esté codificado en
un esquema de codificación foráneo (como por ejemplo, ASCII). Los datos
de la variable del lenguaje principal se convierten del esquema de
codificación foráneo al CCSID por omisión del servidor actual. En este
caso, el CCSID asignado a la constante es el CCSID por omisión del
servidor actual.

El CCSID del elemento origen viene determinado por el peticionario de la


aplicación. El CCSID del elemento origen es:

 Para STRSQL, el CCSID por omisión del peticionario de la aplicación


 Para los mandatos RUNSQLSTM o STRREXPRC, el CCSID del archivo fuente
especificado
 Para CRTSQLxxx,
- Para SQL estático, el CCSID del elemento origen es el CCSID del
archivo fuente utilizado en el mandato CRTSQLxxx.
- Para SQL dinámico, el CCSID del elemento origen es el CCSID de la
variable del lenguaje principal especificada en la sentencia
PREPARE o, si se ha especificado una constante de serie en la
sentencia PREPARE, el CCSID por omisión del servidor actual.

Subtemas
2.8.4.1 Ejemplos

© Copyright IBM Corp. 1995, 1996


2.8.4 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplos
2.8.4.1 Ejemplos

'Marga' '14.12.1990' '32' 'NO CAMBIAR' '' X'FFFF'

© Copyright IBM Corp. 1995, 1996


2.8.4.1 - 1
DB2/400 Manual de Consulta SQL V3R7
Constantes de serie gráfica
2.8.5 Constantes de serie gráfica

Subtemas
2.8.5.1 Constantes de serie gráfica DBCS
2.8.5.2 Constantes de serie gráfica UCS-2

© Copyright IBM Corp. 1995, 1996


2.8.5 - 1
DB2/400 Manual de Consulta SQL V3R7
Constantes de serie gráfica DBCS
2.8.5.1 Constantes de serie gráfica DBCS

Una constante de serie gráfica es una serie gráfica de longitud variable.


La longitud de la serie especificada no puede ser superior a 16370. Los
tres formatos de las constantes de serie gráfica DBCS son:

En el formato normal, los delimitadores SQL y la G o la N son caracteres


SBCS. El ' SBCS es el apóstrofo EBCDIC, X'7D'.

En el formato PL/I, los apóstrofos y la G son caracteres DBCS. Para


representar a un delimitador de serie dentro de la serie de, se utilizan
dos delimitadores de serie DBCS consecutivos. Tenga presente que este
formato PL/I sólo es válido para sentencias estáticas hospedadas en
programas escritos en PL/I.

También se da soporte a las contantes gráficas DBCS hexadecimales. El


formato de la constante gráfica DBCS hexadecimal es:

GX'ssss'

En la constante, ssss representa una serie de 0 a 32766 dígitos


hexadecimales. El número de caracteres comprendidos entre los
delimitadores de serie debe ser un número par múltiplo de 4. Cada grupo
de 4 dígitos representa un solo carácter gráfico DBCS. Los caracteres
hexadecimales para desplazamiento a teclado ideográfico y estándar ('0E'X
y '0F'X) no se incluyen en la serie.

El CCSID asignado a la constante es el CCSID DBCS asociado con el CCSID


del elemento origen excepto si dicho elemento origen está codificado en un
esquema de codificación foráneo (como por ejemplo, ASCII). En este caso,
el CCSID asignado a la constante es el CCSID DBCS asociado con el CCSID
por omisión del servidor actual cuando la sentencia SQL que contiene la
constante está preparada. Si no hay ningún CCSID DBCS asociado con el
elemento origen, el CCSID es 65535.

Para obtener información acerca de los CCSID DBCS asociados, consulte la


publicación International Application Development, SC41-4603, Para obtener
información acerca del CCSID del elemento origen, consulte el apartado
sobre constantes de series de caracteres.

© Copyright IBM Corp. 1995, 1996


2.8.5.1 - 1
DB2/400 Manual de Consulta SQL V3R7
Constantes de serie gráfica UCS-2
2.8.5.2 Constantes de serie gráfica UCS-2

No se da soporte a las constantes de serie gráfica UCS-2.

© Copyright IBM Corp. 1995, 1996


2.8.5.2 - 1
DB2/400 Manual de Consulta SQL V3R7
Coma decimal
2.8.6 Coma decimal

Puede especificar si la coma decimal de una constante numérica se


representa mediante una coma o un punto.

 Para sentencias SQL de cualquier lenguaje excepto REXX, la coma


decimal puede especificarse utilizando las opciones de precompilador
*PERIOD, *COMMA o *SYSVAL del parámetro OPTION.

 Para sentencias SQL en REXX, la coma decimal puede especificarse


utilizando la sentencia SET OPTION.

 Para sentencias SQL de SQL interactivo, la coma decimal puede


especificarse utilizando el parámetro DECPNT del mandato STRSQL o
cambiando los atributos de sesión.

 Para sentencias SQL procesadas por el mandato RUNSQLSTM, la coma


decimal puede especificarla el parámetro DECMPT.

*PERIOD, *COMMA y *SYSVAL son opciones que se excluyen mutuamente y que


especifican el carácter que representa la coma decimal en sentencias SQL
hospedadas en el programa. Si se especifica *PERIOD, la coma decimal es
el punto; si se especifica *COMMA, es la coma; si se especifica *SYSVAL,
el valor de sistema QDECFMT determina el carácter que representa la coma
decimal.

Si la coma decimal es la coma, regirán las reglas siguientes:

 Las comas que vayan a ser separadores de constantes numéricas de una


sentencia SELECT o de una cláusula VALUES deben ir seguidas de un
espacio.

 Las comas que vayan a ser coma decimal en cualquier otro contexto, no
deben ir seguidas de un espacio.

Así pues, para especificar una constante decimal sin su parte


fraccionaria, la coma final deber ir seguida de un carácter que no sea un
blanco. Este carácter no blanco puede ser una coma separadora, como en:

VALUES(9999999999,, 111)

© Copyright IBM Corp. 1995, 1996


2.8.6 - 1
DB2/400 Manual de Consulta SQL V3R7
Delimitadores
2.8.7 Delimitadores

*APOST y *QUOTE son opciones de precompilador COBOL que se excluyen


mutuamente y que dan nombre al delimitador de serie dentro de sentencias
COBOL. *APOST da nombre al apóstrofo (') como delimitador de serie;
*QUOTE da nombre a las comillas ("). *APOSTSQL y *QUOTESQL son opciones
de precompilador COBOL que se excluyen mutuamente y que representan un
papel similar para las sentencias SQL hospedadas en programas COBOL.
*APOSTSQL da nombre al apóstrofo (') como el delimitador de serie SQL; con
esta opción, las comillas (") son el carácter de escape de SQL. *QUOTESQL
da nombre a las comillas como el delimitador de serie SQL; con esta
opción, el apóstrofo es el carácter de escape de SQL. Los valores de
*APOSTSQL y *QUOTESQL son, respectivamente, los mismos que los valores de
*APOST y *QUOTE.

En los lenguajes principales que no son COBOL, los usos son fijos. El
delimitador de serie correspondiente a las sentencias del lenguaje
principal y SQL estático es el apóstrofo ('); el carácter de escape SQL
son las comillas (").

© Copyright IBM Corp. 1995, 1996


2.8.7 - 1
DB2/400 Manual de Consulta SQL V3R7
Registros especiales
2.9 Registros especiales

Un registro especial es un área de almacenamiento definida para un proceso


de aplicación por el gestor de bases de datos y utilizada para almacenar
información a la que puede hacerse referencia en las sentencias SQL. Una
referencia a un registro especial es una referencia a un valor facilitado
por el servidor actual. Si el valor es una serie, su CCSID es un CCSID
por omisión del servidor actual. DB2 para OS/400 incluye los registros
especiales siguientes.

Subtemas
2.9.1 CURRENT DATE o CURRENT_DATE
2.9.2 CURRENT SERVER o CURRENT_SERVER
2.9.3 CURRENT TIME o CURRENT_TIME
2.9.4 CURRENT TIMESTAMP o CURRENT_TIMESTAMP
2.9.5 CURRENT TIMEZONE o CURRENT_TIMEZONE
2.9.6 USER

© Copyright IBM Corp. 1995, 1996


2.9 - 1
DB2/400 Manual de Consulta SQL V3R7
CURRENT DATE o CURRENT_DATE
2.9.1 CURRENT DATE o CURRENT_DATE

El registro especial CURRENT DATE especifica una fecha que se basa en una
lectura del reloj de la hora del día cuando se ejecuta la sentencia SQL en
el servidor actual. Todos los valores se basan en una sola lectura del
reloj en las siguientes situaciones:

 este registro especial se utiliza más de una vez dentro de una única
sentencia SQL

 este registro especial se utiliza con los registros especiales CURRENT


TIME o CURRENT TIMESTAMP, o con las funciones escalares CURDATE,
CURTIME o NOW dentro de una única sentencia

Subtemas
2.9.1.1 Ejemplo

© Copyright IBM Corp. 1995, 1996


2.9.1 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplo
2.9.1.1 Ejemplo

Utilizando la tabla PROYECTO, establecer la fecha de finalización de


proyecto (FCHFINPR) del proyecto MA2111 (NUMPRO) como la fecha actual.

UPDATE PROYECTO
SET FCHFINPR = CURRENT DATE
WHERE NUMPRO = 'MA2111'

© Copyright IBM Corp. 1995, 1996


2.9.1.1 - 1
DB2/400 Manual de Consulta SQL V3R7
CURRENT SERVER o CURRENT_SERVER
2.9.2 CURRENT SERVER o CURRENT_SERVER

El registro especial CURRENT SERVER especifica un valor VARCHAR(18) que


identifica al servidor de la aplicación actual.

CURRENT SERVER se puede cambiar mediante las sentencias CONNECT (Tipo 1),
CONNECT (Tipo 2) o SET CONNECTION, pero sólo si se presentan determinadas
circunstancias. Consulte la descripción de los apartados "CONNECT (Tipo
1)" en el tema 5.10, "CONNECT (Tipo 2)" en el tema 5.11, y "SET
CONNECTION" en el tema 5.45.

CURRENT SERVER no se puede especificar a menos que se dé nombre a la base


de datos relacional local añadiendo la entrada al directorio de la base de
datos relacional mediante el mandato ADDRDBDIRE o el mandato WRKRDBDIRE.

Subtemas
2.9.2.1 Ejemplo

© Copyright IBM Corp. 1995, 1996


2.9.2 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplo
2.9.2.1 Ejemplo

Establecer la variable del lenguaje principal SERV_APLIC (VARCHAR(18)) en


el nombre del servidor actual.

SELECT CURRENT SERVER


INTO :SERV_APLIC
FROM FILA1_TABLA

© Copyright IBM Corp. 1995, 1996


2.9.2.1 - 1
DB2/400 Manual de Consulta SQL V3R7
CURRENT TIME o CURRENT_TIME
2.9.3 CURRENT TIME o CURRENT_TIME

El registro especial CURRENT TIME especifica una hora que se basa en una
lectura del reloj de la hora del día cuando se ejecuta la sentencia SQL en
el servidor actual. Todos los valores se basan en una sola lectura del
reloj en las siguientes situaciones:

 este registro especial se utiliza más de una vez dentro de una única
sentencia SQL

 este registro especial se utiliza con los registros especiales CURRENT


DATE o CURRENT TIMESTAMP, o con las funciones escalares CURDATE,
CURTIME o NOW dentro de una única sentencia

Subtemas
2.9.3.1 Ejemplo

© Copyright IBM Corp. 1995, 1996


2.9.3 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplo
2.9.3.1 Ejemplo

Utilizando la tabla CL_PREVI, seleccionar todas las clases (COD_CLASE) que


hoy empiecen (INICIO) más tarde. Las clases de hoy tienen un valor de 3 en
la columna DIA.

SELECT COD_CLASE FROM CL_PREVI


WHERE INICIO > CURRENT TIME AND DIA = 3

© Copyright IBM Corp. 1995, 1996


2.9.3.1 - 1
DB2/400 Manual de Consulta SQL V3R7
CURRENT TIMESTAMP o C URRENT_TIMESTAMP
2.9.4 CURRENT TIMESTAMP o CURRENT_TIMESTAMP

El registro especial CURRENT TIMESTAMP especifica una indicación de la


hora que se basa en una lectura del reloj de la hora del día cuando se
ejecuta la sentencia SQL en el servidor actual. Todos los valores se
basan en una sola lectura del reloj en las siguientes situaciones:

 este registro especial se utiliza más de una vez dentro de una única
sentencia SQL

 este registro especial se utiliza con los registros especiales CURRENT


DATE o CURRENT TIME, o con las funciones escalares CURDATE, CURTIME o
NOW dentro de una única sentencia

Subtemas
2.9.4.1 Ejemplo

© Copyright IBM Corp. 1995, 1996


2.9.4 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplo
2.9.4.1 Ejemplo

Insertar una fila en la tabla BAND_EN. El valor de la columna RECIBIDO


debería ser una indicación de la hora que indique cuándo se insertó la
fila. Los valores correspondientes a las otras tres columnas provienen
de las variables del lenguaje principal ORI (CHAR(8)), SUB (CHAR(64)) y
TXT (VARCHAR(200)).

INSERT INTO BAND_EN


VALUES (CURRENT TIMESTAMP, :ORI, :SUB, :TXT)

© Copyright IBM Corp. 1995, 1996


2.9.4.1 - 1
DB2/400 Manual de Consulta SQL V3R7
CURRENT TIMEZONE o CURRENT_TIMEZONE
2.9.5 CURRENT TIMEZONE o CURRENT_TIMEZONE

El registro especial CURRENT TIMEZONE especifica la diferencia entre la


Hora Universal Coordinada (UTC) (15) y la hora local del servidor actual.
La diferencia se representa mediante una duración de tiempo (un número
decimal en el que los dos primeros dígitos son el número de horas, los dos
siguientes el número de minutos y los dos últimos el número de segundos).
El número de horas está comprendido entre -24 y 24, ambas excluidas. Para
convertir una hora local a la hora UTC se resta el valor CURRENT TIMEZONE
de la hora local.

(15) conocida anteriormente como Hora según el meridiano de


Greenwich (GMT).

Subtemas
2.9.5.1 Ejemplo

© Copyright IBM Corp. 1995, 1996


2.9.5 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplo
2.9.5.1 Ejemplo

Utilizando la tabla BAND_EN, seleccionar todas las filas de la tabla y


ajustar el valor a la UTC.

SELECT RECIBIDO - CURRENT TIMEZONE, ORIGEN,


TEMA, TEXTO_NOTA FROM BAND_EN

© Copyright IBM Corp. 1995, 1996


2.9.5.1 - 1
DB2/400 Manual de Consulta SQL V3R7
USER
2.9.6 USER

El registro especial USER especifica el ID de autorización en tiempo de


ejecución del servidor actual. El tipo de datos del registro especial es
VARCHAR(18).

Subtemas
2.9.6.1 Ejemplo

© Copyright IBM Corp. 1995, 1996


2.9.6 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplo
2.9.6.1 Ejemplo

Seleccionar todas las notas de la tabla BAND_EN que haya colocado allí el
usuario mismo.

SELECT * FROM BAND_EN


WHERE ORIGEN = USER

© Copyright IBM Corp. 1995, 1996


2.9.6.1 - 1
DB2/400 Manual de Consulta SQL V3R7
Nombres de columna
2.10 Nombres de columna

El significado de un nombre de columna depende de su contexto. Un nombre


de columna puede utilizarse para:

 Declarar el nombre de la columna, como en la sentencia CREATE TABLE.

 Identificar una columna, como en la sentencia CREATE INDEX.

 Especificar los valores de la columna, como en los siguientes


contextos:

- En una función de columna un nombre de columna especifica todos


los valores de la columna en la tabla de resultados intermedios o
al grupo a los que se aplica la función. Qué son los grupos y las
tablas de resultados intermedios se explica en el apartado "SELECT
INTO" en el tema 5.44. Por ejemplo, MAX(SUELDO) aplica la función
MAX a todos los valores de la columna SUELDO de un grupo.

- En una cláusula GROUP BY u ORDER BY , un nombre de columna


especifica todos los valores de la tabla de resultados intermedios
a los que se aplica la cláusula. Por ejemplo, ORDER BY DEPT
ordena una tabla de resultados intermedios por los valores de la
columna DEPT.

- En una expresión, una condición de búsqueda o una función escalar


un nombre de columna especifica un valor para cada fila o grupo a
los que se aplique la estructura. Por ejemplo, cuando se aplique
la condición de búsqueda CÓDIGO = 20 a alguna fila, el valor
especificado por el nombre de columna CÓDIGO será el valor de la
columna CÓDIGO en esa fila.

Subtemas
2.10.1 Nombres de columna calificados
2.10.2 Nombres de correlación
2.10.3 Calificadores de nombre de columna para evitar la ambigüedad
2.10.4 Calificadores de nombre de columna en referencias correlacionadas
2.10.5 Nombres de columna no calificados

© Copyright IBM Corp. 1995, 1996


2.10 - 1
DB2/400 Manual de Consulta SQL V3R7
Nombres de columna calificados
2.10.1 Nombres de columna calificados

Un nombre de tabla, un nombre de vista o un nombre de correlación pueden


ser calificadores de un nombre de columna.

El que un nombre de columna pueda calificarse o no depende de su contexto:

 En las sentencias COMMENT ON y LABEL ON, el nombre de columna debe


estar calificado.

 Si el nombre de columna especifica valores de la columna, puede


calificarse un nombre de columna en la opción del usuario.

 En todos los demás contextos, un nombre de columna no debe estar


calificado.

Si un calificador es opcional, puede tener dos propósitos. Véase el


apartado "Calificadores de nombre de columna para evitar la ambigüedad" en
el tema 2.10.3 y "Calificadores de nombre de columna en referencias
correlacionadas" en el tema 2.10.4 para más detalles.

© Copyright IBM Corp. 1995, 1996


2.10.1 - 1
DB2/400 Manual de Consulta SQL V3R7
Nombres de correlación
2.10.2 Nombres de correlación

Un nombre de correlación puede definirse en la cláusula FROM de una


consulta y en la primera cláusula de una sentencia UPDATE o DELETE. Por
ejemplo, la cláusula que aparece más abajo establece Z como un nombre de
correlación de X.MITABLA:

FROM X.MITABLA Z

Los nombres de correlación están asociados con una tabla o vista sólo
dentro del contexto en el que se definen. De ahí que el mismo nombre de
correlación pueda definirse con diferentes propósitos en diferentes
sentencias o en diferentes cláusulas de la misma sentencia.

Como calificador, un nombre de correlación puede utilizarse para evitar


ambigüedades o para establecer una referencia correlacionada. También
puede utilizarse como una mera abreviatura de una tabla o vista. En el
ejemplo que figura más arriba, Z podría haberse utilizado simplemente para
evitar el tener que entrar X.MITABLA más de una vez.

Si se especifica un nombre de correlación para un nombre de tabla o de


vista, cualquier referencia a una columna de tal aparición de la tabla o
vista debe utilizar el nombre de correlación en lugar del nombre de tabla
o de vista. Por ejemplo, la referencia a EMPLEADO.PROYECTO que se hace en
el ejemplo siguiente es incorrecta porque se ha especificado un nombre de
correlación para EMPLEADO:

+-----------+
FROM EMPLEADO E ¦ INCORRECTO¦
WHERE EMPLEADO.PROYECTO = 'ABC' +-----------+

En lugar de esto, la referencia calificada a PROYECTO debe utilizar el


nombre de correlación, "E", tal y como se indica a continuación:

FROM EMPLEADO E
WHERE E.PROYECTO='ABC'

Los nombres especificados en la cláusula FROM son expuestos o no


expuestos. Un nombre de correlación siempre es un nombre expuesto. Se
dice que un nombre de tabla o vista está expuesto en dicha cláusula FROM
si no se especifica ningún nombre de correlación. En la siguiente
cláusula FROM, por ejemplo, se especifica un nombre de correlación para
EMPLEADO, pero no para DEPART, de manera que DEPART es un nombre expuesto
y, en cambio, EMPLEADO no:

FROM EMPLEADO E, DEPART

El nombre de tabla o de vista expuesto en una cláusula FROM no debe ser el


mismo que cualquier otro nombre de tabla o de vista expuesto en dicha
cláusula FROM o en cualquier nombre de correlación de la cláusula FROM.
Los nombres se comparan después de calificar los nombres de tabla o de
vista no calificados que haya.

Las dos primeras cláusula FROM que figuran más bajo son correctas porque
cada una de ellas contiene no más de una referencia a EMPLEADO, que es un
nombre expuesto:

1. Dada la cláusula FROM:

FROM EMPLEADO E1, EMPLEADO

una referencia calificada como EMPLEADO.PROYECTO denota una columna de


la segunda aparición de EMPLEADO en la cláusula FROM. Una referencia
calificada a la primera aparición de EMPLEADO debe utilizar el nombre
de correlación "E1" (E1.PROYECTO).

2. Dada la cláusula FROM:

FROM EMPLEADO, EMPLEADO E2

una referencia calificada como EMPLEADO.PROYECTO denota una columna de


la primera aparición de EMPLEADO en la cláusula FROM. Una referencia
calificada a la segunda aparición de EMPLEADO debe utilizar el nombre
de correlación "E2" (E2.PROYECTO).

3. Dada la cláusula FROM:

+------------+
FROM EMPLEADO, EMPLEADO ¦ INCORRECTO ¦
+------------+

los dos nombres de tabla expuestos incluidos en esta cláusula


(EMPLEADO y EMPLEADO) son el mismo, lo que no está permitido.

4. Dada la sentencia siguiente:

SELECT * +------------+
FROM EMPLEADO E1, EMPLEADO E2 ¦ INCORRECTO ¦
WHERE EMPLEADO.PROYECTO = 'ABC' +------------+

© Copyright IBM Corp. 1995, 1996


2.10.2 - 1
DB2/400 Manual de Consulta SQL V3R7
Nombres de correlación

la referencia calificada EMPLEADO.PROYECTO es incorrecta, Porque las


dos apariciones de EMPLEADO en la cláusula FROM tienen nombres de
correlación. En lugar de esto, las referencias a PROYECTO deben
calificarse con uno de los dos nombres de correlación (E1.PROYECTO o
E2.PROYECTO).

5. Dada la cláusula FROM:

FROM EMPLEADO, X.EMPLEADO

una referencia a una columna de la segunda aparición de EMPLEADO debe


utilizar X.EMPLEADO (X.EMPLEADO.PROYECTO). Esta cláusula FROM es
válida únicamente si el ID de autorización de la sentencia no es X.

Un nombre de correlación especificado en un cláusula FORM no debe ser


igual que:

 Ningún otro nombre de correlación de la cláusula FROM


 Cualquier nombre de tabla o nombre de vista no calificados expuestos
en la cláusula FROM
 El segundo identificador SQL de cualquier nombre de tabla o de vista
calificado de la cláusula FROM.

Por ejemplo, las sentencias FROM siguientes son incorrectas:

FROM EMPLEADO E, EMPLEADO E +------------+


FROM EMPLEADO DEPART, DEPART ¦ INCORRECTO ¦
FROM X.T1, EMPLEADO T1 +------------+

La siguiente cláusula es técnicamente correcta, aunque potencialmente


confusa:

FROM EMPLEADO DEPARTAMENTO, DEPARTAMENTO EMPLEADO

© Copyright IBM Corp. 1995, 1996


2.10.2 - 2
DB2/400 Manual de Consulta SQL V3R7
Calificadores de nombre de columna para evitar la ambigüedad
2.10.3 Calificadores de nombre de columna para evitar la ambigüedad

En el contexto de una función, una cláusula GROUP BY, ORDER BY, una
expresión o una condición de búsqueda, un nombre de columna hace
referencia a los valores de una columna en alguna tabla o vista. Las
tablas y vistas que podrían contener la columna reciben el nombre de
tablas objeto del contexto. Dos o más tablas objeto podrían contener
columnas con el mismo nombre. Una razón para calificar un nombre de
columna es designar el objeto del que procede la columna.

Designadores de tabla: Un calificador que designa una tabla objeto


específica recibe el nombre de designador de tabla. La cláusula que
identifica las tablas objeto también establece los designadores de tabla
de las mismas. Por ejemplo, las tablas objeto de una expresión en una
cláusula SELECT se especifican en la cláusula FROM que va a continuación:

SELECT CORZ.COLA, PROPY.MITABLA.COLA


FROM PROPX.MITABLA CORZ, PROPY.MITABLA

Así es cómo se establecen los designadores de tabla en cláusula FROM:

 Un nombre que va después de un nombre de tabla o de vista es a la vez


un nombre de correlación y un designador de tabla. Por lo tanto, CORZ
es un designador de tabla. CORZ se utiliza para calificar el primer
nombre de columna de la lista de selección.

 En los nombres SQL, un nombre de vista o de tabla expuesto es un


designador de tabla. Por lo tanto, PROPY.MITABLA es un designador de
tabla. PROPY.MITABLA se utiliza para calificar el segundo nombre de
columna de la lista de selección.

 En los nombres del sistema, el designador de tabla correspondiente a


un nombre de tabla o de vista expuesto es el nombre de tabla o de
vista no calificado. En el ejemplo siguiente MITABLA es el designador
de tabla de PROPY/MITABLA.

SELECT CORZ.COLA, MITABLA.COLA


FROM PROPX/MITABLA CORZ, PROPY/MITABLA

Evitar las referencias no definidas o ambiguas: Cuando un nombre de


columna hace referencia a los valores de una columna, debe haber
exactamente una tabla objeto que incluya una columna con ese nombre. Las
situaciones siguientes están consideradas como erróneas:

 Ninguna tabla objeto contiene una columna con el nombre especificado.


La referencia es indefinida.

 Un designador de tabla califica el nombre de columna, pero la tabla


designada no incluye ninguna columna con el nombre especificado. De
nuevo la referencia es indefinida.

 El nombre no está calificado y más de una tabla objeto contiene una


columna con ese nombre. La referencia es ambigua.

Evite las referencias ambiguas calificando los nombres de columna con


designadores de tabla definidos de forma exclusiva. Si la columna está
incluida en varias tablas objeto con nombres diferentes, los nombres de
tablas objeto pueden utilizarse como designadores.

Dos o más tablas objeto pueden ser apariciones de la misma tabla. En ese
caso, deben utilizarse nombres de correlación distintos para designar de
forma no ambigua a las apariciones concretas de la tabla. En la siguiente
cláusula FROM, X e Y se han definido para hacer referencia,
respectivamente, a la primera y segunda aparición de la tabla
DATOSCORP.EMPLEADO:

FROM DATOSCORP.EMPLEADO X, DATOSCORP.EMPLEADO Y

Cuando se califica una columna con el formato de nombre de tabla expuesto


de un designador de tabla, se puede utilizar tanto la forma calificada
como la no calificada del nombre de tabla expuesto. No obstante, el
calificador utilizado y la tabla utilizada deben ser iguales después de la
calificación completa del nombre de tabla o nombre de vista y del
designador de tabla.

1. Si el ID de autorización de la sentencia es DATOSCORP:

SELECT DATOSCORP.EMPLEADO.DEPTTRAB
FROM EMPLEADO

es una sentencia válida.

2. Si el ID de autorización de la sentencia es REGION:

SELECT DATOSCORP.EMPLEADO.DEPTTRAB +-----------+


FROM EMPLEADO ¦ INCORRECTO¦
+-----------+

no es válida porque EMPLEADO representa la tabla REGIÓN.EMPLEADO, pero


el calificador de DEPTTRAB representa una tabla distinta,
DATOSCORP.EMPLEADO.

© Copyright IBM Corp. 1995, 1996


2.10.3 - 1
DB2/400 Manual de Consulta SQL V3R7
Calificadores de nombre de columna en referencias correlacionadas
2.10.4 Calificadores de nombre de columna en referencias correlacionadas

Una subselección es una forma de una consulta que puede utilizarse como un
componente de varias sentencias SQL. Véase el Capítulo 4, "Consultas" en
el tema 4.0 para obtener más información sobre subselecciones Una
subselección utilizada dentro de una condición de búsqueda de cualquier
sentencia recibe el nombre de subconsulta.

Una subconsulta puede incluir condiciones de búsqueda propias, y dichas


condiciones pueden, a su vez, incluir subconsultas. En consecuencia, una
sentencia SQL puede contener una jerarquía de subconsultas. De aquellos
elementos de la jerarquía que contienen subconsultas se dice que se
encuentran situados a un nivel más alto que las subconsultas que
contienen.

Cada elemento de la jerarquía tiene una cláusula que establece uno o más
designadores de tabla. Esta es la cláusula FROM, salvo para el nivel más
alto de una sentencia UPDATE o DELETE. Una condición de búsqueda de una
subconsulta puede hacer referencia no sólo a las columnas de las tablas
identificadas por la cláusula FROM de su propio elemento de la jerarquía,
sino también a columnas de tablas identificadas en cualquier nivel a lo
largo de la vía de acceso, desde su propio elemento hasta el nivel más
alto de la jerarquía. Una referencia a una columna de una tabla
identificada en un nivel superior recibe el nombre de referencia
correlacionada.

Una referencia correlacionada a la columna C de la tabla T puede ser de la


forma C, T.C o Q.C, siempre que Q sea un nombre de correlación definido
para T. No obstante, una referencia correlacionada en forma de nombre de
columna no calificado no constituye una buena práctica. La explicación
siguiente está basada en la suposición de que una referencia
correlacionada siempre tiene la forma de un nombre de columna calificado y
en que el calificador es un nombre de correlación.

Q.C es una referencia correlacionada sólo si se cumplen las tres


condiciones siguientes:

 Q.C se utiliza en una condición de búsqueda de una subconsulta.


 Q no designa a ninguna tabla utilizada en la cláusula FROM de esa
subconsulta.
 Q designa a una tabla utilizada en un nivel superior.

Q.C hace referencia a la columna C de la tabla o vista en el nivel en el


que se utiliza Q como designador de tabla de esa tabla o vista. Dado que
se puede identificar la misma tabla o vista en muchos niveles, se
recomienda la utilización de nombres de correlación exclusivos como
designadores de tabla. Si se utiliza Q para designar una tabla en más de
un nivel, Q.C. hace referencia al nivel más bajo que contiene la
subconsulta que incluye Q.C.

En la siguiente sentencia, Q se utiliza como nombre de correlación para T1


y T2, pero Q.C hace referencia al nombre de correlación asociado con T2
porque es el nivel más bajo que contiene la subconsulta que incluye Q.C.

SELECT *
FROM T1 Q
WHERE A < ALL (SELECT B
FROM T2 Q
WHERE B < ANY (SELECT D
FROM T3
WHERE D = Q.C))

© Copyright IBM Corp. 1995, 1996


2.10.4 - 1
DB2/400 Manual de Consulta SQL V3R7
Nombres de columna no calificados
2.10.5 Nombres de columna no calificados

Un nombre de columna no calificado también puede ser una referencia


correlacionada si la columna:

 Se utiliza en una condición de búsqueda de una subconsulta


 No está incluida en una tabla utilizada en la cláusula FROM de esa
subconsulta
 Está incluida en una tabla utilizada en un nivel más alto

No se recomiendan las referencias correlacionadas no calificadas porque


hacen que la sentencia SQL sea difícil de entender. La columna se
calificará implícitamente cuando se prepare la sentencia dependiendo de la
tabla en la que se encontró la columna. Una vez determinada dicha
calificación implícita, ésta no cambiará hasta que la sentencia se vuelva
a preparar. El precompilador SQL emitirá un mensaje de aviso en el
listado de precompilación y el gestor de base de datos emitirá un SQLCODE
positivo (+12) y un SQLSTATE (01545) cuando se prepare o se ejecute una
sentencia SQL que tenga una referencia correlacionada no calificada.

© Copyright IBM Corp. 1995, 1996


2.10.5 - 1
DB2/400 Manual de Consulta SQL V3R7
Referencias a variables del lenguaje principal
2.11 Referencias a variables del lenguaje principal

Una variable del lenguaje principal es un dato COBOL, un campo RPG o una
variable PLI, REXX o C a que se hace referencia en una sentencia SQL. Las
variables del lenguaje principal están definidas por sentencias del
lenguaje principal. No puede hacerse referencia a variables del lenguaje
principal en las sentencias SQL dinámicas; en su lugar deben utilizarse
marcadores de parámetros. Véase el apartado "Marcadores de parámetros" en
el tema 5.38.4. Para obtener más información acerca de cómo hacer
referencia a estructuras del lenguaje principal en C, COBOL, PL/I y RPG,
consulte el apartado "Estructuras del lenguaje principal en C, COBOL, PL/I
y RPG" en el tema 2.12. Para obtener más información acerca de las
variables del lenguaje principal en REXX, consulte el manual DB/2 for
OS/400 SQL Programming, SC41-4611.

Una variable-lenguaje-principal de una sentencia SQL debe identificar una


variable del lenguaje principal descrita en el programa de acuerdo con las
reglas de declaración de variables del lenguaje principal.

Todas las variables del lenguaje principal utilizadas en una sentencia SQL
deben declararse en una sección de declaración SQL presente en todos los
lenguajes principales, excepto REXX y RPG. (Las variables no tienen que
declararse en REXX. En RPG no existe la sección de declaración y, por lo
tanto, las variables del lenguaje principal pueden irse declarando a lo
largo del programa). No se puede declarar ninguna variable fuera de una
sección de declaración SQL con nombres idénticos a los de las variables
declaradas dentro de una sección de declaración SQL. Una sección de
declaración SQL empieza con BEGIN DECLARE SECTION y termina con END
DECLARE SECTION.

Para obtener más información acerca de la utilización de variables del


lenguaje principal, consulte el manual DB/2 for OS/400 SQL Programming,
SC41-4611.

El término variable-lenguaje-principal, tal y como se utiliza en los


diagramas de sintaxis, indica una referencia a una variable del lenguaje
principal. Una variable-lenguaje-principal incluida en la cláusula INTO
de una sentencia FETCH o SELECT INTO identifica una variable del lenguaje
principal a la que se le asigna un valor de una columna de una fila. Una
variable del lenguaje principal incluida en una sentencia CALL identifica
una variable del lenguaje principal a la que se le asigna un valor de
parámetro de salida, y/o una variable del lenguaje principal que
especifica un valor de argumento de entrada que debe pasarse al gestor de
bases de datos desde el programa de aplicación. En los restantes
contextos una variable-lenguaje-principal especifica un valor que ha de
pasarse al DB2 para OS/400 desde el programa de aplicación.

El formato general de una referencia de variable-lenguaje-principal es:

+------------------------------------------------------------------------+
¦ ¦
¦ >--:id-leng-princ----------------------------------------------------> ¦
¦ ¦ +-INDICATOR-+ ¦ ¦
¦ +----------------:id-leng-princ-+ ¦
¦ ¦
+------------------------------------------------------------------------+

Cada identificador-lenguaje-principal debe declararse en el programa


fuente. La variable designada por el segundo
identificador-lenguaje-principal debe tener un tipo de datos de entero
pequeño con escala cero.

El primer identificador-lenguaje-principal designa la variable principal;


el segundo identificador-lenguaje-principal designa a su variable de
indicador. El propósito de la variable del indicador es:

 Especificar el valor nulo. Un valor negativo de la variable de


indicador especifica el valor nulo.
 Indicar uno de los siguientes errores de correlación de datos:
- Los caracteres no han podido convertirse
- Error en conversión numérica (subdesbordamiento o desbordamiento)
- Error en expresión aritmética (división por 0)
- Error en conversión de fecha o de indicación de la hora (fecha o
indicación de la hora no comprendida en el rango válido de fechas
para el formato especificado)
- Representación de serie del valor de fecha y hora no válida
- Los datos mixtos no son correctos
- Valor numérico no válido
- El argumento de la función escalar SUBSTR está fuera de rango
 Registrar la longitud original de una serie truncada.
 Registrar la parte de la hora correspondiente a los segundos si se
trunca la hora al asignarla a una variable del lenguaje principal.

Si, por ejemplo, se utiliza :V1:V2 para especificar un valor de inserción


o actualización y V2 es negativo, el valor especificado es el valor nulo.
Si V2 no es negativo, el valor especificado es el valor de V1.

De forma similar, si se especifica :V1:V2 en una sentencia CALL, FETCH o


SELECT INTO y el valor devuelto es nulo, V1 queda indefinido y V2 se
establece en un valor negativo. El valor negativo es:

 -1 si el valor seleccionado era el valor nulo, o

 -2 si se ha devuelto el valor nulo por causa de errores de correlación


de datos en la lista de selección de una subselección exterior. (16)

Si el valor devuelto no es nulo, dicho valor se asigna a V1 y se establece

© Copyright IBM Corp. 1995, 1996


2.11 - 1
DB2/400 Manual de Consulta SQL V3R7
Referencias a variables del lenguaje principal
V2 en cero (a menos que la asignación a V1 requiera un truncamiento de
serie, en cuyo caso V2 se establece en la longitud original de la serie).
Si una asignación requiere el truncamiento de la parte de la hora
correspondiente a los segundos, V2 se establece al número de segundos.

Si se omite el segundo identificador-lenguaje-principal, la variable del


lenguaje principal no tendrá ninguna variable de indicador. El valor
especificado por la variable-lenguaje-principal :V1 es siempre el valor de
V1, y los valores nulos no pueden asignarse a la variable. Así pues, este
formato no debe utilizarse en una cláusula INTO a menos que la columna de
resultados correspondiente no contenga valores nulos. Si se utiliza este
formato y la columna contiene nulos, el gestor de bases de datos devuelve
un valor negativo (-407) en el campo SQLCODE de la SQLCA. Si se truncan
los datos y no hay ninguna variable de indicador, no se produce ninguna
condición de error.

Una variable del lenguaje principal debe ir siempre precedida por dos
puntos cuando se utiliza en una sentencia SQL.

En PL/I y C, una sentencia SQL que haga referencia a variables del


lenguaje principal debe estar comprendida dentro del ámbito de la
declaración de dichas variables del lenguaje principal. Para las
variables del lenguaje principal a las que se haga referencia en la
sentencia SELECT de un cursor, esta regla rige para la sentencia OPEN en
lugar de la sentencia DECLARE CURSOR.

El CCSID de una variable del lenguaje principal de serie es:

 El CCSID especificado en la sentencia DECLARE VARIABLE o bien

 Si no se especifica ninguna DECLARE VARIABLE con una cláusula CCSID


para la variable del lenguaje principal, el CCSID por omisión del
peticionario de la aplicación en el momento de ejecutarse la sentencia
SQL que contiene la variable del lenguaje principal a menos que el
CCSID corresponda a un esquema de codificación foráneo (como por
ejemplo, ASCII). En este caso, la variable del lenguaje principal se
convierte en el CCSID por omisión del servidor actual.

(16) Conviene observar que aunque el valor nulo devuelto para


los errores de correlación de datos puede devolverse en
ciertas funciones escalares y para expresiones aritméticas,
la columna de resultados no está considerada como de
capacidad nula a menos que un argumento de la expresión
aritmética o función escalar lo sea.

Subtemas
2.11.1 Ejemplo

© Copyright IBM Corp. 1995, 1996


2.11 - 2
DB2/400 Manual de Consulta SQL V3R7
Ejemplo
2.11.1 Ejemplo

Utilizando la tabla PROYECTO, establecer la variable del lenguaje


principal NOMBREP (varchar(26)) en el nombre de proyecto (NOMBREPR), la
variable del lenguaje principal PERSONAL (dec(5,2)) en el promedio de
personal (PRPERSON) y la variable del lenguaje principal PROYPRIN
(char(6)) en el proyecto principal (PROYPRIN) del proyecto (NUMPRO)
'IF1000'. Las columnas PRPERSON y PROYPRIN pueden contener valores nulos,
así que proporcione las variables de indicador IND_PERSONAL (smallint) e
IND_PROYPRIN (smallint).

SELECT NOMBREPR, PRPERSON, PROYPRIN


INTO :NOMBREP, :PERSONAL :IND_PERSONAL, :PROYPRIN :IND_PROYPRIN
FROM PROYECTO
WHERE NUMPRO = 'IF1000'

© Copyright IBM Corp. 1995, 1996


2.11.1 - 1
DB2/400 Manual de Consulta SQL V3R7
Estructuras del lenguaje principal en C, COBOL, PL/I y RPG
2.12 Estructuras del lenguaje principal en C, COBOL, PL/I y RPG

Una estructura del lenguaje principal es un grupo COBOL, una estructura


PL/I o C o una estructura de datos RPG a los que se hace referencia en una
sentencia SQL. Las estructuras del lenguaje principal se definen mediante
sentencias del lenguaje principal, tal como se explica en el manual DB/2
for OS/400 SQL Programming, SC41-4611. Tal como se utiliza en este
manual, el término estructura del lenguaje principal no incluye ninguna
SQLCA o SQLDA.

El formato de una referencia de estructura del lenguaje principal es


idéntico al formato de una referencia de variable del lenguaje principal.
La referencia :S1:S2 es una referencia de estructura del lenguaje
principal si en S1 se nombra una estructura del lenguaje principal. Si S1
designa una estructura del lenguaje principal, S2 debe ser una variable de
entero pequeño o una matriz de variables de entero pequeño. S1 es la
estructura del lenguaje principal y S2 su matriz de indicador.

Puede hacerse referencia a una estructura del lenguaje principal en


cualquier contexto en el que pueda hacerse referencia a una lista de
variables del lenguaje principal. Una referencia de estructura del
lenguaje principal es equivalente a una referencia hecha a cada una de las
variables del lenguaje principal contenidas en la estructura en el orden
en que están definidas en la declaración de estructura del lenguaje
principal. La enésima variable de la matriz de indicador es la variable
de indicador correspondiente a la enésima variable de la estructura del
lenguaje principal.

En PL/I, por ejemplo, si se declaran V1, V2 y V3 como variables dentro de


la estructura S1, la sentencia:

EXEC SQL FETCH CURSOR1 INTO :S1;

equivale a:

EXEC SQL FETCH CURSOR1 INTO :V1, :V2, :V3;

Si la estructura del lenguaje principal tiene m variables más que la


matriz de indicador, las m últimas variables de la estructura del lenguaje
principal carecen de variables de indicador. Si la estructura del
lenguaje principal tiene m variables menos que la matriz de indicador, las
m últimas variables de la matriz de indicador no se tienen en cuenta.
Estas reglas rigen también si una referencia hecha a una estructura del
lenguaje principal incluye una variable de indicador o si una referencia a
una variable del lenguaje principal incluye una matriz de indicador. Si
no se especifica ninguna matriz o variable de indicador, ninguna variable
de la estructura del lenguaje principal tendrá una variable de indicador.

Además de referencias a estructuras, también pueden hacerse referencia a


las variables del lenguaje principal incluidas en la estructura del
lenguaje principal o a las variables de indicador incluidas en la matriz
de indicador por medio de nombres calificados. El formato calificado es
un identificador del lenguaje principal seguido de un punto y de otro
identificador del lenguaje principal. En el primer identificador del
lenguaje principal debe nombrarse una estructura del lenguaje principal, y
en el segundo identificador del lenguaje principal debe nombrarse una
variable del lenguaje principal de dicha estructura del lenguaje
principal.

El diagrama siguiente especifica la sintaxis de las referencias a


variables y estructuras del lenguaje principal:

+------------------------------------------------------------------------+
¦ ¦
¦ ¦
¦ ¦
¦ >--:---------------------id-leng-princ-------------------------------> ¦
¦ +-id-leng-princ-+ ¦
¦ ¦
¦ >--------------------------------------------------------------------> ¦
¦ ¦ +-INDICATOR-+ ¦ ¦
¦ +----------------:---------------------id-leng-princ-+ ¦
¦ +-id-leng-princ-+ ¦
¦ ¦
¦ ¦
+------------------------------------------------------------------------+
Una variable-lenguaje-principal de una expresión debe identificar una
variable del lenguaje principal (no una estructura) descrita en el
programa de acuerdo con las reglas de declaración de variables del
lenguaje principal.

En REXX no se da soporte a las estructuras del lenguaje principal.

Los ejemplos siguiente muestran referencias a variables y estructuras del


lenguaje principal:

:V1 :S1.V1 :S1.V1:V2 :S1.V2:S2.V4

© Copyright IBM Corp. 1995, 1996


2.12 - 1
DB2/400 Manual de Consulta SQL V3R7
Matrices de estructuras del lenguaje principal en C, COBOL, PL/I y RPG
2.13 Matrices de estructuras del lenguaje principal en C, COBOL, PL/I y RPG

En PL/I y C, una matriz de estructuras del lenguaje principal es un nombre


de estructura que tiene un atributo de dimensión. En COBOL, es una tabla
unidimensional. En RPG, es una estructura de datos de apariciones. Sólo
puede hacerse referencia a una matriz de estructuras del lenguaje en la
sentencia FETCH cuando se utiliza una operación FETCH de varias filas, o
en una sentencia INSERT cuando se utiliza una inserción bloqueada. Las
matrices de estructuras del lenguaje principal vienen definidas por las
sentencias del lenguaje principal, según se explica en el manual DB/2 for
OS/400 SQL Programming.

El formato de una matriz de estructuras del lenguaje principal es idéntico


al formato de una referencia de variable del lenguaje principal. La
referencia :S1:S2 es una referencia a una matriz de estructuras del
lenguaje principal si en S1 se nombra a una matriz de estructuras del
lenguaje principal. Si S1 designa a una estructura del lenguaje
principal, S2 debe ser una variable del lenguaje principal de entero
pequeño, una matriz de variables del lenguaje principal de entero pequeño
o una matriz bidimensional de variables del lenguaje principal de entero
pequeño. En el ejemplo siguiente, S1 es la matriz de estructuras del
lenguaje principal y S2 es su matriz de indicador.

EXEC SQL FETCH CURSOR1 FOR 5 ROWS


INTO :S1:S2;

La dimensión de la estructura del lenguaje principal y de la matriz de


indicador debe ser igual.

Si la estructura del lenguaje principal tiene m variables más que la


matriz de indicador, las m últimas variables de la estructura del lenguaje
principal carecen de variables de indicador. Si la estructura del
lenguaje principal tiene m variables menos que la matriz de indicador, las
m últimas variables de la matriz de indicador no se tienen en cuenta. Si
no se especifica ninguna matriz o variable de indicador, ninguna variable
de la matriz de estructuras del lenguaje principal tendrá una variable de
indicador.

El diagrama siguiente especifica la sintaxis de las referencias a una


matriz de estructuras del lenguaje principal:

+------------------------------------------------------------------------+
¦ ¦
¦ ¦
¦ ¦
¦ >--:--id-leng-princ--------------------------------------------------> ¦
¦ ¦ +-INDICATOR-+ ¦ ¦
¦ +----------------:--id-leng-princ-+ ¦
¦ ¦
¦ ¦
+------------------------------------------------------------------------+
En REXX no se da soporte a las matrices de estructuras del lenguaje
principal.

© Copyright IBM Corp. 1995, 1996


2.13 - 1
DB2/400 Manual de Consulta SQL V3R7
Expresiones
2.14 Expresiones

Una expresión especifica un valor.

+------------------------------------------------------------------------+
¦ ¦
¦ ¦
¦ ¦
¦ <-operador---------------------------------+ ¦
¦ >---------------función----------------------------------------------> ¦
¦ +- + -¦ +-(expresión)-----------------¦ ¦
¦ +- - -+ +-constante-------------------¦ ¦
¦ +-nombre-col------------------¦ ¦
¦ +-variable-lenguaje-principal-¦ ¦
¦ +-registro-especial-----------¦ ¦
¦ +-duración-etiquetada---------+ ¦
¦ ¦
¦ ¦
¦ +--- Nota en línea --------------------------------------------------+ ¦
¦ ¦ ¦ ¦
¦ ¦ La información siguiente contiene un símbolo que el BookManager ¦ ¦
¦ ¦ no visualiza. ¦ ¦
¦ ¦ Por favor, consulte la versión publicada de este ¦ ¦
¦ ¦ manual si desea información más completa sobre el tema. ¦ ¦
¦ ¦ ¦ ¦
¦ +--------------------------------------------------------------------+ ¦
¦ ¦
¦ ¦
¦ operador: ¦
¦ ¦
¦ ¦
¦ >----CONCAT----------------------------------------------------------> ¦
¦ +- &concat. -¦ ¦
¦ +- / --------¦ ¦
¦ +- * --------¦ ¦
¦ +- ** -------¦ ¦
¦ +- + --------¦ ¦
¦ +- - --------+ ¦
¦ ¦
¦ duración-etiquetada: ¦
¦ ¦
¦ ¦
¦ >----función--------------------------YEAR---------------------------> ¦
¦ +-(expresión)-----------------¦ +-YEARS--------¦ ¦
¦ +-constante-------------------¦ +-MONTH--------¦ ¦
¦ +-nombre-col------------------¦ +-MONTHS-------¦ ¦
¦ +-variable-lenguaje-principal-+ +-DAY----------¦ ¦
¦ +-DAYS---------¦ ¦
¦ +-HOUR---------¦ ¦
¦ +-HOURS--------¦ ¦
¦ +-MINUTE-------¦ ¦
¦ +-MINUTES------¦ ¦
¦ +-SECOND-------¦ ¦
¦ +-SECONDS------¦ ¦
¦ +-MICROSECOND--¦ ¦
¦ +-MICROSECONDS-+ ¦
¦ ¦
¦ ¦
+------------------------------------------------------------------------+

Subtemas
2.14.1 Sin operadores
2.14.2 Con el operador de concatenación
2.14.3 Con operadores aritméticos
2.14.4 Dos operandos enteros
2.14.5 Operandos enteros y decimales
2.14.6 Dos operandos decimales
2.14.7 Aritmética decimal en SQL
2.14.8 Operandos de coma flotante
2.14.9 Operandos de fecha y hora y duraciones
2.14.10 Aritmética de fecha y hora en SQL
2.14.11 Orden de precedencia de las operaciones

© Copyright IBM Corp. 1995, 1996


2.14 - 1
DB2/400 Manual de Consulta SQL V3R7
Sin operadores
2.14.1 Sin operadores

Si no se utiliza ningún operador, el resultado de la expresión es el valor


especificado.

Subtemas
2.14.1.1 Ejemplo

© Copyright IBM Corp. 1995, 1996


2.14.1 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplo
2.14.1.1 Ejemplo

SUELDO :SUELDO 'SUELDO' MAX(SUELDO)

© Copyright IBM Corp. 1995, 1996


2.14.1.1 - 1
DB2/400 Manual de Consulta SQL V3R7
Con el operador de concatenación
2.14.2 Con el operador de concatenación

Si se utiliza el operador de concatenación (CONCAT o ||), el resultado de


la expresión es una serie. Los operandos de una concatenación deben
series compatibles. Si ambos operandos son series de caracteres, la suma
de sus longitudes no debe sobrepasar 32766. Si ambos operandos son series
gráficas, la suma de sus longitudes no debe sobrepasar los 16383
caracteres gráficos.

Si uno de los dos operandos puede ser nulo, el resultado puede ser nulo y
si cualquiera de los dos lo es, es resultado es el valor nulo. De lo
contrario, el resultado consta de la primera serie de operandos seguida de
la segunda.

Con datos mixtos este resultado no tendrá códigos de desplazamiento a


teclado redundantes "en los extremos". Así pues, si el primer operando es
una serie que termina con un carácter de "desplazamiento a teclado
estándar" (X'0F'), mientras que el segundo operando es una serie de
caracteres que empieza con un carácter de "desplazamiento a teclado
ideográfico" (X'0E'), estos dos bytes se eliminan del resultado.

La longitud del resultado es la suma de las longitudes de los operandos, a


menos que se eliminen los desplazamientos a teclado redundantes, en cuyo
caso la longitud es la suma de las longitudes de los operandos menos dos.

Si ambos operandos son series de caracteres de longitud fija (ninguna de


las cuales son de datos mixtos), el resultado es una serie de caracteres
de longitud fija. De lo contrario, el resultado será una serie de
caracteres de longitud variable, en la que el atributo de longitud es la
suma de los atributos de longitud de los operandos.

Si ambos operandos son series gráficas de longitud fija, el resultado es


una serie gráfica de longitud fija. De lo contrario, el resultado será
una serie de caracteres de longitud variable, en la que el atributo de
longitud será la suma de los atributos de longitud de los operandos.

Utilice el operador CONCAT en lugar del operador ||. El elemento de


código para el carácter | varía según el CCSID.

El CCSID del resultado lo determina el CCSID de los operandos, tal como se


explica en el apartado "Reglas de conversión para operaciones que combinan
series" en el tema 4.3.3. Tenga presente que como resultado de estas
reglas:

Si el operando es de datos de bit, el resultado serán datos de bit.

Si un operando es de datos mixtos y el otro de datos SBCS, el


resultado será datos mixtos. Sin embargo, esto no significa
necesariamente que el resultado sea datos mixtos bien formados.

Subtemas
2.14.2.1 Ejemplo

© Copyright IBM Corp. 1995, 1996


2.14.2 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplo
2.14.2.1 Ejemplo

Concatenar la columna NOMBRE con un espacio en blanco y la columna APELL.


NOMBRE CONCAT ' ' CONCAT APELL

© Copyright IBM Corp. 1995, 1996


2.14.2.1 - 1
DB2/400 Manual de Consulta SQL V3R7
Con operadores aritméticos
2.14.3 Con operadores aritméticos

Si se utilizan operadores aritméticos, el resultado de la expresión es un


número derivado de la aplicación de los operadores a los valores de los
operandos.

Si uno de los operandos puede ser nulo, el resultado también lo puede ser.
Si algún operando tiene el valor nulo, el resultado de la expresión es el
valor nulo. Los operadores aritméticos no deben aplicarse a las series de
caracteres. Por ejemplo, USER+2 no es válido.

El operador de prefijo + (más unitario) no cambia su operando. El


operador de prefijo - (menos unitario) invierte el signo de un operando
distinto de cero. Si el tipo de datos de A es entero pequeño, el tipo de
datos de -A es entero grande. El primer carácter del símbolo que sigue al
operador de prefijo no debe ser ni el signo más ni el signo menos.

Los operadores de infijo, +, -, *, / y **, especifican operaciones de


suma, resta, multiplicación, división y exponenciación, respectivamente.
El valor del segundo operando de la división no debe ser cero.

El resultado de un operador de exponenciación (**) es un número de coma


flotante de precisión doble. El resultado de los demás operadores depende
del tipo del operando.

© Copyright IBM Corp. 1995, 1996


2.14.3 - 1
DB2/400 Manual de Consulta SQL V3R7
Dos operandos enteros
2.14.4 Dos operandos enteros

Si los dos operandos de un operador aritmético son enteros con escala


cero, la operación se realiza en binario y el resultado es un entero
grande. El resto de la división se pierde. El resultado de una operación
aritmética de enteros (incluyendo el menos unitario) debe estar
comprendida en el rango de los enteros grandes. Si uno de los operandos
enteros tiene una escala distinta de cero, se convierte a un operando
decimal con la misma precisión y escala.

© Copyright IBM Corp. 1995, 1996


2.14.4 - 1
DB2/400 Manual de Consulta SQL V3R7
Operandos enteros y decimales
2.14.5 Operandos enteros y decimales

Si un operando es un entero con escala cero y el otro es decimal, la


operación se realiza en decimal utilizando una copia temporal del entero,
que se ha convertido a número decimal con una precisión y escala 0 según
lo definido en la tabla siguiente:

+------------------------------------------------------------------------+
¦ Operando ¦ Precisión de la copia decimal ¦
+---------------------------------------+--------------------------------¦
¦ Columna o variable: entero grande ¦ 11 ¦
+---------------------------------------+--------------------------------¦
¦ Columna o variable: entero pequeño ¦ 5 ¦
+---------------------------------------+--------------------------------¦
¦ Constante (incluyendo los ceros ¦ Igual al número de dígitos de ¦
¦ iniciales) ¦ la constante ¦
+------------------------------------------------------------------------+

Si un operando es un entero con una escala no cero, primero se convierte a


un operando decimal con la misma precisión y escala.

© Copyright IBM Corp. 1995, 1996


2.14.5 - 1
DB2/400 Manual de Consulta SQL V3R7
Dos operandos decimales
2.14.6 Dos operandos decimales

Si los dos operandos son decimales, la operación se realiza en decimal.


El resultado de toda operación aritmética decimal es un número decimal con
una precisión y escala que dependen de la operación y de la precisión y
escala de los operandos. Si la operación es sumar o restar y los
operandos no tienen la misma escala, la operación se realiza con una copia
temporal de uno de los operandos. La copia del operando más corto se
amplia con ceros finales de forma que su parte fraccionaria tenga el mismo
número de dígitos que el operando más largo.

A menos que se especifique lo contrario, todas las funciones y operaciones


que aceptan números decimales permiten una precisión de hasta 31 dígitos.
El resultado de una operación decimal no debe tener una precisión mayor
que 31.

© Copyright IBM Corp. 1995, 1996


2.14.6 - 1
DB2/400 Manual de Consulta SQL V3R7
Aritmética decimal en SQL
2.14.7 Aritmética decimal en SQL

Las fórmulas siguientes definen la precisión y la escala del resultado de


las operaciones decimales en SQL. Los símbolos p y s indican la precisión
y escala del primer operando y los símbolos p' y s' indican la precisión y
escala del segundo operando.

Subtemas
2.14.7.1 Suma y resta
2.14.7.2 Multiplicación
2.14.7.3 División

© Copyright IBM Corp. 1995, 1996


2.14.7 - 1
DB2/400 Manual de Consulta SQL V3R7
Suma y resta
2.14.7.1 Suma y resta

La escala del resultado de la suma y la resta es max (s,s'). La precisión


es min(31,max(p-s,p'-s') +max(s,s')+1).

© Copyright IBM Corp. 1995, 1996


2.14.7.1 - 1
DB2/400 Manual de Consulta SQL V3R7
Multiplicación
2.14.7.2 Multiplicación

La precisión del resultado de la multiplicación es min (31,p+p') y la


escala es min(31,s+s').

© Copyright IBM Corp. 1995, 1996


2.14.7.2 - 1
DB2/400 Manual de Consulta SQL V3R7
División
2.14.7.3 División

La precisión del resultado de la división es 31. La escala es 31-p+s-s'.


La escala no debe ser negativa.

© Copyright IBM Corp. 1995, 1996


2.14.7.3 - 1
DB2/400 Manual de Consulta SQL V3R7
Operandos de coma flotante
2.14.8 Operandos de coma flotante

Si uno de los operandos de un operador aritmético es de coma flotante, la


operación se realiza en coma flotante. Los operandos se convierten
primero en números de coma flotante de precisión doble, si es necesario.
De este modo, si algún elemento de una expresión es un número de coma
flotante, el resultado de la expresión es un número de coma flotante de
precisión doble.

Una operación en la que intervengan un número de coma flotante y un entero


se realiza con una copia temporal del entero, que se ha convertido a coma
flotante de precisión doble. Una operación en la que intervengan un
número de coma flotante y un número decimal se realiza con una copia
temporal del número decimal, que se ha convertido a coma flotante de
precisión doble. El resultado de una operación de coma flotante debe
estar dentro del rango de números de coma flotante.

© Copyright IBM Corp. 1995, 1996


2.14.8 - 1
DB2/400 Manual de Consulta SQL V3R7
Operandos de fecha y hora y duraciones
2.14.9 Operandos de fecha y hora y duraciones

Los valores de fecha y hora pueden incrementarse, disminuirse y restarse.


En estas operaciones pueden intervenir números decimales llamados
duraciones. Una duración es un número positivo o negativo que representa
un intervalo de tiempo. Hay cuatro tipos de duraciones:

Duraciones etiquetadas (véase el diagrama de la página 2.14.1)


Una duración etiquetada representa una unidad específica de tiempo
expresada mediante un número (que puede ser el resultado de una
expresión) seguido de una de las siete palabras clave de duración:
YEARS, MONTHS, DAYS, HOURS, MINUTES, SECONDS o MICROSECONDS. (17) El
número especificado se convierte como si se hubiera asignado a un
número DECIMAL (15,0). Las duraciones etiquetadas sólo pueden
utilizarse como operando de un operador aritmético en el que el otro
operando sea un valor de datos tipo DATE, TIME o TIMESTAMP. Así, la
expresión FCHCONTR + 2 MONTHS + 14 DAYS será válida, mientras que la
expresión FCHCONTR + (2 MONTHS + 14 DAYS) no lo será. En ambas
expresiones, las duraciones etiquetadas son 2 MONTHS y 14 DAYS.

Duración de fecha
Una duración de fecha representa un número de años, meses y días
expresados como número DECIMAL(8,0). A fin de poderlo interpretar
correctamente, el número debe tener el formato aaaammdd, donde aaaa
representa el número de años, mm el número de meses y dd el número de
días. El resultado de restar un valor de fecha de otro, tal como
sucede en la expresión FCHCONTR - FCHNACIM, es una duración de
fecha.

Duración de hora
Una duración de hora representa un número de horas, minutos y
segundos, expresado como número DECIMAL(6,0). Para poderlo
interpretar correctamente, el número debe tener el formato hhmmss
donde hh representa el número de horas; mm el número de minutos y ss
el número de segundos. El resultado de restar un valor de hora de
otro es una duración de hora.

Duración de indicación de la hora


Una duración de indicación de la hora representa un número de años,
meses, días, minutos, segundos y microsegundos, expresados como
número DECIMAL(20,6). Para poderlo interpretar correctamente, el
número debe tener el formato aaaammddhhmmsszzzzzz, donde aaaa, mm,
dd, hh, mm, ss, y zzzzzz representan, respectivamente, el número de
años, meses, días, horas, minutos, segundos y microsegundos. El
resultado de restar un valor de indicación de la hora de otro es una
duración de indicación de la hora.

(17) Observe que la forma singular de estas palabras clave


también es aceptable: YEAR, MONTH, DAY, HOUR, MINUTE, SECOND
y MICROSECOND.

© Copyright IBM Corp. 1995, 1996


2.14.9 - 1
DB2/400 Manual de Consulta SQL V3R7
Aritmética de fecha y hora en SQL
2.14.10 Aritmética de fecha y hora en SQL

Las únicas operaciones aritméticas que se pueden realizar en valores de


fecha y hora son la suma y la resta. Si un valor de fecha y hora es el
operando de la suma, el otro operando debe ser una duración. Las reglas
específicas que determinan la utilización del operador de suma con valores
de fecha y hora son las siguientes:

 Si un operando es una fecha, el otro operando debe ser una duración de


fecha o una duración etiquetada de años, meses o días.

 Si un operando es una hora, el otro operando debe ser una duración de


hora o una duración etiquetada de horas, minutos o segundos.

 Si un operando es una indicación de la hora, el otro operando debe ser


una duración. Cualquier tipo de duración es válido.

 Ninguno de los dos operandos del operador de suma puede ser un


marcador de parámetros.

Las reglas para la utilización del operador de resta en valores de fecha y


hora no son las mismas que para la suma, porque un valor de fecha y hora
no puede restarse de una duración, y porque la operación de restar dos
valores de fecha y hora no es igual que la operación de restar una
duración de un valor de fecha y hora. Las reglas específicas que
determinan la utilización del operador de resta con valores de fecha y
hora son las siguientes:

 Si el primer operando es una fecha, el segundo operando debe ser


también una fecha, una duración de fecha, una representación de serie
de una fecha o una duración etiquetada de años, meses o días.

 Si el segundo operando es una fecha, el primer operando debe ser una


fecha o una representación de serie de una fecha.

 Si el primer operando es una hora, el segundo operando debe ser una


hora, una duración de hora, una representación de serie de una hora o
una duración etiquetada de horas, minutos o segundos.

 Si el segundo operando es una hora, el primer operando debe ser una


hora o una representación de serie de una hora.

 Si el primer operando es una indicación de la hora, el segundo


operando debe ser una indicación de la hora, una representación de
serie de una indicación de la hora o una duración.

 Si el segundo operando es una indicación de la hora, el primer


operando debe ser una indicación de la hora o una representación de
serie de una indicación de la hora.

 Ninguno de los dos operandos del operador de resta puede ser un


marcador de parámetros.

Subtemas
2.14.10.1 Aritmética de fechas
2.14.10.2 Aritmética de horas
2.14.10.3 Aritmética de indicaciones de la hora

© Copyright IBM Corp. 1995, 1996


2.14.10 - 1
DB2/400 Manual de Consulta SQL V3R7
Aritmética de fechas
2.14.10.1 Aritmética de fechas

Las fechas pueden restarse, incrementarse o disminuirse.

Restar fechas: El resultado de restar una fecha (FECHA2) de otra (FECHA1)


es una duración de fecha que especifica el número de años, meses, y días
entre las dos fechas. El tipo de datos del resultado es DECIMAL(8,0). Si
FECHA1 es mayor o igual que FECHA2, FECHA2 se resta de FECHA1. Sin
embargo, si FECHA1 es menor que FECHA2, a FECHA2 se le resta FECHA1 y el
signo del resultado se hace negativo. La siguiente descripción de
procedimiento clarifica los pasos que conlleva la operación
RESULTADO=FECHA1-FECHA2

Si DAY(FECHA2) <= DAY(FECHA1)


entonces DAY(RESULTADO) = DAY(FECHA1) - DAY(FECHA2).

Si DAY(FECHA2) > DAY(FECHA1)


entonces DAY(RESULTADO) = N + DAY(FECHA1) - DAY(FECHA2)
donde N = último día del MONTH(FECHA2).
MONTH(DATE2) se incrementa entonces en 1.

Si MONTH(FECHA2) <= MONTH(FECHA1)


entonces MONTH(RESULTADO) = MONTH(FECHA1) - MONTH(FECHA2).

Si MONTH(FECHA2) > MONTH(FECHA1)


entonces MONTH(RESULTADO) = 12 + MONTH(FECHA1) - MONTH(FECHA2).
YEAR(FECHA2) se incrementa entonces en 1.

YEAR(RESULTADO) = YEAR(FECHA1) - YEAR(FECHA2).

Por ejemplo, el resultado de DATE('3/15/2000') - '12/31/1999' es 215 (o


una duración de 0 años, 2 meses y 15 días).

Incrementar o disminuir fechas: El resultado de sumar una duración a una


fecha, o de restar una duración de una fecha, es también una fecha (a los
efectos de esta operación, un mes es el equivalente de una página del
calendario. Por tanto, sumar meses a una fecha es como ir pasando las
páginas de un calendario, empezando por la página donde aparece la fecha
en cuestión). El resultado debe estar comprendido entre las fechas 1 de
enero del año 0001 y 31 de diciembre del año 9999, ambas inclusive. Si se
suma o resta una duración de años, sólo se verá afectada la parte de la
fecha correspondiente a los años. El mes permanece sin cambios así como
los días, a menos que el resultado fuera un 29 de febrero de un año no
bisiesto. En ese caso, el día se cambia a 28 y el SQLWARN6 de la SQLCA se
establece en 'W' para indicar el ajuste de fin de mes.

De modo similar, si se suma o resta una duración de meses, sólo los meses
y, si es necesario, los años se verán afectados. La parte de la fecha
correspondiente al día permanece sin cambios a menos que el resultado no
sea válido (por ejemplo un 31 de septiembre). En ese caso, el día se
establece en el último día del mes y el SQLWARN6 del SQLCA se establece en
'W' para indicar el ajuste de fin de mes.

Sumar o restar una duración de días afectaría, naturalmente, a la parte de


la fecha correspondiente al día y, potencialmente, al mes y al año. Sumar
una duración etiquetada de DAYS no provocará ningún ajuste de fin de mes.

Las duraciones de fecha, ya sean positivas o negativas, también pueden


sumarse a o restarse de fechas. Como en el caso de las duraciones
etiquetadas, el resultado es una fecha válida, y se establece un indicador
de aviso en la SQLCA cada vez que es necesario un ajuste de fin de mes.

Cuando se suma una duración de fecha positiva a una fecha, o cuando se


resta una duración de fecha negativa de una fecha, la fecha se incrementa
en el número especificado de años, meses y días, en ese orden. Así pues,
FECHA1 + X, donde X es un número DECIMAL(8,0) positivo, equivale a la
expresión:

FECHA1 + YEAR(X) años + MONTH(X) meses + DAY(X) días

Cuando se resta una duración de fecha positiva de una fecha, o cuando se


suma una duración de fecha negativa a una fecha, la fecha disminuye en el
número especificado de días, meses y años, en ese orden. Así pues, FECHA1
- X, donde X es un número DECIMAL(8,0) positivo, equivale a la expresión:

FECHA1 - DAY(X) días - MONTH(X) meses - YEAR(X) años

Cuando se suman duraciones a fechas, sumando un mes a una fecha dada, el


resultado es la misma fecha del mes posterior a menos que esa fecha no
exista en el mes siguiente. En ese caso, la fecha se establece en la del
último día del mes posterior. Por ejemplo, el 28 de enero más un mes da
el 28 de febrero; y el 29, 30 ó 31 de enero más un mes da un resultado de
28 de febrero o, en año bisiesto, 29 de febrero.

Nota: Si se suman uno o más meses a una fecha dada y a continuación se


resta el mismo número de meses del resultado, la fecha final no
tiene por qué ser necesariamente la fecha original.

© Copyright IBM Corp. 1995, 1996


2.14.10.1 - 1
DB2/400 Manual de Consulta SQL V3R7
Aritmética de horas
2.14.10.2 Aritmética de horas

Las horas se pueden restar, incrementar o disminuir.

Restar horas: El resultado de restar una hora (HORA2) de otra (HORA1) es


una duración de hora que especifica el número de horas, minutos y segundos
entre las dos horas. El tipo de datos del resultado es DECIMAL(6,0). Si
HORA1 es mayor o igual que HORA2, a HORA1 se le resta HORA2. Sin embargo,
si HORA1 es menor que HORA2, a HORA2 se le resta HORA1 y el signo del
resultado se hace negativo. La siguiente descripción de procedimiento
clarifica los pasos de la operación RESULTADO= HORA1 - HORA2.

Si SECOND(HORA2) <= SECOND(HORA1)


entonces SECOND(RESULTADO) = SECOND(HORA1) - SECOND(HORA2).

Si SECOND(HORA2) > SECOND(HORA1)


entonces SECOND(RESULTADO) = 60 + SECOND(HORA1) - SECOND(HORA2).
MINUTE(HORA2) se incrementa entonces en 1.

Si MINUTE(HORA2) <= MINUTE(HORA1)


entonces MINUTE(RESULTADO) = MINUTE(HORA1) - MINUTE(HORA2).

Si MINUTE(HORA2) > MINUTE(HORA1)


entonces MINUTE(RESULTADO) = 60 + MINUTE(HORA1) - MINUTE(HORA2).
HOUR(HORA2) se incrementa entonces en 1.

HOUR(RESULTADO) = HOUR(HORA1) - HOUR(HORA2).

Por ejemplo, el resultado de HORA('11:02:26') - '00:32:56' es 102930 (una


duración de 10 horas, 29 minutos y 30 segundos).

Incrementar y disminuir horas: El resultado de sumar una duración a una


hora, o de restar una duración de una hora, es también una hora. Se
descarta cualquier desbordamiento o subdesbordamiento de horas, con lo que
se asegura que el resultado es siempre una hora. Si se suma o resta una
duración de horas, sólo la parte de la hora correspondiente a las horas se
verá afectada. Los minutos y los segundos no cambian.

De modo similar, si se suma o resta una duración de minutos, sólo se verán


afectados los minutos y, si es necesario, las horas. La parte de la hora
correspondiente a los segundos permanece sin cambios.

El hecho de sumar o restar una duración de segundos afectará,


naturalmente, a la parte de la hora correspondiente a los segundos y,
potencialmente, a los minutos y horas.

Las duraciones de hora, ya sean positivas o negativas, también pueden


sumarse a y restarse de horas. El resultado es una hora que se ha
incrementado o disminuido en el número especificado de horas, minutos y
segundos, en ese orden. HORA1 + X, donde "X" es un número DECIMAL(6,0),
equivale a la expresión:

HORA1 + HOUR(X) horas + MINUTE(X) minutos + SECOND(X) segundos

© Copyright IBM Corp. 1995, 1996


2.14.10.2 - 1
DB2/400 Manual de Consulta SQL V3R7
Aritmética de indicaciones de la hora
2.14.10.3 Aritmética de indicaciones de la hora

Las indicaciones de la hora se pueden restar, incrementar o disminuir.

Restar indicaciones de la hora: El resultado de restar una indicación de


la hora (TS2) de otra (TS1) es una duración de indicación de la hora que
especifica el número de años, meses, días, horas, minutos, segundos y
microsegundos transcurridos entre las dos indicaciones de la hora. El
tipo de datos del resultado es DECIMAL(20,6). Si TS1 es mayor o igual que
TS2, a TS1 se le resta TS2. No obstante, si TS1 es menor que TS2, a TS2
se le resta TS1 y el signo del resultado se hace negativo. La siguiente
descripción de procedimiento clarifica los pasos de la operación RESULTADO
= TS1 - TS2.

Si MICROSECOND(TS2) <= MICROSECOND(TS1)


entonces MICROSECOND(RESULTADO) = MICROSECOND(TS1) -
MICROSECOND(TS2).

Si MICROSECOND(TS2) > MICROSECOND(TS1)


entonces MICROSECOND(RESULTADO) = 1000000 +
MICROSECOND(TS1) - MICROSECOND(TS2)
y SECOND(TS2) se incrementa en 1.

La parte las indicaciones de la hora correspondiente a los segundos y


minutos se restan tal como se especifica en las reglas para restar
horas.

Si HOUR(TS2) <= HOUR(TS1)


entonces HOUR(RESULTADO) = HOUR(TS1) - HOUR(TS2).

Si HOUR(TS2) > HOUR(TS1)


entonces HOUR(RESULTADO) = 24 + HOUR(TS1) - HOUR(TS2)
y DAY(TS2) se incrementa en 1.

La parte de la indicación de la hora correspondiente a la fecha se


resta tal como se especifica en las reglas para restar fechas.

Incrementar y disminuir indicaciones de la hora: El resultado de sumar


una duración a una indicación de la hora o de restar una duración de una
indicación de la hora es también una indicación de la hora. La aritmética
de fechas y horas se realiza tal como se ha definido anteriormente, con la
única excepción que se introduce un desbordamiento o un subdesbordamiento
de horas en la parte del resultado correspondiente a la fecha, la cual
debe estar dentro del rango de fechas válidas. Los microsegundos se
desbordan a segundos.

© Copyright IBM Corp. 1995, 1996


2.14.10.3 - 1
DB2/400 Manual de Consulta SQL V3R7
Orden de precedencia de las operaciones
2.14.11 Orden de precedencia de las operaciones

Las expresiones encerradas entre paréntesis se evalúan primero. Cuando el


orden de evaluación no se especifica por medio de paréntesis, la elevación
a una potencia se aplica después de los operadores de prefijo (como por
ejemplo, -, menos unitario) y antes que la multiplicación y la división.
Estas se aplican antes que la suma y la resta. Los operadores situados en
el mismo nivel de precedencia se aplican de izquierda a derecha. La tabla
siguiente muestra la prioridad de todos los operadores.

+------------------------------------------------------------------------+
¦ Prioridad ¦ Operadores ¦
+-----------+------------------------------------------------------------¦
¦ 1 ¦ +, - (cuando se utiliza para valores numéricos) ¦
+-----------+------------------------------------------------------------¦
¦ 2 ¦ ** ¦
+-----------+------------------------------------------------------------¦
¦ 3 ¦ *, /, CONCAT, || ¦
+-----------+------------------------------------------------------------¦
¦ 4 ¦ +, - (cuando se utiliza entre dos operandos) ¦
+------------------------------------------------------------------------+

Subtemas
2.14.11.1 Ejemplo

© Copyright IBM Corp. 1995, 1996


2.14.11 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplo
2.14.11.1 Ejemplo

1.10 * (SUELDO + BONIF) + SUELDO / :VAR3


   
+-+ +-+ +-+ +-+
¦2¦ ¦1¦ ¦4¦ ¦3¦
+-+ +-+ +-+ +-+

© Copyright IBM Corp. 1995, 1996


2.14.11.1 - 1
DB2/400 Manual de Consulta SQL V3R7
Predicados
2.15 Predicados

Un predicado especifica una condición que es cierta, falsa o desconocida


respecto a una fila o grupo dados. Para todos los tipos de predicados
rigen las reglas siguientes:

 Todos los valores especificados en un predicado deben ser compatibles.

 El valor de una variable del lenguaje principal no debe ser una serie
de longitud superior a 32766 bytes.

Subtemas
2.15.1 Predicado básico
2.15.2 Predicado cuantificado
2.15.3 Predicado BETWEEN
2.15.4 Predicado EXISTS
2.15.5 Predicado IN
2.15.6 Predicado LIKE
2.15.7 Predicado NULL

© Copyright IBM Corp. 1995, 1996


2.15 - 1
DB2/400 Manual de Consulta SQL V3R7
Predicado básico
2.15.1 Predicado básico

+------------------------------------------------------------------------+
¦ ¦
¦ >--expresión---- = -------expresión----------------------------------> ¦
¦ +- <> -¦ +-(subselección)-+ ¦
¦ +- ¬= -¦ ¦
¦ +- < --¦ ¦
¦ +- > --¦ ¦
¦ +- <= -¦ ¦
¦ +- ¬> -¦ ¦
¦ +- >= -¦ ¦
¦ +- ¬< -+ ¦
¦ ¦
+------------------------------------------------------------------------+

Nota: Algunos teclados deben utilizar valores hexadecimales para el


símbolo de negación (¬). Dicho valor hexadecimal varía y depende
del teclado que se utilice. Por esta razón, se prefiere utilizar
los símbolos <>, <= y >=.

Un predicado básico compara dos valores. Si los operandos del predicado


contienen datos SBCS o mixtos, y si la secuencia de clasificación en vigor
al ejecutarse la sentencia no es *HEX, la comparación de los operandos se
realiza utilizando los valores significativos de los operandos. Los
valores significativos están basados en la secuencia de clasificación.

Las subselecciones incluidas en predicados básicos deben especificar una


sola columna de resultados y no deben devolver más de un valor.

Si el valor de uno de los operandos es nulo o el resultado de la


subselección no devuelve ninguna selección, el resultado del predicado se
desconoce. De lo contrario, el resultado es o bien verdadero o bien
falso.

Para los valores x e y:

Predicado Es verdadero si y sólo si...


x = y x es igual a y
x<> y x es distinto de y
x¬= y x es distinto de y
x < y x es menor que y
x > y x es mayor que y
x>= y x es mayor o igual que y
x<= y x es menor o igual que y
x¬< y x no es menor que y
x¬> y x no es mayor que y

Subtemas
2.15.1.1 Ejemplos

© Copyright IBM Corp. 1995, 1996


2.15.1 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplos
2.15.1.1 Ejemplos

 NUMEMP = '528671'
 PRTPERS <> :VAR1
 SUELDO + BONIF + COMI < 20000
 SUELDO > (SELECT AVG(SUELDO) FROM EMPLEADO)

© Copyright IBM Corp. 1995, 1996


2.15.1.1 - 1
DB2/400 Manual de Consulta SQL V3R7
Predicado cuantificado
2.15.2 Predicado cuantificado

+------------------------------------------------------------------------+
¦ ¦
¦ >--expresión---- = -------SOME----(subselección)---------------------> ¦
¦ +- <> -¦ +-ANY--¦ ¦
¦ +- ¬= -¦ +-ALL--+ ¦
¦ +- < --¦ ¦
¦ +- > --¦ ¦
¦ +- <= -¦ ¦
¦ +- ¬> -¦ ¦
¦ +- >= -¦ ¦
¦ +- ¬< -+ ¦
¦ ¦
+------------------------------------------------------------------------+

Un predicado cuantificado compara un valor con un conjunto de valores.

La subselección debe especificar una única columna de resultado y puede


devolver cualquier número de valores, ya sean nulos o no nulos. Si los
operandos del predicado contienen datos SBCS o mixtos, y si la secuencia
de clasificación en vigor al ejecutarse la sentencia no es *HEX, la
comparación se realiza utilizando los valores significativos de los
operandos. Los valores significativos están basados en la secuencia de
clasificación.

Cuando se especifica ALL, el resultado del predicado es:

 Verdadero si el resultado de la subselección no devuelve ninguna


selección, o si la relación especificada es verdadera para todos los
valores devueltos por la subselección.
 Falso si la relación especificada es falsa para al menos un valor
devuelto por la subselección.
 Desconocido si la relación especificada no es falsa para cualquiera de
los valores devueltos por la subselección y al menos una comparación
se desconocida a causa de un valor nulo.

Cuando se especifica SOME o ANY, el resultado del predicado es:

 Verdadero si la relación especificada es verdadera para al menos un


valor devuelto por la subselección.
 Falso si el resultado de la subselección no devuelve ninguna
selección, o si la relación especificada es falsa para todos los
valores devueltos por la subselección.
 Desconocido si la relación especificada no es verdadera para
cualquiera de los valores devueltos por la subselección y al menos una
comparación se desconocida a causa de un valor nulo.

Subtemas
2.15.2.1 Ejemplos

© Copyright IBM Corp. 1995, 1996


2.15.2 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplos
2.15.2.1 Ejemplos

Utilizar estas tablas cuando se haga referencia a los ejemplos siguientes.

+----+ +----+
TBLA: ¦COLA¦ TBLB: ¦COLB¦
+----¦ +----¦
¦1 ¦ ¦2 ¦
¦2 ¦ ¦3 ¦
¦3 ¦ +----+
¦4 ¦
¦nulo¦
+----+

 La sentencia SELECT siguiente da como resultado 2,3. La subselección


devuelve (2,3). COLA, en las filas 2 y 3, es igual a al menos uno de
estos valores.

SELECT * FROM TBLA WHERE COLA = ANY(SELECT COLB FROM TBLB)

 La sentencia SELECT siguiente da como resultado 3,4. La subselección


devuelve (2,3). COLA, en las filas 3 y 4, es mayor que al menos uno
de estos valores.

SELECT * FROM TBLA WHERE COLA > ANY(SELECT COLB FROM TBLB)

 La sentencia SELECT siguiente da como resultado 4. La subselección


devuelve (2,3). COLA, en la fila 4, es la única que es mayor que
estos dos valores.

SELECT * FROM TBLA WHERE COLA > ALL(SELECT COLB FROM TBLB)

 La sentencia SELECT siguiente da como resultado 1,2,3,4 y nulo. El


resultado de la subselección no devuelve ninguna selección. Así pues,
el predicado es verdadero para todas las filas de TBLA.

SELECT * FROM TBLA WHERE COLA > ALL(SELECT COLB FROM TBLB WHERE COLB<0)

 La sentencia SELECT siguiente da como resultado el conjunto vacío. El


resultado de la subselección no devuelve ninguna selección. Por
tanto, el predicado es falso para todas las filas de TBLA.

SELECT * FROM TBLA WHERE COLA > ANY(SELECT COLB FROM TBLB WHERE COLB<0)

© Copyright IBM Corp. 1995, 1996


2.15.2.1 - 1
DB2/400 Manual de Consulta SQL V3R7
Predicado BETWEEN
2.15.3 Predicado BETWEEN

+------------------------------------------------------------------------+
¦ ¦
¦ >--expresión-----------BETWEEN--expresión--AND--expresión------------> ¦
¦ +-NOT-+ ¦
¦ ¦
+------------------------------------------------------------------------+

El predicado BETWEEN compara un valor con un rango de valores. Si está en


vigor una secuencia de clasificación distinta de *HEX al ejecutar la
sentencia y el predicado BETWEEN conlleva datos SBCS o mixtos, se comparan
los valores significativos de las series en lugar de los valores. El
valor significativo está basado en la secuencia de clasificación.

El predicado BETWEEN:

valor1 BETWEEN valor2 AND valor3

equivale lógicamente a la condición de búsqueda:

valor1 >= valor2 AND valor1 <= valor3

El predicado BETWEEN:

valor1 NOT BETWEEN valor2 AND valor3

equivale a la condición de búsqueda:

NOT(valor1 BETWEEN valor2 AND valor3);es decir,


valor1 < valor2 OR valor1 > valor3.

Si los operandos del predicado BETWEEN son series con CCSID diferentes, se
convierten si se han especificado las anteriormente mencionadas
condiciones de búsqueda lógicamente equivalentes.

Dada una mezcla de valores de fecha y hora y representaciones de serie de


valores de fecha y hora, se convierten todos los valores al tipo de datos
del operando de fecha y hora.

Subtemas
2.15.3.1 Ejemplos

© Copyright IBM Corp. 1995, 1996


2.15.3 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplos
2.15.3.1 Ejemplos

EMPLEADO.SUELDO BETWEEN 20000 AND 40000

SUELDO NOT BETWEEN 20000 + :HV1 AND 40000

© Copyright IBM Corp. 1995, 1996


2.15.3.1 - 1
DB2/400 Manual de Consulta SQL V3R7
Predicado EXISTS
2.15.4 Predicado EXISTS

+------------------------------------------------------------------------+
¦ ¦
¦ >--EXISTS--(subselección)--------------------------------------------> ¦
¦ ¦
+------------------------------------------------------------------------+

El predicado EXISTS comprueba la existencia de determinadas filas. La


subselección puede especificar cualquier número de columnas y

 El resultado es verdadero sólo si el número de filas especificado por


la subselección no es cero.
 El resultado es falso sólo si el número de filas especificado por la
subselección es cero.
 El resultado no puede ser desconocido.

Los valores devueltos por la subselección no se tienen en cuenta.

Subtemas
2.15.4.1 Ejemplo

© Copyright IBM Corp. 1995, 1996


2.15.4 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplo
2.15.4.1 Ejemplo

EXISTS (SELECT * FROM EMPLEADO WHERE SUELDO > 60000)

© Copyright IBM Corp. 1995, 1996


2.15.4.1 - 1
DB2/400 Manual de Consulta SQL V3R7
Predicado IN
2.15.5 Predicado IN

+------------------------------------------------------------------------+
¦ ¦
¦ >--expresión-----------IN--------------------------------------------> ¦
¦ +-NOT-+ ¦
¦ ¦
¦ >----(subselección)--------------------------------------------------> ¦
¦ ¦ <-,-----------------------------+ ¦ ¦
¦ +-(-----variable-lenguaje-principal-----)-¦ ¦
¦ ¦ +-constante-------------------¦ ¦ ¦
¦ ¦ +-registro-especial-----------+ ¦ ¦
¦ +---expresión-----------------------------+ ¦
¦ ¦
+------------------------------------------------------------------------+

El predicado IN compara un valor con un conjunto de valores. Si está en


vigor una secuencia de clasificación distinta de *HEX al ejecutar la
sentencia y el predicado IN conlleva datos SBCS o mixtos, se comparan los
valores significativos de las series en lugar de los valores reales. Los
valores significativos están basados en la secuencia de clasificación.

En el formato de subselección, la subselección debe identificar una única


columna de resultado y puede devolver cualquier número de valores, ya sean
nulos o no nulos.

Un predicado IN con el formato:

expresión IN (subselección)

equivale a un predicado cuantificado con el formato:

expresión = ANY (subselección)

Un predicado IN con el formato:

expresión NOT IN (subselección)

equivale a un predicado cuantificado con el formato:

expresión <> ALL (subselección)

Un predicado IN con el formato:

expresión IN expresión

equivale a un predicado básico con el formato:

expresión = expresión

Un predicado IN con el formato:

expresión IN (valor1, valor2, ..., valorN)

equivale lógicamente a:

expresión IN (SELECT * FROM R)

Supongamos que T es una tabla con una sola fila. R es una tabla temporal
formada por la siguiente selección completa:

SELECT valor1 FROM T


UNION
SELECT valor2 FROM T
UNION
.
.
.
UNION
SELECT valorN FROM T

Cada variable del lenguaje principal debe identificar una estructura o


variable descrita de acuerdo con la regla de declaración de variables o
estructuras del lenguaje principal.

Si los operandos del predicado IN tienen diferentes tipos de datos o


atributos, las reglas que se utilizan para determinar el tipo de datos
para la evaluación del predicado IN son las que corresponden a UNION y
UNION ALL. Para obtener una descripción, consulte el apartado "Reglas
para tipos de datos de resultado" en el tema 4.3.2.

Si los operandos del predicado IN son series con CCSID diferentes, las
reglas utilizadas para determinar qué operandos se convierten son las
correspondientes a las operaciones que combinan series. Para obtener una
descripción, consulte el apartado "Reglas de conversión para operaciones
que combinan series" en el tema 4.3.3.

Subtemas
2.15.5.1 Ejemplos

© Copyright IBM Corp. 1995, 1996


2.15.5 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplos
2.15.5.1 Ejemplos

NUMDEPT IN ('D01', 'B01', 'C01')

NUMEMP IN(SELECT NUMEMP FROM EMPLEADO WHERE DEPTTRAB = 'E11')

© Copyright IBM Corp. 1995, 1996


2.15.5.1 - 1
DB2/400 Manual de Consulta SQL V3R7
Predicado LIKE
2.15.6 Predicado LIKE

+------------------------------------------------------------------------+
¦ ¦
¦ >>--expresión-----------LIKE----USER---------------------------------> ¦
¦ +-NOT-+ +-CURRENT_SERVER--------------¦ ¦
¦ +-variable-lenguaje-principal-¦ ¦
¦ +-constante-serie-------------+ ¦
¦ ¦
¦ >------------------------------------------------------------------->< ¦
¦ +-ESCAPE----variable-lenguaje-principal---+ ¦
¦ +-constante-serie-------------+ ¦
¦ ¦
+------------------------------------------------------------------------+

El predicado LIKE realiza búsquedas de series que respondan a un cierto


patrón. El patrón lo especifica una serie en la que el signo de subrayado
y de porcentaje tienen un significado especial. Si está en vigor una
secuencia de clasificación distinta de *HEX al ejecutar la sentencia y el
predicado LIKE conlleva datos SBCS o mixtos, se comparan los valores
significativos de las series en lugar de los valores reales. Los valores
significativos están basados en la secuencia de clasificación.

La expresión debe identificar una serie. Si se especifica una variable de


lenguaje principal, debe identificar una variable de serie (no una
estructura) descrita en el programa de acuerdo con las reglas de
declaración de variables del lenguaje principal de serie. Si la expresión
contiene datos de tipo carácter, los términos carácter, signo de
porcentaje y subrayado que aparecen en la exposición siguiente hacen
referencia a caracteres de un solo byte; si la expresión contiene datos
gráficos, dichos términos hacen referencia a caracteres de doble byte o
caracteres UCS-2. Si la expresión contiene datos gráficos UCS-2, la
cláusula de escape y el patrón deben especificarse como variables del
lenguaje principal o marcadores de parámetros. Los blancos finales del
patrón forman parte del mismo.

Descripción simple: Para expresiones gráficas y de caracteres, una


descripción simple del patrón LIKE es la siguiente:

 El signo de subrayado (_) representa cualquier carácter único.


 El signo de porcentaje (%) representa una serie de cero o más
caracteres.
 Los demás caracteres se representan a sí mismos.

Descripción rigurosa: Supongamos que x denota un valor de una expresión e


y la serie especificada por el segundo operando.

La serie y se interpreta como una secuencia del número mínimo de


especificadores de subserie de manera que cada carácter de y forme parte
exactamente de un especificador de subserie. Un especificador de subserie
es un signo de subrayado, un signo de porcentaje o cualquier secuencia no
vacía de caracteres que no sea un subrayado ni un signo de porcentaje.

El resultado del predicado es desconocido si x o y es el valor nulo; de lo


contrario, el resultado del predicado es o verdadero o falso. El
resultado es verdadero si tanto x como y son series vacías o si existe una
partición de x en subseries tales que:

 Una subserie de x es una secuencia de cero o más caracteres contiguos


y cada carácter de x forma parte exactamente de una subserie.

 Si el enésimo especificador de subserie es un subrayado, la enésima


subserie de x es cualquier carácter único.

 Si el enésimo especificador de subserie es un signo de porcentaje, la


enésima subserie de x es cualquier secuencia de cero o más caracteres.

 Si el enésimo especificador de subserie no es un signo de porcentaje


ni un signo de subrayado, la enésima subserie de x es igual a ese
especificador de subserie y tiene la misma longitud que dicho
especificador de subserie.

 El número de subseries de x es igual al número de especificadores de


subserie.

En consecuencia, si y es una serie vacía y x no es una serie vacía, el


resultado es falso.

El predicado x NOT LIKE y equivale a la condición de búsqueda NOT(x LIKE


y).

Si el CCSID del carácter de escape es diferente del CCSID del patrón, se


convierte al CCSID del patrón antes de aplicarse el predicado. Si el
CCSID del patrón es diferente del CCSID de la expresión, cada
especificador de subserie del patrón se convierte al CCSID de la expresión
antes de aplicar el predicado.

Datos mixtos: Si la expresión es de datos mixtos, puede contener


caracteres de doble byte y el patrón puede incluir caracteres SBCS y
caracteres DBCS. En ese caso, los caracteres especiales de y se
interpretan de la siguiente manera:

 Un subrayado SBCS hace referencia a un carácter SBCS.

© Copyright IBM Corp. 1995, 1996


2.15.6 - 1
DB2/400 Manual de Consulta SQL V3R7
Predicado LIKE
 Un subrayado DBCS hace referencia a un carácter DBCS.

 Un signo de porcentaje (ya sea SBCS o DBCS) hace referencia a


cualquier número de caracteres de cualquier tipo, ya sean SBCS o DBCS.

 Los desplazamientos a teclado redundantes no se pasan por alto.

Datos gráficos UCS-2: Si la expresión es de datos gráficos UCS-2, el


patrón puede incluir uno o ambos elementos de código a los que se da
soporte para el signo de porcentaje y el subrayado de UCS-2. Los elementos
de código a los que se da soporte para el subrayado de UCS-2 son X'005F' y
X'FF3F'. Los elementos de código a los que se da soporte para el signo de
porcentaje de UCS-2 son X'0025' y X'FF05'.

Cláusula ESCAPE: La cláusula ESCAPE permite la definición de patrones


para su utilización con vistas a comparar valores que contengan los
caracteres de subrayado y de porcentaje reales. Las reglas que rigen la
utilización de la cláusula ESCAPE son las siguientes:

 Si se identifica una expresión de serie de caracteres, el carácter de


escape debe ser una constante o variable de serie de caracteres de
longitud 1.

 Si se identifica una expresión de serie gráfica, el carácter de escape


debe ser una constante o variable de serie gráfica de longitud 1.

 Si la variable-lenguaje-principal de ESCAPE tiene una variable de


indicador negativa, el resultado del predicado es desconocido.

 La variable-lenguaje-principal o la constante-serie que forman el


patrón no deben contener el carácter de escape excepto cuando vayan
seguidas de él, del signo de porcentaje o del signo de subrayado.

Por ejemplo, si '+' es el carácter de escape, cualquier aparición de


'+' distinta de '++', '+_' o '+%' en el patrón es un error.

 El carácter de escape puede ser un marcador de parámetros.

Subtemas
2.15.6.1 Ejemplos

© Copyright IBM Corp. 1995, 1996


2.15.6 - 2
DB2/400 Manual de Consulta SQL V3R7
Ejemplos
2.15.6.1 Ejemplos

Ejemplo 1: Buscar la serie 'SISTEMAS' que aparece en alguna parte de la


columna NOMPROY de la tabla PROYECTO.

PROYECTO.NOMPROY LIKE '%SISTEMAS%'

Ejemplo 2: Buscar una serie cuyo primer carácter sea 'J' y que tenga una
longitud de dos caracteres exactamente en la columna NOMBRE de la tabla
EMPLEADO.

EMPLEADO.NOMBRE LIKE 'J_'

Ejemplo 3: En este ejemplo:

C1 LIKE 'AAAA+%BBB%' ESCAPE '+'

'+' es el carácter de escape e indica que la búsqueda se realiza para


hallar una serie que empiece con 'AAAA%BBB'. '+%' se interpreta como una
sola aparición de '%' en el patrón.

Ejemplo 4: En la siguiente tabla de ejemplos EBCDIC vamos a suponer que


COL1 es de datos mixtos. La tabla muestra los resultados cuando los
predicados de la primera columna se evalúan utilizando los valores de COL1
que figuran en la segunda columna:

© Copyright IBM Corp. 1995, 1996


2.15.6.1 - 1
DB2/400 Manual de Consulta SQL V3R7
Predicado NULL
2.15.7 Predicado NULL

+------------------------------------------------------------------------+
¦ ¦
¦ >--expresión--IS-----------NULL--------------------------------------> ¦
¦ +-NOT-+ ¦
¦ ¦
+------------------------------------------------------------------------+

El predicado NULL realiza una prueba para ver si hay valores nulos.

El resultado de un predicado NULL no puede ser desconocido. Si el valor


de la expresión es nulo, el resultado es verdadero. Si el valor no es
nulo, el resultado es falso. Si se especifica NOT, el resultado se
invierte.

Subtemas
2.15.7.1 Ejemplos

© Copyright IBM Corp. 1995, 1996


2.15.7 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplos
2.15.7.1 Ejemplos

EMPLEADO.TELF IS NULL

SUELDO IS NOT NULL

© Copyright IBM Corp. 1995, 1996


2.15.7.1 - 1
DB2/400 Manual de Consulta SQL V3R7
Condiciones de búsqueda
2.16 Condiciones de búsqueda

+------------------------------------------------------------------------+
¦ ¦
¦ >-------------predicado----------------------------------------------> ¦
¦ +-NOT-+ +-(condición-búsqueda)-+ ¦
¦ ¦
¦ <----------------------------------------------+ ¦
¦ >--------------------------------------------------------------------> ¦
¦ +---AND---------------predicado--------------+ ¦
¦ +-OR--+ +-NOT-+ +-(condición-búsqueda)-+ ¦
¦ ¦
+------------------------------------------------------------------------+

Una condición de búsqueda especifica una condición que es verdadera, falsa


o desconocida respecto a una fila o grupo dados.

El resultado de una condición de búsqueda se deriva aplicando los


operadores lógicos especificados (AND, OR, NOT) al resultado de cada uno
de los predicados especificados. Si no se especifican operadores lógicos,
el resultado de la condición de búsqueda es el resultado del predicado
especificado.

AND y OR se definen en la tabla siguiente en la que P y Q son cualquier


predicado:

+---------------------------------------------------+
¦ Tabla 5. Tablas de verdad de AND y OR ¦
+---------------------------------------------------¦
¦ P ¦ Q ¦ P AND Q ¦ P OR Q ¦
+------------+------------+------------+------------¦
¦ Verdadero ¦ Verdadero ¦ Verdadero ¦ Verdadero ¦
+------------+------------+------------+------------¦
¦ Verdadero ¦ Falso ¦ Falso ¦ Verdadero ¦
+------------+------------+------------+------------¦
¦ Verdadero ¦ Desconocido¦ Desconocido¦ Verdadero ¦
+------------+------------+------------+------------¦
¦ Falso ¦ Verdadero ¦ Falso ¦ Verdadero ¦
+------------+------------+------------+------------¦
¦ Falso ¦ Falso ¦ Falso ¦ Falso ¦
+------------+------------+------------+------------¦
¦ Falso ¦ Desconocido¦ Falso ¦ Desconocido¦
+------------+------------+------------+------------¦
¦ Desconocido¦ Verdadero ¦ Desconocido¦ Verdadero ¦
+------------+------------+------------+------------¦
¦ Desconocido¦ Falso ¦ Falso ¦ Desconocido¦
+------------+------------+------------+------------¦
¦ Desconocido¦ Desconocido¦ Desconocido¦ Desconocido¦
+---------------------------------------------------+

NOT(verdadero) es falso, NOT(falso) es verdadero y NOT(desconocido) es


desconocido.

Las condiciones de búsqueda encerradas entre paréntesis se evalúan en


primer lugar. Si no hay paréntesis que especifiquen el orden de
evaluación, se aplica NOT antes que AND y AND antes que OR. El orden en
que se evalúan los operadores con el mismo nivel de precedencia no está
definido para permitir así la optimización de las condiciones de búsqueda.

Subtemas
2.16.1 Ejemplos

© Copyright IBM Corp. 1995, 1996


2.16 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplos
2.16.1 Ejemplos

Ejemplo 1

PROYPRI = 'MA2100' AND NUMDEP = 'D11' OR NUMDEP = 'B03' OR NUMDEP = 'E11'


  
+-+ +------+ +------+
¦1¦ ¦2 ó 3 ¦ ¦2 ó 3 ¦
+-+ +------+ +------+

Ejemplo 2

PROYPRI = 'MA2100' AND (NUMDEP = 'D11' OR NUMDEP = 'B03') OR NUMDEP = 'E11'


  
+-+ +-+ +-+
¦2¦ ¦1¦ ¦3¦
+-+ +-+ +-+

© Copyright IBM Corp. 1995, 1996


2.16.1 - 1
DB2/400 Manual de Consulta SQL V3R7
Capítulo 3. Funciones
3.0 Capítulo 3. Funciones
Una función es una operación designada por un nombre de función seguido de
uno o más operandos que están encerrados entre paréntesis. Los operandos
de las funciones se llaman argumentos. La mayoría de funciones tienen un
único argumento que está especificado por una expresión. El resultado de
una función es un valor único derivado de la aplicación de la función al
resultado de la expresión.

Las funciones se clasifican en funciones escalares o funciones de columna.


El argumento de una función de columna es un conjunto de valores. El
argumento de una función escalar es un solo valor.

En la sintaxis de SQL, el término función se utiliza sólo en la definición


de una expresión. Así pues, una función puede utilizarse únicamente dónde
pueda utilizarse una expresión. Existen restricciones adicionales que
rigen la utilización de las funciones de columna, tal y como se explica en
el apartado siguiente y en el Capítulo 4, "Consultas" en el tema 4.0.

Subtemas
3.1 Funciones de columna
3.2 Funciones escalares

© Copyright IBM Corp. 1995, 1996


3.0 - 1
DB2/400 Manual de Consulta SQL V3R7
Funciones de columna
3.1 Funciones de columna

La información siguiente atañe a todas las funciones de columna que no


sean COUNT(*).

El argumento de una función de columna es un conjunto de valores derivados


de una o más columnas. El ámbito del conjunto es un grupo o una tabla de
resultados intermedios, tal y como se explica en el Capítulo 4,
"Consultas".

Si se especifica una cláusula GROUP BY en una consulta, y el resultado


intermedio de las cláusulas FROM, WHERE, GROUP BY y HAVING es el conjunto
vacío, no se aplican las funciones de columna, el resultado de la consulta
es el conjunto vacío, el SQLCODE se establece en +100, y el SQLSTATE se
establece en '02000'.

Si no se especifica una cláusula GROUP BY en una consulta y el resultado


intermedio de las cláusulas FROM, WHERE y HAVING es el conjunto vacío, se
aplican las funciones de columna en el conjunto vacío.

Subtemas
3.1.1 Ejemplo
3.1.2 AVG
3.1.3 COUNT
3.1.4 MAX
3.1.5 MIN
3.1.6 STDDEV
3.1.7 SUM
3.1.8 VARIANCE o VAR

© Copyright IBM Corp. 1995, 1996


3.1 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplo
3.1.1 Ejemplo

El resultado de la siguiente sentencia SELECT es el número de valores


distintos de TRAB para los empleados del departamento D01:

SELECT COUNT(DISTINCT TRAB)


FROM DATOSCORP.EMPLEADO
WHERE DEPTTRAB = 'D01'

La palabra clave DISTINCT no se considera un argumento de la función,


sino, más bien, una especificación de una operación que se realiza antes
de que se aplique la función. Si se especifica DISTINCT, se eliminan los
valores duplicados. Si se especifica ALL implícita o explícitamente, los
valores duplicados no se eliminan.

Los valores del argumento se especifican mediante una expresión. Esta


expresión debe incluir como mínimo un nombre-columna.

Si un nombre-columna es una referencia correlacionada (lo que está


permitido en una subconsulta de una cláusula HAVING), la expresión no
puede incluir operadores.

A continuación, y en orden alfabético, aparece una definición de cada una


de las funciones de columna.

© Copyright IBM Corp. 1995, 1996


3.1.1 - 1
DB2/400 Manual de Consulta SQL V3R7
AVG
3.1.2 AVG

+------------------------------------------------------------------------+
¦ ¦
¦ +-ALL------+ ¦
¦ >--AVG--(--+----------+--expresión--)--------------------------------> ¦
¦ +-DISTINCT-+ ¦
¦ ¦
+------------------------------------------------------------------------+

La función AVG devuelve el promedio de un conjunto de números.

Los valores de argumento deben ser números y la suma debe estar dentro del
rango del tipo de datos del resultado. El resultado puede ser nulo.

El tipo de datos del resultado es el mismo que el tipo de datos de los


valores de argumento, excepto por lo siguiente:

 El resultado es coma flotante de precisión doble si los valores de


argumento son de coma flotante de precisión simple.

 El resultado es un entero grande si los valores de argumento son


enteros pequeños.

 El resultado es decimal si los valores de argumento son binarios de


escala diferente de cero.

Si el tipo de datos de los valores de argumento es decimal o binario de


escala diferente de cero con precisión p y escala s, la precisión del
resultado es 31 y la escala 31-p+s.

La función se aplica al conjunto de valores derivados de los valores de


argumento por la eliminación de los valores nulos. Si se utiliza
DISTINCT, se eliminan los valores duplicados.

Si la función se aplica al conjunto vacío, el resultado es un valor nulo.


De lo contrario, el resultado es el valor promedio del conjunto.

El orden en que se suman los valores es indefinido, pero todo resultado


intermedio debe estar dentro del rango del tipo de datos del resultado.

Si el tipo del resultado es un entero, la parte fraccionaria del promedio


se pierde.

Subtemas
3.1.2.1 Ejemplo

© Copyright IBM Corp. 1995, 1996


3.1.2 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplo
3.1.2.1 Ejemplo

Ejemplo 1: Utilizando la tabla PROYECTO, establecer la variable del


lenguaje principal PROMEDIO (decimal(5,2)) en el promedio de personal
(PRPERSON) de los proyectos del departamento (NUMDEPT) 'D11'.

SELECT AVG(PRPERSON)
INTO :PROMEDIO
FROM PROYECTO
WHERE NUMDEPT = 'D11'

Da como resultado el que PROMEDIO quede establecido en 4.25 (es decir,


17/4) cuando se utiliza la tabla de ejemplo.

Ejemplo 2: Utilizando la tabla PROYECTO, establecer la variable del


lenguaje principal UN_CALC en el promedio de cada valor de personal
exclusivo (PRPERSON) de los proyectos del departamento (NUMDEPT) 'D11'.

SELECT AVG(DISTINCT PRPERSON)


INTO :UN_CALC
FROM PROYECTO
WHERE NUMDEPT = 'D11'

Da como resultado el que UN_CALC quede establecido en 4.66 (es decir,


14/3) cuando se utiliza la tabla de ejemplo.

© Copyright IBM Corp. 1995, 1996


3.1.2.1 - 1
DB2/400 Manual de Consulta SQL V3R7
COUNT
3.1.3 COUNT

+------------------------------------------------------------------------+
¦ ¦
¦ +-ALL------+ ¦
¦ >--COUNT--(----+----------+--expresión----)--------------------------> ¦
¦ ¦ +-DISTINCT-+ ¦ ¦
¦ +-*-----------------------+ ¦
¦ ¦
+------------------------------------------------------------------------+

La función COUNT devuelve el número de filas o valores de un conjunto de


filas o de valores.

El resultado de la función es un entero grande y debe estar comprendido en


|el rango de los enteros grandes. El resultado no puede ser nulo. Si la
|tabla es una tabla distribuida, el resultado es DECIMAL(15,0). Para
|obtener más información acerca de las tablas distribuidas, consulte la
|publicación DB2 Multisystem for OS/400.

El argumento de COUNT(*) es un conjunto de filas. El resultado es el


número de filas del conjunto. En el recuento se incluye una fila que sólo
contiene valores nulos.

El argumento de COUNT(expresión) es un conjunto de valores. La función se


aplica al conjunto de valores derivados de los valores de argumento por
eliminación de los valores nulos. El resultado es el número de valores
del conjunto.

El argumento de COUNT(DISTINCT expresión) es un conjunto de valores. Los


valores de argumento pueden ser cualquiera excepto las series de
caracteres con un atributo de longitud mayor que 2000 caracteres o las
series gráficas con un atributo de longitud mayor que 1000 caracteres DBCS
o UCS-2. La función se aplica al conjunto de valores derivados de los
valores de argumento por la eliminación de los valores nulos y duplicados.
El resultado es el número de valores del conjunto.

|Si está en vigor una secuencia de clasificación distinta de *HEX al


|ejecutar la sentencia que contiene la función COUNT(DISTINCT expresión) y
|los argumentos contienen datos SBCS o mixtos, se obtiene el resultado
|comparando los valores significativos de cada valor del conjunto. Los
|valores significativos están basados en la secuencia de clasificación.

Subtemas
3.1.3.1 Ejemplo

© Copyright IBM Corp. 1995, 1996


3.1.3 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplo
3.1.3.1 Ejemplo

Ejemplo 1: Utilizando la tabla EMPLEADO, establecer la variable del


lenguaje principal MUJER (int) en el número de filas en las que el valor
de la columna SEXO es 'M'.

SELECT COUNT(*)
INTO :MUJER
FROM EMPLEADO
WHERE SEXO = 'M'

Da como resultado el que MUJER quede establecido en 13 cuando se utiliza


la tabla de ejemplo.

Ejemplo 2: Utilizando la tabla EMPLEADO, establecer la variable del


lenguaje principal MUJER_EN_DEPT (int) en el número de departamentos
(DEPTTRAB) que tienen al menos una mujer como miembro del mismo.

SELECT COUNT(DISTINCT DEPTTRAB)


INTO :MUJER_EN_DEPT
FROM EMPLEADO
WHERE SEXO='M'

Da como resultado el que MUJER_EN_DEPT quede establecido en 5 al utilizar


la tabla de ejemplo (hay una mujer como mínimo en los departamentos A00,
C01, D11, D21 y E11).

Ejemplo 3: Utilizando la tabla PROYECTO, establecer la variable del


lenguaje principal RECUENTO_SUBPROY (int) en el número de proyectos que
son subproyectos de un proyecto principal.

SELECT COUNT(PROYPRIN)
INTO :RECUENTO_SUBPROY
FROM PROYECTO

Da como resultado el que RECUENTO_SUBPRY quede establecido en 14 cuando se


utilizan las tablas de ejemplo.

© Copyright IBM Corp. 1995, 1996


3.1.3.1 - 1
DB2/400 Manual de Consulta SQL V3R7
MAX
3.1.4 MAX

+------------------------------------------------------------------------+
¦ ¦
¦ +-ALL------+ ¦
¦ >--MAX--(--+----------+--expresión--)--------------------------------> ¦
¦ +-DISTINCT-+ ¦
¦ ¦
+------------------------------------------------------------------------+

La función de columna MAX devuelve el valor máximo de un conjunto de


valores de un grupo.

Los valores de argumento pueden ser cualquiera excepto las series de


caracteres con un atributo de longitud mayor que 256 caracteres o las
series gráficas con un atributo de longitud mayor que 128 caracteres DBCS
o UCS-2.

El tipo de datos y el atributo de longitud del resultado son idénticos al


tipo de datos y atributo de longitud de los valores de argumento. Cuando
el argumento es una serie, el resultado tiene el mismo CCSID que el
argumento. El resultado puede ser nulo.

Si está en vigor una secuencia de clasificación distinta de *HEX al


ejecutar la sentencia que contiene la función MAX y los argumentos
contienen datos SBCS o mixtos, se obtiene el resultado comparando los
valores significativos de cada valor del conjunto. Los valores
significativos están basados en la secuencia de clasificación.

La función se aplica al conjunto de valores derivados de los valores de


argumento por la eliminación de los valores nulos.

Si la función se aplica al conjunto vacío, el resultado es un valor nulo.


De lo contrario, el resultado es el valor máximo del conjunto.

La especificación de DISTINCT no afecta al resultado y no es aconsejable.

Subtemas
3.1.4.1 Ejemplos

© Copyright IBM Corp. 1995, 1996


3.1.4 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplos
3.1.4.1 Ejemplos

 Utilizando la tabla EMPLEADO, establecer la variable del lenguaje


principal SUELDO_MAX (decimal(7,2)) en el valor del sueldo mensual
máximo (SUELDO / 12).

SELECT MAX(SUELDO) / 12
INTO :SUELDO_MAX
FROM EMPLEADO

Da como resultado el que SUELDO_MAX quede establecido en 4395,83 al


utilizar la tabla de ejemplo.

 Utilizando la tabla PROYECTO, establecer la variable del lenguaje


principal ULT_PROY (char(24)) en el nombre de proyecto (NOMBREPR) que
figura en último lugar en el orden de clasificación.

SELECT MAX(NOMBREPR)
INTO :ULT_PROY
FROM PROYECTO

Da como resultado el que ULT_PROY quede establecido en 'PLANIF


UNIFICADA' al utilizar la tabla de ejemplo.

© Copyright IBM Corp. 1995, 1996


3.1.4.1 - 1
DB2/400 Manual de Consulta SQL V3R7
MIN
3.1.5 MIN

+------------------------------------------------------------------------+
¦ ¦
¦ +-ALL------+ ¦
¦ >--MIN--(--+----------+--expresión--)--------------------------------> ¦
¦ +-DISTINCT-+ ¦
¦ ¦
+------------------------------------------------------------------------+

La función de columna MIN devuelve el valor mínimo de un conjunto de


valores de un grupo.

Los valores de argumento pueden ser cualquiera excepto las series de


caracteres con un atributo de longitud mayor que 256 caracteres o las
series gráficas con un atributo de longitud mayor que 128 caracteres DBCS
o UCS-2.

El tipo de datos y el atributo de longitud del resultado son idénticos al


tipo de datos y atributo de longitud de los valores de argumento. Cuando
el argumento es una serie, el resultado tiene el mismo CCSID que el
argumento. El resultado puede ser nulo.

Si está en vigor una secuencia de clasificación distinta de *HEX al


ejecutar la sentencia que contiene la función MIN y los argumentos
contienen datos SBCS o mixtos, se obtiene el resultado comparando los
valores significativos de cada valor del conjunto.

La función se aplica al conjunto de valores derivados de los valores de


argumento por la eliminación de los valores nulos.

Si la función se aplica al conjunto vacío, el resultado es un valor nulo.


De no ser así, el resultado es el valor mínimo del conjunto.

La especificación de DISTINCT no afecta al resultado y no es aconsejable.

Subtemas
3.1.5.1 Ejemplos

© Copyright IBM Corp. 1995, 1996


3.1.5 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplos
3.1.5.1 Ejemplos

 Utilizando la tabla EMPLEADO, establecer la variable del lenguaje


principal DIFER_COMIS (decimal(7,2)) en la diferencia entre las
comisiones máxima y mínima (COMI) correspondientes a los miembros del
departamento (DEPTTRAB) 'D11'.

SELECT MAX(COMI) - MIN(COMI)


INTO :DIFER_COMIS
FROM EMPLEADO
WHERE DEPTTRAB = 'D11'

Da como resultado el que DIFER_COMIS quede establecido en 1118 (es


decir, 2580 - 1462) al utilizar la tabla de ejemplo.

 Utilizando la tabla PROYECTO, establecer la variable del lenguaje


principal ACABADO_PRIMERO (char(10)) en la fecha de finalización
estimada (FCHFINPR) del primer proyecto que está planificado para su
finalización.

SELECT MIN(FCHFINPR)
INTO :ACABADO_PRIMERO
FROM PROYECTO

Da como resultado el que ACABADO_PRIMERO quede establecido en


'1982-09-15' al utilizar la tabla de ejemplo.

© Copyright IBM Corp. 1995, 1996


3.1.5.1 - 1
DB2/400 Manual de Consulta SQL V3R7
STDDEV
3.1.6 STDDEV

+------------------------------------------------------------------------+
¦ ¦
¦ +-ALL------+ ¦
¦ >--STDDEV--(--+----------+--expresión--)-----------------------------> ¦
¦ +-DISTINCT-+ ¦
¦ ¦
+------------------------------------------------------------------------+

La función STDDEV devuelve la desviación estándar (/n) de un conjunto de


números. La fórmula utilizada para calcular STDDEV es:

STDDEV = SQRT(VAR)

donde SQRT(VAR) es la raíz cuadrada de la varianza.

Los valores de argumento deben ser números y la suma debe estar dentro del
rango del tipo de datos del resultado.

El tipo de datos del resultado es de coma flotante de precisión doble. El


resultado puede ser nulo.

La función se aplica al conjunto de valores derivados de los valores de


argumento por la eliminación de los valores nulos. Si se especifica
DISTINCT, se eliminan los valores duplicados.

Si la función se aplica al conjunto vacío, el resultado es un valor nulo.


Si no es así, el resultado es la desviación estándar de los valores del
conjunto.

El orden en que se suman los valores es indefinido, pero todo resultado


intermedio debe estar dentro del rango del tipo de datos del resultado.

Subtemas
3.1.6.1 Ejemplo

© Copyright IBM Corp. 1995, 1996


3.1.6 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplo
3.1.6.1 Ejemplo

Utilizando la tabla EMPLEADO, establecer la variable del lenguaje


principal DESV (FLOAT de precisión doble) en la desviación estándar del
sueldo de los empleados del departamento A00.

SELECT STDDEV(SUELDO)
INTO :DESV
FROM EMPLEADO
WHERE DEPTTRAB = 'A00';

Da como resultado el que DESV quede establecido en aproximadamente 9938.00


al utilizar la tabla de ejemplo.

© Copyright IBM Corp. 1995, 1996


3.1.6.1 - 1
DB2/400 Manual de Consulta SQL V3R7
SUM
3.1.7 SUM

+------------------------------------------------------------------------+
¦ ¦
¦ +-ALL------+ ¦
¦ >--SUM--(--+----------+--expresión--)--------------------------------> ¦
¦ +-DISTINCT-+ ¦
¦ ¦
+------------------------------------------------------------------------+

La función SUM devuelve su suma de un conjunto de números.

Los valores de argumento deben ser números y la suma debe estar dentro del
rango del tipo de datos del resultado. El resultado puede ser nulo.

El tipo de datos del resultado es el mismo que el tipo de datos de los


valores de argumento, con la excepción de que el resultado es:

 De coma flotante de precisión doble si los valores de argumento son de


coma flotante de precisión simple

 Entero grande si los valores de argumento son enteros pequeños

 Decimal si los valores de argumento son binarios de escala diferente


de cero

Si el tipo de datos de los valores de argumento es decimal o binario de


escala diferente de cero la precisión del resultado es 31 y la escala es
la misma que la de los valores de argumento.

La función se aplica al conjunto de valores derivados de los valores de


argumento por la eliminación de los valores nulos. Si se especifica
DISTINCT, se eliminan los valores duplicados.

Si la función se aplica al conjunto vacío, el resultado es un valor nulo.


Si no es así, el resultado es la suma de los valores del conjunto.

El orden en que se suman los valores es indefinido, pero todo resultado


intermedio debe estar dentro del rango del tipo de datos del resultado.

Subtemas
3.1.7.1 Ejemplo

© Copyright IBM Corp. 1995, 1996


3.1.7 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplo
3.1.7.1 Ejemplo

Utilizando la tabla EMPLEADO, establecer la variable del lenguaje


principal BONIF_TRAB (decimal(9,2)) es la bonificación total (BONIF)
pagada a los oficinistas (TRAB='OFICI').

SELECT SUM(BONIF)
INTO :BONIF_TRAB
FROM EMPLEADO
WHERE TRAB = 'OFICI'

Da como resultado el que BONIF_TRAB quede establecido en 2800 al utilizar


la tabla de ejemplo.

© Copyright IBM Corp. 1995, 1996


3.1.7.1 - 1
DB2/400 Manual de Consulta SQL V3R7
VARIANCE o VAR
3.1.8 VARIANCE o VAR

+------------------------------------------------------------------------+
¦ ¦
¦ +-ALL------+ ¦
¦ >----VARIANCE----(--+----------+--expresión--)-----------------------> ¦
¦ +-VAR------+ +-DISTINCT-+ ¦
¦ ¦
+------------------------------------------------------------------------+

Las funciones VAR y VARIANCE devuelven la variación parcial (/n) de un


conjunto de números. La fórmula utilizada para calcular VAR es:

VAR = SUM(X**2)/COUNT(X) - (SUM(X)/COUNT(X))**2

Los valores de argumento deben ser números y la suma debe estar dentro del
rango del tipo de datos del resultado.

El tipo de datos del resultado es de coma flotante de precisión doble. El


resultado puede ser nulo.

La función se aplica al conjunto de valores derivados de los valores de


argumento por la eliminación de los valores nulos. Si se especifica
DISTINCT, se eliminan los valores duplicados.

Si la función se aplica al conjunto vacío, el resultado es un valor nulo.


Si no es así, el resultado es la varianza de los valores del conjunto.

El orden en que se suman los valores es indefinido, pero todo resultado


intermedio debe estar dentro del rango del tipo de datos del resultado.

Subtemas
3.1.8.1 Ejemplo

© Copyright IBM Corp. 1995, 1996


3.1.8 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplo
3.1.8.1 Ejemplo

Utilizando la tabla EMPLEADO, establecer la variable del lenguaje


principal VARIAN (FLOAT de precisión doble) en la variación del sueldo de
los empleados del departamento A00.

SELECT VAR(SUELDO)
INTO :VARIAN
FROM EMPLEADO
WHERE DEPTTRAB = 'A00';

Da como resultado el que VARIAN quede establecido en aproximadamente


98763888,88 al utilizar la tabla de ejemplo.

© Copyright IBM Corp. 1995, 1996


3.1.8.1 - 1
DB2/400 Manual de Consulta SQL V3R7
Funciones escalares
3.2 Funciones escalares

Una función escalar puede utilizarse siempre que pueda utilizarse una
expresión. Las restricciones que existen sobre la utilización de las
funciones de columna no rigen para las funciones escalares porque una
función escalar se aplica a un solo valor en lugar de a un conjunto de
valores. El argumento de una función escalar, por ejemplo, puede ser una
función. No obstante, las restricciones que se aplican a la utilización
de expresiones y a funciones de columna también rigen cuando se utiliza
una expresión o función de columna en una función escalar. Por ejemplo,
el argumento de una función escalar puede ser una función de columna sólo
si el contexto en que se utiliza la función escalar permite una función de
columna.

Subtemas
3.2.1 Ejemplo
3.2.2 ABS o ABSVAL
3.2.3 ACOS
3.2.4 ANTILOG
3.2.5 ASIN
3.2.6 ATAN
3.2.7 ATANH
3.2.8 CHAR
3.2.9 CHARACTER_LENGTH o CHAR_LENGTH
3.2.10 COALESCE
3.2.11 CONCAT
3.2.12 COS
3.2.13 COSH
3.2.14 COT
3.2.15 CURDATE
3.2.16 CURTIME
3.2.17 DATE
3.2.18 DAY
3.2.19 DAYOFMONTH
3.2.20 DAYOFWEEK
3.2.21 DAYOFYEAR
3.2.22 DAYS
3.2.23 DECIMAL
3.2.24 DEGREES
3.2.25 DIGITS
3.2.26 DOUBLE_PRECISION o DOUBLE
3.2.27 EXP
3.2.28 FLOAT
3.2.29 FLOOR
3.2.30 HASH
3.2.31 HEX
3.2.32 HOUR
3.2.33 IFNULL
3.2.34 INTEGER
3.2.35 LAND
3.2.36 LEFT
3.2.37 LENGTH
3.2.38 LN
3.2.39 LNOT
3.2.40 LOG o LOG10
3.2.41 LOR
3.2.42 LTRIM
3.2.43 MAX
3.2.44 MICROSECOND
3.2.45 MIN
3.2.46 MINUTE
3.2.47 MOD
3.2.48 MONTH
3.2.49 NODENAME
3.2.50 NODENUMBER
3.2.51 NOW
3.2.52 PARTITION
3.2.53 POWER
3.2.54 QUARTER
3.2.55 RRN
3.2.56 RTRIM
3.2.57 SECOND
3.2.58 SIN
3.2.59 SINH
3.2.60 SQRT
3.2.61 STRIP
3.2.62 SUBSTRING o SUBSTR
3.2.63 TAN
3.2.64 TANH
3.2.65 TIME
3.2.66 TIMESTAMP
3.2.67 TRANSLATE
3.2.68 TRIM
3.2.69 UCASE o UPPER
3.2.70 VALUE
3.2.71 VARCHAR
3.2.72 VARGRAPHIC
3.2.73 WEEK
3.2.74 XOR
3.2.75 YEAR
3.2.76 ZONED

© Copyright IBM Corp. 1995, 1996


3.2 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplo
3.2.1 Ejemplo

El resultado de la siguiente sentencia SELECT tiene tantas filas como


empleados haya en el departamento D01:

SELECT NUMEMP, APELL, YEAR(CURRENT DATE - FCHNACIM)


FROM DATOS.EMPLEADO
WHERE DEPTTRAB = 'D01'

© Copyright IBM Corp. 1995, 1996


3.2.1 - 1
DB2/400 Manual de Consulta SQL V3R7
ABS o ABSVAL
3.2.2 ABS o ABSVAL

+------------------------------------------------------------------------+
¦ ¦
¦ >----ABS-------(----expresión----)-----------------------------------> ¦
¦ +-ABSVAL-+ ¦
¦ ¦
+------------------------------------------------------------------------+

Las funciones ABS y ABSVAL devuelven el valor absoluto de un número.

El argumento debe ser un número.

El tipo de datos y el atributo de longitud del resultado son los mismos


que los del valor de argumento, con la excepción de que el resultado es un
entero grande si el valor de argumento es un entero pequeño, y es de coma
flotante de precisión doble si el valor de argumento es de coma flotante
de precisión simple. Si el argumento puede ser nulo, el resultado
también; si el argumento es nulo, el resultado es el valor nulo.

Subtemas
3.2.2.1 Ejemplo

© Copyright IBM Corp. 1995, 1996


3.2.2 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplo
3.2.2.1 Ejemplo

Supongamos que la variable del lenguaje principal BENEFI es un entero


grande con un valor de -50000.

ABSVAL(:BENEFI)

Devuelve el valor 50000.

© Copyright IBM Corp. 1995, 1996


3.2.2.1 - 1
DB2/400 Manual de Consulta SQL V3R7
ACOS
3.2.3 ACOS

+------------------------------------------------------------------------+
¦ ¦
¦ >--ACOS--(----expresión----)-----------------------------------------> ¦
¦ ¦
+------------------------------------------------------------------------+

La función ACOS devuelve el arco coseno de un número, en radianes. Las


funciones ACOS y COS son operaciones inversas.

El argumento debe ser un número cuyo valor sea mayor o igual que -1 y
menor o igual que 1.

El tipo de datos del resultado es de coma flotante de precisión doble. Si


el argumento puede ser nulo, el resultado también; si el argumento es
nulo, el resultado es el valor nulo.

El resultado está dentro del rango de 0 a pi (pi = 3,1416).

Subtemas
3.2.3.1 Ejemplo

© Copyright IBM Corp. 1995, 1996


3.2.3 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplo
3.2.3.1 Ejemplo

Supongamos que la variable del lenguaje principal ACOSENO es una variable


del lenguaje principal decimal (10,9) con un valor de 0,070737202.

ACOS(:ACOSENO)

Devuelve el valor aproximado 1,49.

© Copyright IBM Corp. 1995, 1996


3.2.3.1 - 1
DB2/400 Manual de Consulta SQL V3R7
ANTILOG
3.2.4 ANTILOG

+------------------------------------------------------------------------+
¦ ¦
¦ >--ANTILOG--(----expresión----)--------------------------------------> ¦
¦ ¦
+------------------------------------------------------------------------+

La función ANTILOG devuelve el antilogaritmo (de base 10) de un número.


Las funciones ANTILOG y LOG son operaciones inversas.

El argumento debe ser un número.

El tipo de datos del resultado es de coma flotante de precisión doble. Si


el argumento puede ser nulo, el resultado también; si el argumento es
nulo, el resultado es el valor nulo.

Subtemas
3.2.4.1 Ejemplo

© Copyright IBM Corp. 1995, 1996


3.2.4 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplo
3.2.4.1 Ejemplo

Supongamos que la variable del lenguaje principal ALOG es una variable del
lenguaje principal decimal (10,9) con un valor de 1,499961866.

ANTILOG(:ALOG)

Devuelve el valor aproximado 31,62.

© Copyright IBM Corp. 1995, 1996


3.2.4.1 - 1
DB2/400 Manual de Consulta SQL V3R7
ASIN
3.2.5 ASIN

+------------------------------------------------------------------------+
¦ ¦
¦ >--ASIN--(----expresión----)-----------------------------------------> ¦
¦ ¦
+------------------------------------------------------------------------+

La función ASIN devuelve el arco seno de un número, en radianes. Las


funciones ASIN y SIN son operaciones inversas.

El argumento debe ser un número cuyo valor sea mayor o igual que -1 y
menor o igual que 1.

El tipo de datos del resultado es de coma flotante de precisión doble. Si


el argumento puede ser nulo, el resultado también; si el argumento es
nulo, el resultado es el valor nulo.

El argumento está dentro del rango de -pi/2 a pi/2 (pi = 3,1416).

Subtemas
3.2.5.1 Ejemplo

© Copyright IBM Corp. 1995, 1996


3.2.5 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplo
3.2.5.1 Ejemplo

Supongamos que la variable del lenguaje principal ASENO es una variable


del lenguaje principal decimal (10,9) con un valor de 0,997494987.

ASIN(:ASENO)

Devuelve el valor aproximado 1,50.

© Copyright IBM Corp. 1995, 1996


3.2.5.1 - 1
DB2/400 Manual de Consulta SQL V3R7
ATAN
3.2.6 ATAN

+------------------------------------------------------------------------+
¦ ¦
¦ >--ATAN--(----expresión----)-----------------------------------------> ¦
¦ ¦
+------------------------------------------------------------------------+

La función ATAN devuelve el arco tangente de un número, en radianes. Las


funciones ATAN y TAN son operaciones inversas.

El argumento debe ser un número.

El tipo de datos del resultado es de coma flotante de precisión doble. Si


el argumento puede ser nulo, el resultado también; si el argumento es
nulo, el resultado es el valor nulo.

El argumento está dentro del rango de -pi/2 a pi/2 (pi = 3,1416).

Subtemas
3.2.6.1 Ejemplo

© Copyright IBM Corp. 1995, 1996


3.2.6 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplo
3.2.6.1 Ejemplo

Supongamos que la variable del lenguaje principal ATANGENTE es una


variable del lenguaje principal decimal (10,8) con un valor de
14,10141995.

ATAN(:ATANGENTE)

Devuelve el valor aproximado 1,50.

© Copyright IBM Corp. 1995, 1996


3.2.6.1 - 1
DB2/400 Manual de Consulta SQL V3R7
ATANH
3.2.7 ATANH

+------------------------------------------------------------------------+
¦ ¦
¦ >--ATANH--(----expresión----)----------------------------------------> ¦
¦ ¦
+------------------------------------------------------------------------+

La función ATANH devuelve el arco tangente hiperbólico de un número, en


radianes. Las funciones ATANH y TANH son operaciones inversas.

El argumento debe ser un número cuyo valor sea mayor que -1 y menor que 1.

El tipo de datos del resultado es de coma flotante de precisión doble. Si


el argumento puede ser nulo, el resultado también; si el argumento es
nulo, el resultado es el valor nulo.

Subtemas
3.2.7.1 Ejemplo

© Copyright IBM Corp. 1995, 1996


3.2.7 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplo
3.2.7.1 Ejemplo

Supongamos que la variable del lenguaje principal ATANH es una variable


del lenguaje principal decimal (10,9) con un valor de 0,905148254.

ATANH(:ATANH)

Devuelve el valor aproximado 1,50.

© Copyright IBM Corp. 1995, 1996


3.2.7.1 - 1
DB2/400 Manual de Consulta SQL V3R7
CHAR
3.2.8 CHAR

+------------------------------------------------------------------------+
¦ ¦
¦ >--CHAR--(--expresión------------)-----------------------------------> ¦
¦ +-,ISO-¦ ¦
¦ +-,USA-¦ ¦
¦ +-,EUR-¦ ¦
¦ +-,JIS-+ ¦
¦ ¦
+------------------------------------------------------------------------+

La función CHAR devuelve una representación de serie de un valor de fecha


y hora.

El primer argumento debe ser una fecha, hora o indicación de la hora. El


segundo argumento, en caso de ser aplicable, es un formato de fecha y hora
estándar SQL de IBM.

El resultado de la función es una serie de caracteres de longitud fija.


El CCSID de la serie es el CCSID SBCS por omisión del servidor actual. Si
el primer argumento puede ser nulo, el resultado también; si el primer
argumento es nulo, el resultado es el valor nulo.

El resto de las reglas dependen del tipo de datos del primer argumento:

 Si el primer argumento es una fecha:

El resultado es la representación de serie de caracteres de la fecha


en el formato especificado por el segundo argumento. Si no se
especifica el segundo argumento, el formato utilizado proviene de los
parámetros de formato de fecha (DATFMT) y de separador de fecha
(DATSEP). Si el formato es ISO, USA, EUR o JIS, la longitud del
resultado será 10. Si el formato es YMD, MDY o DMY, el resultado será
8. Si el formato es JUL, la longitud del resultado es 6.

Los parámetros DATFMT y DATSEP se especifican en los mandatos


CRTSQLxxx (Crear Programa SQL), RUNSQLSTM (Ejecutar Sentencias SQL) y
STRSQL (Arrancar SQL). Para REXX, se especifican en la sentencia SET
OPTION.

 Si el primer argumento es una hora:

El resultado es la representación de serie de caracteres de la hora en


el formato especificado por el segundo argumento. Si no se especifica
el segundo argumento, el formato utilizado proviene de los parámetros
de formato de hora (TIMFMT) y de separador de hora (TIMSEP). La
longitud del resultado es 8.

Los parámetros TIMFMT y TIMSEP se especifican en los mandatos


CRTSQLxxx (Crear Programa SQL), RUNSQLSTM (Ejecutar Sentencias SQL) y
STRSQL (Arrancar SQL). Para REXX, se especifican en la sentencia SET
OPTION.

 Si el primer argumento es una indicación de la hora:

No se podrá aplicar el segundo argumento y por lo tanto no debe


especificarse.

El resultado es la representación de serie de caracteres de la


indicación de la hora. La longitud del resultado será 26.

Subtemas
3.2.8.1 Ejemplos

© Copyright IBM Corp. 1995, 1996


3.2.8 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplos
3.2.8.1 Ejemplos

 Supongamos que la columna FCHAINIP tiene un valor interno equivalente


a 1988-12-25. El formato de fecha es *MDY y el separador de fecha es
una barra inclinada (/).

CHAR(FCHAINIP, USA)

Da como resultado el valor '12/25/1988'.

CHAR(FCHAINIP)

Da como resultado el valor '12/25/88'.

 Supongamos que la columna INICIO tiene un valor interno equivalente a


17.12.30, la variable del lenguaje principal DUR_HORA (decimal(6,0))
es una duración de hora equivalente a 050000 (es decir, 5 horas).

CHAR(INICIO, USA)

Da como resultado el valor '5:12 PM'.

CHAR(INICIO + :DUR_HORA, USA)

Da como resultado el valor '10:12 PM'.

 Supongamos que la columna RECIBIDO (indicación de la hora) tiene un


valor interno equivalente a la combinación de las columnas FCHAINIP e
INICIO.

CHAR(RECIBIDO)

Da como resultado el valor '1988-12-25-17.12.30.000000'.

© Copyright IBM Corp. 1995, 1996


3.2.8.1 - 1
DB2/400 Manual de Consulta SQL V3R7
CHARACTER_LENGTH o CHAR_LENGTH
3.2.9 CHARACTER_LENGTH o CHAR_LENGTH

+------------------------------------------------------------------------+
¦ ¦
¦ >----CHARACTER_LENGTH----(--expresión--)-----------------------------> ¦
¦ +-CHAR_LENGTH------+ ¦
¦ ¦
+------------------------------------------------------------------------+

La función CHARACTER_LENGTH devuelve la longitud de una expresión de


serie. Esta expresión no puede ser una expresión de caracteres mixtos.

El resultado de la función es un entero grande. Si el argumento puede ser


nulo, el resultado también; si el argumento es nulo, el resultado es el
valor nulo.

El resultado es el número de caracteres del argumento. La longitud de las


series incluye blancos. La longitud de una serie de longitud variable es
la longitud real, no la longitud máxima.

Subtemas
3.2.9.1 Ejemplo

© Copyright IBM Corp. 1995, 1996


3.2.9 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplo
3.2.9.1 Ejemplo

Supongamos que la variable del lenguaje principal DIRECCION es una serie


de caracteres de longitud variable con un valor de 'C\ Severo Ochoa'.

CHARACTER_LENGTH(:DIRECCION)

Devuelve el valor 15.

© Copyright IBM Corp. 1995, 1996


3.2.9.1 - 1
DB2/400 Manual de Consulta SQL V3R7
COALESCE
3.2.10 COALESCE

+------------------------------------------------------------------------+
¦ ¦
¦ <------------+ ¦
¦ >--COALESCE--(--expresión----,expresión----)-------------------------> ¦
¦ ¦
+------------------------------------------------------------------------+

La función COALESCE devuelve el primer argumento que no es nulo.

Los argumentos deben ser compatibles. Los argumentos de serie de


caracteres son compatibles con los valores de fecha y hora. Por tanto, si
algún argumento es una serie de caracteres, todos los argumentos deben ser
series de caracteres; si alguno es una fecha, todos los argumentos deben
ser fechas; si alguno es un número, todos los argumentos deben ser
números, y así sucesivamente.

Los argumentos se evalúan en el orden en que se especifican y el resultado


de la función es el primer argumento no nulo. El resultado puede ser nulo
sólo si todos los argumentos pueden ser nulos y es nulo sólo si todos los
argumentos son nulos. El argumento seleccionado se convierte, en caso
necesario, a los atributos del resultado. Debe haber dos o más
argumentos. Los argumentos que no sean el primero pueden ser marcadores
de parámetros.

Los atributos del resultado se derivan de todos los operandos, tal como se
explica en el apartado "Reglas para tipos de datos de resultado" en el
tema 4.3.2.

Subtemas
3.2.10.1 Ejemplos

© Copyright IBM Corp. 1995, 1996


3.2.10 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplos
3.2.10.1 Ejemplos

 Al seleccionar todos los valores de todas las filas de la tabla


DEPART, si el jefe del departamento (NUMJE) no está (es decir, es
nulo), devolver el valor 'AUSENTE'.

SELECT NUMDEPT, NOMBDEPT, COALESCE(NUMJE, 'AUSENTE'), DEPTOADM


FROM DEPART

 Si al seleccionar el número de empleado (NUMEMP) y el sueldo (SUELDO)


de todas las filas de la tabla EMPLEADO, falta el sueldo (es decir, es
nulo), devolver el valor cero.

SELECT NUMEMP, COALESCE(SUELDO,0)


FROM EMPLEADO

© Copyright IBM Corp. 1995, 1996


3.2.10.1 - 1
DB2/400 Manual de Consulta SQL V3R7
CONCAT
3.2.11 CONCAT

+------------------------------------------------------------------------+
¦ ¦
¦ >--CONCAT--(--expresión--,--expresión--)-----------------------------> ¦
¦ ¦
+------------------------------------------------------------------------+

La función CONCAT es idéntica al operador CONCAT. Para obtener más


información, consulte el apartado "Con el operador de concatenación" en el
tema 2.14.2.

Subtemas
3.2.11.1 Ejemplo

© Copyright IBM Corp. 1995, 1996


3.2.11 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplo
3.2.11.1 Ejemplo

Concatenar la columna NOMBRE con la columna APELL.

CONCAT(NOMBRE, APELL)

© Copyright IBM Corp. 1995, 1996


3.2.11.1 - 1
DB2/400 Manual de Consulta SQL V3R7
COS
3.2.12 COS

+------------------------------------------------------------------------+
¦ ¦
¦ >--COS--(----expresión----)------------------------------------------> ¦
¦ ¦
+------------------------------------------------------------------------+

La función COS devuelve el coseno de un número. Las funciones COS y ACOS


son operaciones inversas.

El argumento debe ser un número cuyo valor esté especificado en radianes.

El tipo de datos del resultado es de coma flotante de precisión doble. Si


el argumento puede ser nulo, el resultado también; si el argumento es
nulo, el resultado es el valor nulo.

Subtemas
3.2.12.1 Ejemplo

© Copyright IBM Corp. 1995, 1996


3.2.12 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplo
3.2.12.1 Ejemplo

Supongamos que la variable del lenguaje principal COSENO es una variable


del lenguaje principal decimal (2,1) con un valor de 1,5.

COS(:COSENO)

Devuelve el valor aproximado 0,07.

© Copyright IBM Corp. 1995, 1996


3.2.12.1 - 1
DB2/400 Manual de Consulta SQL V3R7
COSH
3.2.13 COSH

+------------------------------------------------------------------------+
¦ ¦
¦ >--COSH--(----expresión----)-----------------------------------------> ¦
¦ ¦
+------------------------------------------------------------------------+

La función COSH devuelve el coseno hiperbólico de un número.

El argumento debe ser un número cuyo valor esté especificado en radianes.

El tipo de datos del resultado es de coma flotante de precisión doble. Si


el argumento puede ser nulo, el resultado también; si el argumento es
nulo, el resultado es el valor nulo.

Subtemas
3.2.13.1 Ejemplo

© Copyright IBM Corp. 1995, 1996


3.2.13 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplo
3.2.13.1 Ejemplo

Supongamos que la variable del lenguaje principal COSH es una variable del
lenguaje principal decimal (2,1) con un valor de 1,5.

COSH(:COSH)

Devuelve el valor aproximado 2,35.

© Copyright IBM Corp. 1995, 1996


3.2.13.1 - 1
DB2/400 Manual de Consulta SQL V3R7
COT
3.2.14 COT

+------------------------------------------------------------------------+
¦ ¦
¦ >--COT--(----expresión----)------------------------------------------> ¦
¦ ¦
+------------------------------------------------------------------------+

La función COT devuelve la cotangente de un número.

El argumento debe ser un número cuyo valor esté especificado en radianes.

El tipo de datos del resultado es de coma flotante de precisión doble. Si


el argumento puede ser nulo, el resultado también; si el argumento es
nulo, el resultado es el valor nulo.

Subtemas
3.2.14.1 Ejemplo

© Copyright IBM Corp. 1995, 1996


3.2.14 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplo
3.2.14.1 Ejemplo

Supongamos que la variable del lenguaje principal COTAN es una variable


del lenguaje principal decimal (2,1) con un valor de 1,5.

COT(:COTAN)

Devuelve el valor aproximado 0,07.

© Copyright IBM Corp. 1995, 1996


3.2.14.1 - 1
DB2/400 Manual de Consulta SQL V3R7
CURDATE
3.2.15 CURDATE

+------------------------------------------------------------------------+
¦ ¦
¦ >--CURDATE--(--)-----------------------------------------------------> ¦
¦ ¦
+------------------------------------------------------------------------+

La función CURDATE devuelve una fecha basándose en una lectura del reloj
de la hora del día cuando se ejecuta la sentencia SQL del servidor actual.
El valor que devuelve la función CURDATE es igual al valor que devuelve el
registro especial CURRENT DATE. Si esta función se utiliza más de una vez
dentro de una única sentencia SQL, se utiliza con las funciones escalares
CURTIME o NOW, o se utiliza con los registros especiales CURRENT DATE,
CURRENT TIME o CURRENT TIMESTAMP dentro de una única sentencia, todos los
valores se basan en una única lectura del reloj.

El tipo de datos del resultado es una fecha.

Subtemas
3.2.15.1 Ejemplo

© Copyright IBM Corp. 1995, 1996


3.2.15 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplo
3.2.15.1 Ejemplo

Devuelve la fecha actual basándose en el reloj de la hora del día.

CURDATE()

© Copyright IBM Corp. 1995, 1996


3.2.15.1 - 1
DB2/400 Manual de Consulta SQL V3R7
CURTIME
3.2.16 CURTIME

+------------------------------------------------------------------------+
¦ ¦
¦ >--CURTIME--(--)-----------------------------------------------------> ¦
¦ ¦
+------------------------------------------------------------------------+

La función CURTIME devuelve una hora basándose en una lectura del reloj de
la hora del día cuando se ejecuta la sentencia SQL en el servidor actual.
El valor que devuelve la función CURTIME es igual al valor que devuelve el
registro especial CURRENT TIME. Si esta función se utiliza más de una vez
dentro de una única sentencia SQL, se utiliza con las funciones escalares
CURDATE o NOW, o se utiliza con los registros especiales CURRENT DATE,
CURRENT TIME o CURRENT TIMESTAMP dentro de una única sentencia, todos los
valores se basan en una única lectura del reloj.

El tipo de datos del resultado es una hora.

Subtemas
3.2.16.1 Ejemplo

© Copyright IBM Corp. 1995, 1996


3.2.16 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplo
3.2.16.1 Ejemplo

Devuelve la hora actual basándose en el reloj de la hora del día.

CURTIME()

© Copyright IBM Corp. 1995, 1996


3.2.16.1 - 1
DB2/400 Manual de Consulta SQL V3R7
DATE
3.2.17 DATE

+------------------------------------------------------------------------+
¦ ¦
¦ >--DATE--(--expresión--)---------------------------------------------> ¦
¦ ¦
+------------------------------------------------------------------------+

La función DATE devuelve una fecha a partir de un valor.

El argumento debe ser una indicación de la hora, una fecha, un número


positivo menor o igual que 3652059, una representación de serie de una
fecha o una serie de caracteres de longitud 7.

Si el argumento es una serie de caracteres de longitud 7, ésta deberá


representar una fecha válida con el formato aaaannn, donde aaaa son los
dígitos correspondientes a un año y nnn son dígitos comprendidos entre 001
y 366 que indican el día del año.

El resultado de la función es una fecha. Si el argumento puede ser nulo,


el resultado también; si el argumento es nulo, el resultado es el valor
nulo.

El resto de las reglas dependen del tipo de datos del argumento:

 Si el argumento es una indicación de la hora:

El resultado es la parte de la fecha de la indicación de la hora.

 Si el argumento es una fecha:

El resultado es esa fecha.

 Si el argumento es un número:

El resultado es la fecha correspondiente a n-1 días después del 1 de


enero del año 0001, donde n es la parte interna del número.

 Si el argumento es una serie de caracteres:

Cuando una representación de serie de una fecha es de datos SBCS con


un CCSID que es distinto del CCSID por omisión correspondiente a los
datos SBCS, se convierte dicho valor para adherirse al CCSID por
omisión de los datos SBCS antes de interpretarlo y convertirlo a un
valor de fecha.

Cuando una representación de serie de una fecha es de datos mixtos con


un CCSID que es distinto del CCSID por omisión correspondiente a los
datos mixtos, se convierte dicho valor para adherirse al CCSID por
omisión de los datos mixtos antes de interpretarlo y convertirlo a un
valor de fecha.

Subtemas
3.2.17.1 Ejemplos

© Copyright IBM Corp. 1995, 1996


3.2.17 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplos
3.2.17.1 Ejemplos

 Supongamos que la columna RECIBIDO (indicación de la hora) tiene un


valor interno equivalente a '1988-12-25-17.12.30.000000'.

DATE(RECIBIDO)

Da como resultado una representación interna de '1988-12-25'.

 La siguiente función escalar DATE se aplica a una representación de


serie ISO de una fecha:

DATE('1988-12-25')

Da como resultado una representación interna de '1988-12-25'.

 La siguiente función escalar DATE se aplica a una representación de


serie EUR de una fecha:

DATE('25.12.1988')

Da como resultado una representación interna de '1988-12-25'.

 La siguiente función escalar DATE se aplica a un número positivo:

DATE(35)

Da como resultado una representación interna de '0001-02-04'.

© Copyright IBM Corp. 1995, 1996


3.2.17.1 - 1
DB2/400 Manual de Consulta SQL V3R7
DAY
3.2.18 DAY

+------------------------------------------------------------------------+
¦ ¦
¦ >--DAY--(--expresión--)----------------------------------------------> ¦
¦ ¦
+------------------------------------------------------------------------+

La función DAY devuelve la parte correspondiente al día de un valor.

El argumento debe ser una fecha, una indicación de la hora, una duración
de fecha o una duración de indicación de la hora.

El resultado de la función es un entero grande. Si el argumento puede ser


nulo, el resultado también; si el argumento es nulo, el resultado es el
valor nulo.

El resto de las reglas dependen del tipo de datos del argumento:

 Si el argumento es una fecha o una indicación de la hora:

El resultado es la parte del día del valor, que es un entero


comprendido entre 1 y 31.

 Si el argumento es una duración de fecha o duración de indicación de


la hora:

El resultado es la parte del día del valor, que es un entero


comprendido entre -99 y 99. Un resultado no cero tiene el mismo signo
que el argumento.

Subtemas
3.2.18.1 Ejemplos

© Copyright IBM Corp. 1995, 1996


3.2.18 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplos
3.2.18.1 Ejemplos

 Utilizando la tabla PROYECTO, establecer la variable del lenguaje


principal DIA_FIN (smallint) en el día en que está planificado que se
detenga (FCHFINPR) el proyecto PLANIF UNIFICADA (NOMBREPR).

SELECT DAY(FCHFINPR)
INTO :DIA_FIN
FROM PROYECTO
WHERE NOMBREPR = 'PLANIF UNIFICADA'

Da como resultado el que DIA_FIN quede establecido en 15 al utilizar


la tabla de ejemplo.

 Supongamos que la columna FECHA1 (date) tiene un valor interno


equivalente a 2000-03-15 y que la columna FECHA2 (date) tiene un valor
interno equivalente a 1999-12-31.

DAY(FECHA1 - FECHA2)

Da como resultado el valor 15.

© Copyright IBM Corp. 1995, 1996


3.2.18.1 - 1
DB2/400 Manual de Consulta SQL V3R7
DAYOFMONTH
3.2.19 DAYOFMONTH

+------------------------------------------------------------------------+
¦ ¦
¦ >--DAYOFMONTH--(--expresión--)---------------------------------------> ¦
¦ ¦
+------------------------------------------------------------------------+

La función DAYOFMONTH es idéntica a la función escalar DAY. Para obtener


más información, consulte el apartado "DAY" en el tema 3.2.18.

© Copyright IBM Corp. 1995, 1996


3.2.19 - 1
DB2/400 Manual de Consulta SQL V3R7
DAYOFWEEK
3.2.20 DAYOFWEEK

+------------------------------------------------------------------------+
¦ ¦
¦ >--DAYOFWEEK--(--expresión--)----------------------------------------> ¦
¦ ¦
+------------------------------------------------------------------------+

La función DAYOFWEEK devuelve un entero entre el 1 y el 7 que representa


el día de la semana, donde 1 es el lunes y 7 es el domingo.

El argumento debe ser una fecha o indicación de la hora.

El resultado de la función es un entero grande. Si el argumento puede ser


nulo, el resultado también; si el argumento es nulo, el resultado es el
valor nulo.

Subtemas
3.2.20.1 Ejemplo

© Copyright IBM Corp. 1995, 1996


3.2.20 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplo
3.2.20.1 Ejemplo

Utilizando la tabla EMPLEADO, establecer la variable del lenguaje


principal DIA_DE_LA_SEMANA (int) en el día de la semana en que empezó a
trabajar (FECHINIC) Cristina Pérez (NUMEMP='000010').

SELECT DAYOFWEEK(FECHINIC)
INTO :DIA_DE_LA_SEMANA
FROM EMPLEADO
WHERE NUMEMP = '000010'

Da como resultado el que DIA_DE_LA_SEMANA quede establecido en 6 cuando se


utiliza la tabla de ejemplo.

© Copyright IBM Corp. 1995, 1996


3.2.20.1 - 1
DB2/400 Manual de Consulta SQL V3R7
DAYOFYEAR
3.2.21 DAYOFYEAR

+------------------------------------------------------------------------+
¦ ¦
¦ >--DAYOFYEAR--(--expresión--)----------------------------------------> ¦
¦ ¦
+------------------------------------------------------------------------+

La función DAYOFYEAR devuelve un entero entre el 1 y el 366 que representa


el día del año, donde 1 es el 1 de enero.

El argumento debe ser una fecha o indicación de la hora.

El resultado de la función es un entero grande. Si el argumento puede ser


nulo, el resultado también; si el argumento es nulo, el resultado es el
valor nulo.

Subtemas
3.2.21.1 Ejemplo

© Copyright IBM Corp. 1995, 1996


3.2.21 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplo
3.2.21.1 Ejemplo

Utilizando la tabla EMPLEADO, establezca la variable del lenguaje


principal PROM_DIA_DEL_AÑO (int) en el promedio del día del año en que
empezaron a trabajar los empleados (FECHINIC).

SELECT AVG(DAYOFYEAR(FECHINIC))
INTO :PROM_DIA_DEL_AÑO
FROM EMPLEADO

Da como resultado el que PROM_DIA_DEL_AÑO quede establecido en 202 cuando


se utiliza la tabla de ejemplo.

© Copyright IBM Corp. 1995, 1996


3.2.21.1 - 1
DB2/400 Manual de Consulta SQL V3R7
DAYS
3.2.22 DAYS

+------------------------------------------------------------------------+
¦ ¦
¦ >--DAYS--(--expresión--)---------------------------------------------> ¦
¦ ¦
+------------------------------------------------------------------------+

La función DAYS devuelve la representación de entero de una fecha.

El argumento debe ser una fecha, una indicación de la hora o una


representación de serie válida de una fecha.

El resultado de la función es un entero grande. Si el argumento puede ser


nulo, el resultado también; si el argumento es nulo, el resultado es el
valor nulo.

El resultado es 1 más que el número de días a partir del 1 de enero del


año 0001 hasta D, donde D es la fecha que aparecería si la función DATE se
aplicase al argumento.

Subtemas
3.2.22.1 Ejemplos

© Copyright IBM Corp. 1995, 1996


3.2.22 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplos
3.2.22.1 Ejemplos

 Utilizando la tabla PROYECTO, establecer la variable del lenguaje


principal DIAS_FORMACION (int) en el número de días transcurridos
(FCHFINPR - FCHAINIP) estimados para el proyecto (NUMPROY) 'IF2000'.

SELECT DAYS(FCHFINPR) - DAYS(FCHAINIP)


INTO :DIAS_FORMACION
FROM PROYECTO
WHERE NUMPROY = 'IF2000'

Da como resultado el que DIAS_FORMACION quede establecido en 396 al


utilizar la tabla de ejemplo.

 Utilizando la tabla PROYECTO, establecer la variable del lenguaje


principal TOTAL_DIAS (int) en el número de días transcurridos
(FCHFINPR - FCHAINIP) estimados para todos los proyectos del
departamento (NUMDEPT) 'E21'.

SELECT SUM(DAYS(FCHFINPR) - DAYS(FCHAINIP))


INTO :TOTAL_DIAS
FROM PROYECTO
WHERE NUMDEPT = 'E21'

Da como resultado el que TOTAL_DIAS quede establecido en 1484 al


utilizar la tabla de ejemplo.

© Copyright IBM Corp. 1995, 1996


3.2.22.1 - 1
DB2/400 Manual de Consulta SQL V3R7
DECIMAL
3.2.23 DECIMAL

+------------------------------------------------------------------------+
¦ ¦
¦ >--DECIMAL--(--expresión----------------------------)----------------> ¦
¦ +-,entero--------------+ ¦
¦ +-,entero-+ ¦
¦ ¦
+------------------------------------------------------------------------+

La función DECIMAL devuelve la representación en decimal empaquetado de un


número.

El primer argumento debe ser un número. El segundo argumento, si se


especifica, debe estar dentro del rango de 1 a 31. El tercer argumento,
si se especifica, debe estar dentro del rango de 0 a p, donde p es el
segundo argumento. La omisión del tercer argumento es una especificación
implícita de cero.

El valor por omisión del segundo argumento depende del tipo de datos del
primer argumento:

 15 para coma flotante, decimal, numérico o binario de escala no cero


 11 para entero grande
 5 para entero pequeño

El resultado de la función es un número decimal con la precisión p y la


escala s, donde p y s son el segundo y tercer argumento, respectivamente.
Si el primer argumento puede ser nulo, el resultado también; si el primer
argumento es nulo, el resultado es el valor nulo.

El resultado es el mismo número que se produciría si se asignase el primer


argumento a una columna decimal o variable con una precisión p y una
escala s. Se produce un error si el numero de dígitos decimales
significativos precisos para representar la parte entera del número es
mayor que p-s.

Subtemas
3.2.23.1 Ejemplos

© Copyright IBM Corp. 1995, 1996


3.2.23 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplos
3.2.23.1 Ejemplos

 Utilizar la función DECIMAL para forzar el que se devuelva un tipo de


datos DECIMAL (con una precisión 5 y una escala 2) en una lista de
selección para la columna NIVELFO (tipo de datos = SMALLINT) en la
tabla EMPLEADO. La columna NUMEMP también puede aparecer en la lista
de selección.

SELECT NUMEMP, DECIMAL(NIVELFO,5,2)


FROM EMPLEADO

 Seleccionar, mediante la tabla PROYECTO, todas las fechas de inicio


(FCHAINIP) que se hayan incrementado en una duración especificada en
una variable del lenguaje principal. Supongamos que la variable de
lenguaje principal PERIOD es de tipo INTEGER. En ese caso, y a fin de
utilizar su valor como una duración de fecha, deberá "reconvertirse" a
decimal(8,0).

SELECT FCHINIPR + DECIMAL(:PERIOD,8)


FROM PROYECTO

© Copyright IBM Corp. 1995, 1996


3.2.23.1 - 1
DB2/400 Manual de Consulta SQL V3R7
DEGREES
3.2.24 DEGREES

+------------------------------------------------------------------------+
¦ ¦
¦ >--DEGREES--(----expresión----)--------------------------------------> ¦
¦ ¦
+------------------------------------------------------------------------+

La función DEGREES devuelve el número de grados de un ángulo.

El argumento debe ser un número cuyo valor esté especificado en radianes.

El tipo de datos del resultado es de coma flotante de precisión doble. Si


el argumento puede ser nulo, el resultado también; si el argumento es
nulo, el resultado es el valor nulo.

Subtemas
3.2.24.1 Ejemplo

© Copyright IBM Corp. 1995, 1996


3.2.24 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplo
3.2.24.1 Ejemplo

Supongamos que la variable del lenguaje principal RAD es una variable del
lenguaje principal decimal (4,3) con un valor de 3,142.

DEGREES(:RAD)

Devuelve el valor aproximado 180,0.

© Copyright IBM Corp. 1995, 1996


3.2.24.1 - 1
DB2/400 Manual de Consulta SQL V3R7
DIGITS
3.2.25 DIGITS

+------------------------------------------------------------------------+
¦ ¦
¦ >--DIGITS--(--expresión--)-------------------------------------------> ¦
¦ ¦
+------------------------------------------------------------------------+

La función DIGITS devuelve una representación de serie de caracteres del


valor absoluto de un número.

El argumento debe ser un valor entero o decimal.

Si el argumento puede ser nulo, el resultado también; si el argumento es


nulo, el resultado es el valor nulo.

El resultado de la función es una serie de caracteres de longitud fija que


representa el valor absoluto del argumento sin tener en cuenta su escala.
El resultado no incluye ningún signo ni una coma decimal. En lugar de
ello, consta exclusivamente de dígitos, incluyendo, si es necesario, ceros
iniciales para rellenar la serie. La longitud de la serie es:

 5, si el argumento es un entero pequeño de escala cero


 10, si el argumento es un entero grande de escala cero
 p, si el argumento es un decimal o un entero de escala no cero con una
precisión p

El CCSID de la serie de caracteres es el CCSID SBCS por omisión en el


servidor actual.

Subtemas
3.2.25.1 Ejemplos

© Copyright IBM Corp. 1995, 1996


3.2.25 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplos
3.2.25.1 Ejemplos

 Supongamos que una tabla llamada TABLAX contiene una columna INTEGER
llamada COLENT que contiene números de 10 dígitos. Listar todas las
combinaciones de los cuatro primeros dígitos contenidos en la columna
COLENT.

SELECT DISTINCT SUBSTR(DIGITS(COLENT),1,4)


FROM TABLAX

 Supongamos que COLUMNAX tiene el tipo de datos DECIMAL(6,2) y que uno


de sus valores es -6,28. Para este valor:

DIGITS(COLUMNAX)

se devuelve el valor '000628'.

El resultado es una serie de longitud 6 (la precisión de la columna)


con ceros iniciales de relleno en ella para completar esta longitud.
En el resultado no aparece ningún signo ni la coma decimal.

© Copyright IBM Corp. 1995, 1996


3.2.25.1 - 1
DB2/400 Manual de Consulta SQL V3R7
DOUBLE_PRECISION o DOUBLE
3.2.26 DOUBLE_PRECISION o DOUBLE

+------------------------------------------------------------------------+
¦ ¦
¦ >----DOUBLE_PRECISION----(--expresión--)-----------------------------> ¦
¦ +-DOUBLE-----------+ ¦
¦ ¦
+------------------------------------------------------------------------+

Las funciones DOUBLE_PRECISION y DOUBLE son idénticas a la función escalar


FLOAT. Para obtener más información, consulte el apartado "FLOAT" en el
tema 3.2.28.

© Copyright IBM Corp. 1995, 1996


3.2.26 - 1
DB2/400 Manual de Consulta SQL V3R7
EXP
3.2.27 EXP

+------------------------------------------------------------------------+
¦ ¦
¦ >--EXP--(----expresión----)------------------------------------------> ¦
¦ ¦
+------------------------------------------------------------------------+

La función EXP devuelve un valor que es la base del logaritmo natural (e)
elevado a la potencia especificada por el argumento. Las funciones EXP y
LN son operaciones inversas.

El argumento debe ser un número.

El tipo de datos del resultado es de coma flotante de precisión doble. Si


el argumento puede ser nulo, el resultado también; si el argumento es
nulo, el resultado es el valor nulo.

Subtemas
3.2.27.1 Ejemplo

© Copyright IBM Corp. 1995, 1996


3.2.27 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplo
3.2.27.1 Ejemplo

Supongamos que la variable del lenguaje principal E es una variable del


lenguaje principal decimal (10,9) con un valor de 3,453789832.

EXP(:E)

Devuelve el valor aproximado 31,62.

© Copyright IBM Corp. 1995, 1996


3.2.27.1 - 1
DB2/400 Manual de Consulta SQL V3R7
FLOAT
3.2.28 FLOAT

+------------------------------------------------------------------------+
¦ ¦
¦ >--FLOAT--(--expresión--)--------------------------------------------> ¦
¦ ¦
+------------------------------------------------------------------------+

La función FLOAT devuelve la representación de coma flotante de un número.

El argumento debe ser un número.

El resultado de la función es un número de coma flotante de precisión


doble. Si el argumento puede ser nulo, el resultado también; si el
argumento es nulo, el resultado es el valor nulo.

El resultado es el mismo número que se produciría si se asignase el


argumento a una columna o variable de coma flotante de precisión doble.

Subtemas
3.2.28.1 Ejemplo

© Copyright IBM Corp. 1995, 1996


3.2.28 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplo
3.2.28.1 Ejemplo

Utilizando la tabla EMPLEADO, encontrar la proporción sueldo/comisión


correspondiente a aquellos empleados cuya comisión sea diferente de cero.
Las columnas afectadas (SUELDO y COMI) tienen tipos de datos DECIMAL.
Para eliminar la posibilidad de obtener resultados fuera de rango, se
aplica FLOAT a SUELDO de forma que la división se lleva a cabo en coma
flotante:

SELECT NUMEMP, FLOAT(SUELDO)/COMI


FROM EMPLEADO
WHERE COMI > 0

© Copyright IBM Corp. 1995, 1996


3.2.28.1 - 1
DB2/400 Manual de Consulta SQL V3R7
FLOOR
3.2.29 FLOOR

+------------------------------------------------------------------------+
¦ ¦
¦ >--FLOOR--(--expresión--)--------------------------------------------> ¦
¦ ¦
+------------------------------------------------------------------------+

La función FLOOR es idéntica a la función escalar INTEGER. Para obtener


más información, consulte el apartado "INTEGER" en el tema 3.2.34.

© Copyright IBM Corp. 1995, 1996


3.2.29 - 1
DB2/400 Manual de Consulta SQL V3R7
HASH
|3.2.30 HASH

+------------------------------------------------------------------------+
|¦ ¦
|¦ <-,---------+ ¦
|¦ >--HASH--(----expresión----)-----------------------------------------> ¦
¦ ¦
+------------------------------------------------------------------------+

|La función HASH devuelve el número de partición de un conjunto de valores.


|Vea también la función PARTITION. Para obtener más información acerca de
|los números de partición, consulte la publicación DB2 Multisystem for
|OS/400, SC41-3705.

|Los argumentos no pueden ser valores de fecha y hora ni flotantes. Los


|argumentos no deben ser marcadores de parámetro.

|El resultado de la función es un entero grande con un valor entre 0 y


1023.

|Si cualquiera de los argumentos es nulo, el resultado es cero. El


|resultado no puede ser nulo.

Subtemas
3.2.30.1 Ejemplo

© Copyright IBM Corp. 1995, 1996


3.2.30 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplo
|3.2.30.1 Ejemplo

|Utilice la función HASH para determinar qué particiones resultarían si la


|clave de partición estuviera compuesta por NUMEMP y APELLIDO. Esta
|consulta devuelve el número de partición para cada fila de EMPLEADO.

| SELECT HASH(NUMEMP, APELLIDO)


| FROM DATOSCORP.EMPLEADO

© Copyright IBM Corp. 1995, 1996


3.2.30.1 - 1
DB2/400 Manual de Consulta SQL V3R7
HEX
3.2.31 HEX

+------------------------------------------------------------------------+
¦ ¦
¦ >--HEX--(--expresión--)----------------------------------------------> ¦
¦ ¦
+------------------------------------------------------------------------+

La función HEX devuelve una representación hexadecimal de un valor.

El argumento puede ser cualquier valor.

El resultado de la función es una serie de caracteres. Si el argumento


puede ser nulo, el resultado también puede serlo; si el argumento es nulo,
el resultado es el valor nulo.

El resultado es una serie de dígitos hexadecimales en la que los dos


primeros dígitos representan el primer byte del argumento, los dos dígitos
siguientes representan el segundo byte del argumento, y así sucesivamente.
Si el argumento es un valor de fecha u hora, el resultado es la
representación hexadecimal del formato interno del argumento. Esta
representación hexadecimal de los tipos de datos DATE, TIMESTAMP y NUMERIC
es diferente de otros productos de base de datos ya que el formato interno
de estos tipos de datos es diferente.

Si el argumento no es una serie gráfica, la longitud del resultado es el


doble que la longitud del argumento. Si el argumento es una serie gráfica,
la longitud del resultado es cuatro veces la longitud del argumento.

Si el argumento es una serie de longitud variable, el resultado es una


serie de longitud variable. En caso contrario, el resultado es una serie
de longitud fija. El atributo de longitud del resultado es el doble que
el atributo de longitud de almacenamiento del argumento. Para obtener
información sobre el atributo de longitud de almacenamiento, consulte el
apartado "CREATE TABLE" en el tema 5.16.

El atributo de longitud del resultado no puede ser mayor que 32766 para
resultados de longitud fija o mayor que 32740 para resultados de longitud
variable. El CCSID de la serie es el CCSID SBCS por omisión del servidor
actual.

Subtemas
3.2.31.1 Ejemplo

© Copyright IBM Corp. 1995, 1996


3.2.31 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplo
3.2.31.1 Ejemplo

Utilizar la función HEX para devolver una representación hexadecimal del


nivel de formación de cada empleado.

SELECT NOMBRE, APELL, HEX(NIVELFO) FROM EMPLEADO

© Copyright IBM Corp. 1995, 1996


3.2.31.1 - 1
DB2/400 Manual de Consulta SQL V3R7
HOUR
3.2.32 HOUR

+------------------------------------------------------------------------+
¦ ¦
¦ >--HOUR--(--expresión--)---------------------------------------------> ¦
¦ ¦
+------------------------------------------------------------------------+

La función HOUR devuelve la parte de las horas de un valor.

El argumento debe ser una hora, una indicación de la hora, una duración de
hora o una duración de indicación de la hora.

El resultado de la función es un entero grande. Si el argumento puede ser


nulo, el resultado también; si el argumento es nulo, el resultado es el
valor nulo.

El resto de las reglas dependen del tipo de datos del argumento:

 Si el argumento es una hora o una indicación de la hora:

El resultado es la parte del valor correspondiente a la hora, que es


un entero entre 0 y 24.

 Si el argumento es una duración de hora o de indicación de la hora:

El resultado es la parte del valor correspondiente a la hora, que es


entero entre -99 y 99. Un resultado no cero tiene el mismo signo que
el argumento.

Subtemas
3.2.32.1 Ejemplo

© Copyright IBM Corp. 1995, 1996


3.2.32 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplo
3.2.32.1 Ejemplo

Utilizando la tabla de ejemplo CL_PREVI, seleccionar todas las clases que


empiecen por la tarde.

SELECT * FROM CL_PREVI


WHERE HOUR(INICIO) BETWEEN 12 AND 17

© Copyright IBM Corp. 1995, 1996


3.2.32.1 - 1
DB2/400 Manual de Consulta SQL V3R7
IFNULL
3.2.33 IFNULL

+------------------------------------------------------------------------+
¦ ¦
¦ >--IFNULL--(--expresión--,--expresión--)-----------------------------> ¦
¦ ¦
+------------------------------------------------------------------------+

La función IFNULL es idéntica a la función escalar COALESCE con dos


argumentos. Para obtener más información, véase el apartado "COALESCE" en
el tema 3.2.10.

Subtemas
3.2.33.1 Ejemplo

© Copyright IBM Corp. 1995, 1996


3.2.33 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplo
3.2.33.1 Ejemplo

Si al seleccionar el número de empleado (NUMEMP) y el sueldo (SUELDO) de


todas las filas de la tabla EMPLEADO falta el sueldo (es decir, es nulo),
devuelve el valor cero.

SELECT NUMEMP, IFNULL(SUELDO,0)


FROM EMPLEADO

© Copyright IBM Corp. 1995, 1996


3.2.33.1 - 1
DB2/400 Manual de Consulta SQL V3R7
INTEGER
3.2.34 INTEGER

+------------------------------------------------------------------------+
¦ ¦
¦ >--INTEGER--(--expresión--)------------------------------------------> ¦
¦ ¦
+------------------------------------------------------------------------+

La función INTEGER devuelve la representación de la parte entera de un


número.

El argumento debe ser un número.

El resultado de la función es un entero grande. Si el argumento puede ser


nulo, el resultado también; si el argumento es nulo, el resultado es el
valor nulo.

El resultado es el mismo número que aparecería si el argumento se asignara


a una variable o columna de entero grande. Si la totalidad del argumento
no se encuentra dentro del rango de los enteros, se producirá un error.

Subtemas
3.2.34.1 Ejemplo

© Copyright IBM Corp. 1995, 1996


3.2.34 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplo
3.2.34.1 Ejemplo

Utilizando la tabla EMPLEADO, seleccionar una lista que contenga el sueldo


(SUELDO) dividido por el nivel de formación (NIVELFO). Truncar cualquier
decimal del cálculo realizado. La lista también debe contener los valores
utilizados en el cálculo y el número de empleado (NUMEMP).

SELECT INTEGER(SUELDO / NIVELFO), SUELDO, NIVELFO, NUMEMP


FROM EMPLEADO

© Copyright IBM Corp. 1995, 1996


3.2.34.1 - 1
DB2/400 Manual de Consulta SQL V3R7
LAND
3.2.35 LAND

+------------------------------------------------------------------------+
¦ ¦
¦ <-,---------+ ¦
¦ >--LAND--(--expresión----expresión----)------------------------------> ¦
¦ ¦
+------------------------------------------------------------------------+

La función LAND devuelve una serie que es el 'AND' lógico de las series de
argumento. Esta función toma la primera serie de argumento, realiza una
comparación AND con la siguiente serie de argumento y sigue después
haciendo comparaciones AND con cada argumento sucesivo utilizando el
resultado anterior. Si encuentra un argumento que es más corto que el
resultado anterior, lo rellena con blancos.

Los argumentos deben ser series de caracteres. Los argumentos no pueden


ser series gráficas ni series de caracteres de datos mixtos. Debe haber
dos o más argumentos. Los argumentos que no sean el primero pueden ser
marcadores de parámetros.

Los argumentos se convierten, si es necesario, a los atributos del


resultado. Los atributos del resultado se determinan del siguiente modo:

 Si todos los argumentos son series de longitud fija, el resultado es


una serie de longitud fija de longitud n, donde n es la longitud del
argumento más largo.

 Si algún argumento es una serie de longitud variable, el resultado es


una serie de longitud variable con un atributo de longitud n, donde n
es el atributo de longitud del argumento con el mayor atributo de
longitud. La longitud real del resultado es m, donde m es la longitud
real del argumento más largo.

 El CCSID del resultado es 65535.

Si un argumento puede ser nulo, el resultado también; si un argumento es


nulo, el resultado es el valor nulo.

Subtemas
3.2.35.1 Ejemplo

© Copyright IBM Corp. 1995, 1996


3.2.35 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplo
3.2.35.1 Ejemplo

Supongamos que la variable del lenguaje principal L1 es una variable del


lenguaje principal de tipo character(2) con un valor de X'A1B1', la
variable del lenguaje principal L2 es una variable del lenguaje principal
de tipo character(3) con un valor de X'F0F040' y la variable del lenguaje
principal L3 es una variable del lenguaje principal de tipo character(4)
con un valor de X'A1B10040'.

LAND(:L1,:L2,:L3)

Devuelve el valor X'A0B00000'.

LAND(:L3,:L2,:L1)

Devuelve el valor X'A0B00040'. En este caso, los argumentos más cortos se


rellenan con blancos (X'40'), de manera que el resultado AND lógico
difiere del primer ejemplo.

© Copyright IBM Corp. 1995, 1996


3.2.35.1 - 1
DB2/400 Manual de Consulta SQL V3R7
LEFT
3.2.36 LEFT

+------------------------------------------------------------------------+
¦ ¦
¦ >--LEFT--(--serie,--longitud--)--------------------------------------> ¦
¦ ¦
+------------------------------------------------------------------------+

La función LEFT devuelve el número especificado más a la izquierda de los


caracteres de la serie. (18)

Si serie es una serie de caracteres, el resultado es una serie de


caracteres, y cada carácter tiene un byte. Si serie es una serie gráfica,
el resultado es una serie gráfica, y cada carácter es un carácter DBCS o
UCS-2.

Si alguno de los argumentos de la función LEFT puede ser nulo, el


resultado también puede serlo; si algún argumento es nulo, el resultado
será el valor nulo.

El CCSID del resultado es el mismo que el de la serie.

serie
Denota una expresión que especifica la serie de la cual se deriva el
resultado. Serie debe ser una serie de caracteres o una serie
gráfica. Una subserie de la serie es cero o más bytes contiguos de la
serie.

La función LEFT acepta datos mixtos. Sin embargo, y puesto que LEFT
funciona basándose en un recuento estricto de los bytes, el resultado
no será necesariamente una serie de caracteres de datos mixtos formada
como es debido.

longitud
Denota una expresión que especifica la longitud del resultado.
longitud debe ser un entero binario dentro del rango de 0 a n, donde n
es el atributo de longitud de la serie. No obstante, no debe ser la
constante de entero 0.

La serie se rellena por la derecha de forma efectiva con el número


necesario de caracteres en blanco, de tal manera que la subserie
especificada de la serie exista siempre.

Si se especifica longitud mediante una constante de entero, el


resultado es una serie de longitud fija. En el resto de los casos, el
resultado es una serie de longitud variable con un atributo de
longitud igual al atributo de longitud de la serie

(18) La función escalar LEFT devuelve el mismo resultado que:


SUBSTR(serie, 1, longitud).

Subtemas
3.2.36.1 Ejemplo

© Copyright IBM Corp. 1995, 1996


3.2.36 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplo
3.2.36.1 Ejemplo

Supongamos que la variable de lenguaje principal NOMBRE (varchar(50))


tiene un valor de 'MAITE AYALA' y que la variable de lenguaje principal
POS_NOMB (int) tiene un valor de 5.

LEFT(:NOMBRE, :POS_NOMB)

Devuelve el valor 'MAITE'

© Copyright IBM Corp. 1995, 1996


3.2.36.1 - 1
DB2/400 Manual de Consulta SQL V3R7
LENGTH
3.2.37 LENGTH

+------------------------------------------------------------------------+
¦ ¦
¦ >--LENGTH--(--expresión--)-------------------------------------------> ¦
¦ ¦
+------------------------------------------------------------------------+

La función LENGTH devuelve la longitud de un valor.

El argumento puede ser cualquier valor.

El resultado de la función es un entero grande. Si el argumento puede ser


nulo, el resultado también; si el argumento es nulo, el resultado es el
valor nulo.

El resultado es la longitud del argumento. La longitud de las series


incluye blancos. La longitud de una serie de longitud variable es la
longitud real, no la longitud máxima.

La longitud de una serie gráfica es el número de caracteres. La longitud


de todos los demás valores es el número de bytes que se utiliza para
representar el valor:

Números:

- 2 para entero pequeño


- 4 para entero grande
- 4 para coma flotante de precisión simple
- 8 para coma flotante de precisión doble
- p para números decimales con zona y de precisión p
- La parte entera de (p/2)+1 para números decimales empaquetados con
precisión p

Serie de caracteres:

- La longitud de la serie

Series gráficas:

- El número de caracteres DBCS o UCS-2 de la serie

Valores de fecha y hora:

- 3 para hora
- 4 para fecha
- 10 para indicación de la hora

Subtemas
3.2.37.1 Ejemplos

© Copyright IBM Corp. 1995, 1996


3.2.37 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplos
3.2.37.1 Ejemplos

 Supongamos que la variable del lenguaje principal DIRECCION es una


serie de caracteres de longitud variable con un valor de 'C\ Severo
Ochoa'.

LENGTH(:DIRECCION)

Devuelve el valor 15.

 Supongamos que FECHA_INICIO es una columna de tipo DATE.

LENGTH(FECHA_INICIO)

Devuelve el valor 4.

 Supongamos que FECHA_INICIO es una columna de tipo DATE.

LENGTH(CHAR(FECHA_INICIO, EUR))

Devuelve el valor 10.

© Copyright IBM Corp. 1995, 1996


3.2.37.1 - 1
DB2/400 Manual de Consulta SQL V3R7
LN
3.2.38 LN

+------------------------------------------------------------------------+
¦ ¦
¦ >--LN--(----expresión----)-------------------------------------------> ¦
¦ ¦
+------------------------------------------------------------------------+

La función LN devuelve el logaritmo natural de un número. Las funciones


EXP y LN son operaciones inversas.

El argumento debe ser un número.

El tipo de datos del resultado es de coma flotante de precisión doble. Si


el argumento puede ser nulo, el resultado también; si el argumento es
nulo, el resultado es el valor nulo.

Subtemas
3.2.38.1 Ejemplo

© Copyright IBM Corp. 1995, 1996


3.2.38 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplo
3.2.38.1 Ejemplo

Supongamos que la variable del lenguaje principal LOGNAT es una variable


del lenguaje principal decimal (4,2) con un valor de 31,62.

LN(:LOGNAT)

Devuelve el valor aproximado 3,45.

© Copyright IBM Corp. 1995, 1996


3.2.38.1 - 1
DB2/400 Manual de Consulta SQL V3R7
LNOT
3.2.39 LNOT

+------------------------------------------------------------------------+
¦ ¦
¦ >--LNOT--(----expresión----)-----------------------------------------> ¦
¦ ¦
+------------------------------------------------------------------------+

La función LNOT devuelve una serie que es el NOT lógico de la serie de


argumento.

El argumento debe ser una serie de caracteres. No puede ser una serie
gráfica o una serie de caracteres de tipo MIXED.

El tipo de datos y el atributo de longitud del resultado son idénticos al


tipo de datos y atributo de longitud del valor de argumento. Si el
argumento es una serie de longitud variable, la longitud real del
resultado es la misma que la longitud real del valor de argumento. El
CCSID del resultado es 65535. Si el argumento puede ser nulo, el
resultado también; si el argumento es nulo, el resultado es el valor nulo.

Subtemas
3.2.39.1 Ejemplo

© Copyright IBM Corp. 1995, 1996


3.2.39 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplo
3.2.39.1 Ejemplo

Supongamos que la variable del lenguaje principal L1 es una variable del


lenguaje principal de tipo character(2) con un valor de X'F0F0.

LNOT(:L1)

Devuelve el valor X'0F0F'.

© Copyright IBM Corp. 1995, 1996


3.2.39.1 - 1
DB2/400 Manual de Consulta SQL V3R7
LOG o LOG10
3.2.40 LOG o LOG10

+------------------------------------------------------------------------+
¦ ¦
¦ >----LOG------(----expresión----)------------------------------------> ¦
¦ +-LOG10-+ ¦
¦ ¦
+------------------------------------------------------------------------+

Las funciones LOG y LOG10 devuelven el logaritmo común (de base 10) de un
número. Las funciones LOG y ANTILOG son operaciones inversas.

El argumento debe ser un número.

El tipo de datos del resultado es de coma flotante de precisión doble. Si


el argumento puede ser nulo, el resultado también; si el argumento es
nulo, el resultado es el valor nulo.

Subtemas
3.2.40.1 Ejemplo

© Copyright IBM Corp. 1995, 1996


3.2.40 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplo
3.2.40.1 Ejemplo

Supongamos que la variable del lenguaje principal L es una variable del


lenguaje principal decimal (4,2) con un valor de 31,62.

LOG(:L)

Devuelve el valor aproximado 1,49.

© Copyright IBM Corp. 1995, 1996


3.2.40.1 - 1
DB2/400 Manual de Consulta SQL V3R7
LOR
3.2.41 LOR

+------------------------------------------------------------------------+
¦ ¦
¦ <-,---------+ ¦
¦ >--LOR--(--expresión----expresión----)-------------------------------> ¦
¦ ¦
+------------------------------------------------------------------------+

La función LOR devuelve una serie que es el OR lógico de las series de


argumento. Esta función toma la primera serie de argumento, realiza una
comparación OR con la siguiente serie de argumento y sigue después
haciendo comparaciones OR para cada argumento sucesivo utilizando el
resultado anterior. Si encuentra un argumento que es más corto que el
resultado anterior, lo rellena con blancos.

Los argumentos deben ser series de caracteres. Los argumentos no pueden


ser series gráficas ni series de caracteres de datos mixtos. Debe haber
dos o más argumentos. Los argumentos que no sean el primero pueden ser
marcadores de parámetros.

Los argumentos se convierten, si es necesario, a los atributos del


resultado. Los atributos del resultado se determinan del siguiente modo:

 Si todos los argumentos son series de longitud fija, el resultado es


una serie de longitud fija de longitud n, donde n es la longitud del
argumento más largo.

 Si algún argumento es una serie de longitud variable, el resultado es


una serie de longitud variable con un atributo de longitud n, donde n
es el atributo de longitud del argumento con el mayor atributo de
longitud. La longitud real del resultado es m, donde m es la longitud
real del argumento más largo.

 El CCSID del resultado es 65535.

Si un argumento puede ser nulo, el resultado también; si un argumento es


nulo, el resultado es el valor nulo.

Subtemas
3.2.41.1 Ejemplo

© Copyright IBM Corp. 1995, 1996


3.2.41 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplo
3.2.41.1 Ejemplo

Supongamos que la variable del lenguaje principal L1 es una variable del


lenguaje principal de tipo character(2) con un valor de X'0101', la
variable del lenguaje principal L2 es una variable del lenguaje principal
de tipo character(3) con un valor de X'F0F000' y la variable del lenguaje
principal L3 es una variable del lenguaje principal de tipo character(4)
con un valor de X'0000000F'.

LOR(:L1,:L2,:L3)

Devuelve el valor X'F1F1000F'.

LOR(:L3,:L2,:L1)

Devuelve el valor X'F1F1404F'. En este caso, los argumentos más cortos se


rellenan con blancos (X'40'), de manera que el resultado OR lógico difiere
del primer ejemplo.

© Copyright IBM Corp. 1995, 1996


3.2.41.1 - 1
DB2/400 Manual de Consulta SQL V3R7
LTRIM
3.2.42 LTRIM

+------------------------------------------------------------------------+
¦ ¦
¦ >--LTRIM--(--expresión--)--------------------------------------------> ¦
¦ ¦
+------------------------------------------------------------------------+

La función LTRIM elimina blancos al principio de una expresión de


serie. (19)

El argumento debe ser una expresión de serie.

 Si el argumento es una serie gráfica DBCS, se eliminan los blancos


DBCS iniciales.

 Si el primer argumento es una serie gráfica UCS-2, se eliminan los


blancos UCS-2 iniciales.

 De lo contrario, se eliminan los blancos SBCS iniciales.

El resultado de la función es una serie de longitud variable con la misma


longitud máxima que el atributo de longitud de la serie. La longitud real
del resultado es la longitud de la expresión menos el número de caracteres
eliminados. Si se eliminan todos los caracteres, el resultado es una
serie de longitud variable vacía.

El CCSID del resultado es el mismo que el de la serie. Si el primer


argumento puede ser nulo, el resultado también; si el primer argumento es
nulo, el resultado es el valor nulo.

(19) La función LTRIM devuelve el mismo resultado que:


STRIP(expresión,LEADING)

Subtemas
3.2.42.1 Ejemplo

© Copyright IBM Corp. 1995, 1996


3.2.42 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplo
3.2.42.1 Ejemplo

Supongamos que la variable de lenguaje principal HOLA de tipo CHAR(9)


tiene el valor ' Hola'.

LTRIM(:HOLA)

Da como resultado: 'Hola'.

© Copyright IBM Corp. 1995, 1996


3.2.42.1 - 1
DB2/400 Manual de Consulta SQL V3R7
MAX
3.2.43 MAX

+------------------------------------------------------------------------+
¦ ¦
¦ <-,---------+ ¦
¦ >--MAX--(--expresión,----expresión----)------------------------------> ¦
¦ ¦
+------------------------------------------------------------------------+

La función escalar MAX devuelve el valor máximo de un conjunto de valores.

Los argumentos deben ser compatibles. Los argumentos de serie de


caracteres son compatibles con los valores de fecha y hora, pero no lo son
con las series gráficas. Todos los argumentos excepto el primero pueden
ser marcadores de parámetros. Debe haber dos o más argumentos. Los
argumentos no pueden ser series de caracteres cuyas longitudes máximas
sean mayores que 256 caracteres, o series gráficas cuyas longitudes
máximas sean mayores que 128 caracteres DBCS o UCS-2.

El resultado de la función es el valor de argumento más grande. El


resultado puede ser nulo si por lo menos un argumento puede serlo; el
resultado es el valor nulo si uno de los argumentos es nulo. Los
argumentos seleccionados se convierten, si es necesario, a los atributos
del resultado. Los atributos del resultado se determinan del siguiente
modo:

 Si los argumentos contienen al menos una fecha y los argumentos


restantes son fechas o representaciones de serie válidas de fecha, el
resultado es una fecha. Si los argumentos contienen al menos una hora
y los argumentos restantes son horas o representaciones de serie
válidas de hora, el resultado es una hora. Si los argumentos
contienen al menos una indicación de la hora y los argumentos
restantes son indicaciones de la hora o representaciones de serie
válidas de indicación de la hora, el resultado es una indicación de la
hora.

 Si los argumentos son series, el CCSID del resultado es el CCSID que


resultaría de concatenar los argumentos. Véase el apartado "Reglas de
conversión para operaciones que combinan series" en el tema 4.3.3.

 Si todos los argumentos son series de longitud fija, el resultado es


una serie de longitud fija de longitud n, donde n es la longitud del
argumento más largo.

 Si algún argumento es una serie de longitud variable, el resultado es


una serie de longitud variable con un atributo de longitud n, donde n
es el atributo de longitud del argumento con el mayor atributo de
longitud. La longitud real del resultado es m, donde m es la longitud
real del argumento más largo.

 Si los argumentos son números, el tipo de datos del resultado es el


mismo que resultaría de sumar los argumentos. En el caso de un
resultado decimal:

- La escala es s, donde s es la escala del argumento con mayor


escala.

- La precisión es el mínimo de 31 y s+n, donde n es el número de


dígitos del argumento con la mayor diferencia entre su precisión y
su escala.

- El número de dígitos necesarios para representar la parte entera


del argumento más largo no debe se superior a 31-s.

Si está en vigor una secuencia de clasificación distinta de *HEX al


ejecutar la sentencia e intervienen datos SBCS o mixtos, se comparan los
valores significativos de las series en lugar de los valores reales. Los
valores significativos están basados en la secuencia de clasificación.

Subtemas
3.2.43.1 Ejemplos

© Copyright IBM Corp. 1995, 1996


3.2.43 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplos
3.2.43.1 Ejemplos

 Supongamos que la variable del lenguaje principal M1 es una variable


del lenguaje principal de tipo decimal(2,1) con un valor de 5,5, la
variable del lenguaje principal M2 es una variable del lenguaje
principal de tipo decimal(3,1) con un valor de 4,5 y la variable del
lenguaje principal M3 es una variable del lenguaje principal de tipo
decimal(3,2) con un valor de 6,25.

MAX(:M1,:M2,:M3)

Devuelve el valor 6,25.

 Supongamos que la variable del lenguaje principal M1 es una variable


del lenguaje principal de tipo character(2) con un valor de 'AA', la
variable del lenguaje principal M2 es una variable del lenguaje
principal de tipo character(3) con un valor de 'AA ' y la variable del
lenguaje principal M3 es una variable del lenguaje principal de tipo
character(4) con un valor de 'AA A'.

MAX(:M1,:M2,:M3)

Devuelve el valor 'AA A'.

© Copyright IBM Corp. 1995, 1996


3.2.43.1 - 1
DB2/400 Manual de Consulta SQL V3R7
MICROSECOND
3.2.44 MICROSECOND

+------------------------------------------------------------------------+
¦ ¦
¦ >--MICROSECOND--(--expresión--)--------------------------------------> ¦
¦ ¦
+------------------------------------------------------------------------+

La función MICROSECOND devuelve la parte de un valor correspondiente a los


microsegundos.

El argumento debe ser una indicación de la hora, una representación de


serie de indicación de la hora o una duración de indicación de la hora.

El resultado de la función es un entero grande. Si el argumento puede ser


nulo, el resultado también; si el argumento es nulo, el resultado es el
valor nulo.

El resto de las reglas dependen del tipo de datos del argumento:

 Si el argumento es una indicación de la hora:

El resultado es la parte del valor correspondiente a los


microsegundos, que es un número entero comprendido entre 0 y 999999.

 Si el argumento es una duración:

El resultado es la parte del valor correspondiente a los


microsegundos, que es un número entero comprendido entre -999999 y
999999. Un resultado no cero tiene el mismo signo que el argumento.

Subtemas
3.2.44.1 Ejemplo

© Copyright IBM Corp. 1995, 1996


3.2.44 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplo
3.2.44.1 Ejemplo

Supongamos que una tabla TABLAA contiene dos columnas, TS1 y TS2, del tipo
TIMESTAMP. Seleccionar todas las filas en las que la parte
correspondiente a los microsegundos de TS1 sean diferentes de cero y la
parte correspondiente a los segundos de TS1 y TS2 sea idéntica.

SELECT * FROM TABLAA


WHERE MICROSECOND(TS1) <> 0 AND SECOND(TS1) = SECOND(TS2)

© Copyright IBM Corp. 1995, 1996


3.2.44.1 - 1
DB2/400 Manual de Consulta SQL V3R7
MIN
3.2.45 MIN

+------------------------------------------------------------------------+
¦ ¦
¦ <-,---------+ ¦
¦ >--MIN--(--expresión,----expresión----)------------------------------> ¦
¦ ¦
+------------------------------------------------------------------------+

La función escalar MIN devuelve el valor mínimo de un conjunto de valores.

Los argumentos deben ser compatibles. Los argumentos de serie de


caracteres son compatibles con los valores de fecha y hora, pero no lo son
con las series gráficas. Todos los argumentos excepto el primero pueden
ser marcadores de parámetros. Debe haber dos o más argumentos. Los
argumentos no pueden ser series de caracteres cuyas longitudes máximas
sean mayores que 256 caracteres, o series gráficas cuyas longitudes
máximas sean mayores que 128 caracteres DBCS o UCS-2.

El resultado de la función es el valor de argumento más pequeño. El


resultado puede ser nulo si por lo menos un argumento puede serlo; el
resultado es el valor nulo si uno de los argumentos es nulo. Los
argumentos seleccionados se convierten, si es necesario, a los atributos
del resultado. Los atributos del resultado se determinan del siguiente
modo:

 Si los argumentos contienen al menos una fecha y los argumentos


restantes son fechas o representaciones de serie válidas de fecha, el
resultado es una fecha. Si los argumentos contienen al menos una hora
y los argumentos restantes son horas o representaciones de serie
válidas de hora, el resultado es una hora. Si los argumentos
contienen al menos una indicación de la hora y los argumentos
restantes son indicaciones de la hora o representaciones de serie
válidas de indicación de la hora, el resultado es una indicación de la
hora.

 Si los argumentos son series, el CCSID del resultado es el CCSID que


resultaría de concatenar los argumentos. Véase el apartado "Reglas de
conversión para operaciones que combinan series" en el tema 4.3.3.

 Si todos los argumentos son series de longitud fija, el resultado es


una serie de longitud fija de longitud n, donde n es la longitud del
argumento más largo.

 Si algún argumento es una serie de longitud variable, el resultado es


una serie de longitud variable con un atributo de longitud n, donde n
es el atributo de longitud del argumento con el mayor atributo de
longitud. La longitud real del resultado es m, donde m es la longitud
real del argumento más pequeño.

 Si los argumentos son números, el tipo de datos del resultado es el


que resultaría de sumar los argumentos. En el caso de un resultado
decimal:

- La escala es s, donde s es la escala del argumento con mayor


escala.

- La precisión es el mínimo de 31 y s+n, donde n es el número de


dígitos del argumento con la mayor diferencia entre su precisión y
su escala.

- El número de dígitos necesarios para representar la parte entera


del argumento más largo no debe se superior a 31-s.

Si está en vigor una secuencia de clasificación distinta de *HEX al


ejecutar la sentencia e intervienen datos SBCS o mixtos, se comparan los
valores significativos de las series en lugar de los valores reales. Los
valores significativos están basados en la secuencia de clasificación.

Subtemas
3.2.45.1 Ejemplos

© Copyright IBM Corp. 1995, 1996


3.2.45 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplos
3.2.45.1 Ejemplos

 Supongamos que la variable del lenguaje principal M1 es una variable


del lenguaje principal de tipo decimal(2,1) con un valor de 5,5, la
variable del lenguaje principal M2 es una variable del lenguaje
principal de tipo decimal(3,1) con un valor de 4,5 y la variable del
lenguaje principal M3 es una variable del lenguaje principal de tipo
decimal(3,2) con un valor de 6,25.

MIN(:M1,:M2,:M3)

Devuelve el valor 4,50.

 Supongamos que la variable del lenguaje principal M1 es una variable


del lenguaje principal de tipo character(2) con un valor de 'AA', la
variable del lenguaje principal M2 es una variable del lenguaje
principal de tipo character(3) con un valor de 'AAA' y la variable del
lenguaje principal M3 es una variable del lenguaje principal de tipo
character(4) con un valor de 'AAAAA'.

MIN(:M1,:M2,:M3)

Devuelve el valor 'AA'.

© Copyright IBM Corp. 1995, 1996


3.2.45.1 - 1
DB2/400 Manual de Consulta SQL V3R7
MINUTE
3.2.46 MINUTE

+------------------------------------------------------------------------+
¦ ¦
¦ >--MINUTE--(--expresión--)-------------------------------------------> ¦
¦ ¦
+------------------------------------------------------------------------+

La función MINUTE devuelve la parte de un valor correspondiente a los


minutos.

El argumento debe ser una hora, una indicación de la hora, una duración de
hora o una duración de indicación de la hora.

El resultado de la función es un entero grande. Si el argumento puede ser


nulo, el resultado también; si el argumento es nulo, el resultado es el
valor nulo.

El resto de las reglas dependen del tipo de datos del argumento:

 Si el argumento es una hora o una indicación de la hora:

El resultado es la parte del valor correspondiente a los minutos, que


es entero comprendido entre 0 y 59.

 Si el argumento es una duración de hora o de indicación de la hora:

El resultado es la parte del valor correspondiente a los minutos, que


es entero comprendido entre -99 y 99. Un resultado no cero tiene el
mismo signo que el argumento.

Subtemas
3.2.46.1 Ejemplo

© Copyright IBM Corp. 1995, 1996


3.2.46 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplo
3.2.46.1 Ejemplo

Utilizando la tabla de ejemplo CL_PREVI, seleccionar todas las clases con


una duración inferior a 50 minutos.

SELECT * FROM CL_PREVI


WHERE HOUR(FIN - INICIO) = 0 AND
MINUTE(FIN - INICIO) < 50

© Copyright IBM Corp. 1995, 1996


3.2.46.1 - 1
DB2/400 Manual de Consulta SQL V3R7
MOD
3.2.47 MOD

+------------------------------------------------------------------------+
¦ ¦
¦ >--MOD--(--expresión,--expresión--)----------------------------------> ¦
¦ ¦
+------------------------------------------------------------------------+

La función MOD divide el primer argumento entre el segundo y devuelve el


resto.

La fórmula utilizada para calcular el resto es:

MOD(x,y) = x - (x/y) * y

donde x/y es el resultado de entero truncado de la división.

Los argumentos deben ser números. El segundo argumento no puede ser cero.

Si un argumento puede ser nulo, el resultado también; si un argumento es


nulo, el resultado es el valor nulo.

Los atributos del resultado se determinan del siguiente modo:

 Si ambos argumentos son enteros de escala cero, el tipo de datos del


resultado es un entero grande.

 Si un argumento es un entero de escala cero y el otro es decimal, el


resultado es decimal con la misma precisión y escala que el argumento
decimal.

 Si ambos argumentos son número decimales o enteros con escala, el


resultado es decimal. La precisión del resultado es min (p-s,p'-s') +
max (s,s') y la escala del resultado es max (s,s'), donde los símbolos
p y s denotan la precisión y la escala del primer operando, y los
símbolos p' y s' la precisión y la escala del segundo operando.

 Si uno de los dos argumentos es de coma flotante, el tipo de datos del


resultado es coma flotante de precisión doble.

La operación se realiza en coma flotante; previamente se convierten


los operandos en números de coma flotante de precisión doble, si es
necesario.

Una operación en la que intervengan un número de coma flotante y un


entero se realiza con una copia temporal del entero, que se ha
convertido a coma flotante de precisión doble. Una operación en la
que intervengan un número de coma flotante y un número decimal se
realiza con una copia temporal del número decimal, que se ha
convertido a coma flotante de precisión doble. El resultado de una
operación de coma flotante debe estar dentro del rango de números de
coma flotante.

Subtemas
3.2.47.1 Ejemplos

© Copyright IBM Corp. 1995, 1996


3.2.47 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplos
3.2.47.1 Ejemplos

 Supongamos que la variable del lenguaje principal M1 es una variable


del lenguaje principal de entero con un valor de 5 y que la variable
del lenguaje principal M2 es una variable del lenguaje principal de
entero con un valor de 2.

MOD(:M1,:M2)

Devuelve el valor 1.

 Supongamos que la variable del lenguaje principal M1 es una variable


del lenguaje principal de entero con un valor de 5 y que la variable
del lenguaje principal M2 es una variable del lenguaje principal
decimal(3,1) con un valor de 2,2.

MOD(:M1,:M2)

Devuelve el valor 0,6.

 Supongamos que la variable del lenguaje principal M1 es una variable


del lenguaje principal de entero con un valor de 5 y que la variable
del lenguaje principal M2 es una variable del lenguaje principal
decimal(3,2) con un valor de 2,20.

MOD(:M1,:M2)

Devuelve el valor 0,60.

 Supongamos que la variable del lenguaje principal M1 es una variable


del lenguaje principal decimal(4,2) con un valor de 5,50 y que la
variable del lenguaje principal M2 es una variable del lenguaje
principal decimal(4,1) con un valor de 2,0.

MOD(:M1,:M2)

Devuelve el valor 1,50.

© Copyright IBM Corp. 1995, 1996


3.2.47.1 - 1
DB2/400 Manual de Consulta SQL V3R7
MONTH
3.2.48 MONTH

+------------------------------------------------------------------------+
¦ ¦
¦ >--MONTH--(--expresión--)--------------------------------------------> ¦
¦ ¦
+------------------------------------------------------------------------+

La función MONTH devuelve la parte de un valor correspondiente al mes.

El argumento debe ser una fecha, una indicación de la hora, una duración
de fecha o una duración de indicación de la hora.

El resultado de la función es un entero grande. Si el argumento puede ser


nulo, el resultado también; si el argumento es nulo, el resultado es el
valor nulo.

El resto de las reglas dependen del tipo de datos del argumento:

 Si el argumento es una fecha o una indicación de la hora:

El resultado es la parte del valor correspondiente al mes, que es un


número entero entre 1 y 12.

 Si el argumento es una duración de fecha o duración de indicación de


la hora:

El resultado es la parte del valor correspondiente al mes, que es un


entero comprendido entre -99 y 99. Un resultado no cero tiene el
mismo signo que el argumento.

Subtemas
3.2.48.1 Ejemplo

© Copyright IBM Corp. 1995, 1996


3.2.48 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplo
3.2.48.1 Ejemplo

 Seleccionar todas las filas de la tabla EMPLEADO correspondientes a


las personas nacidas (FCHNACIM) en diciembre.

SELECT * FROM EMPLEADO


WHERE MONTH(FCHNACIM) = 12

© Copyright IBM Corp. 1995, 1996


3.2.48.1 - 1
DB2/400 Manual de Consulta SQL V3R7
NODENAME
|3.2.49 NODENAME

+------------------------------------------------------------------------+
|¦ ¦
|¦ >--NODENAME--(--designador-tabla--)----------------------------------> ¦
¦ ¦
+------------------------------------------------------------------------+

|La función NODENAME devuelve el nombre de la base de datos relacional en


|la que se ha ubicado una fila. Si el argumento identifica una tabla no
|distribuida, se devuelve el valor del registro especial CURRENT SERVER.
|Para obtener más información sobre los nodos, consulte la publicación DB2
|Multisystem for OS/400, SC41-3705.

|El argumento es un designador de tabla de la subselección. Para obtener


|más información acerca de los designadores de tabla, consulte el apartado
|"Designadores de tabla" en el tema 2.10.3.

|En la denominación de SQL, el nombre de tabla puede calificarse. En la


|denominación del sistema no se puede calificar el nombre de la tabla.

|Si el argumento identifica una vista, la función devuelve el nombre de la


|base de datos relacional de su tabla base. Si el argumento identifica una
|vista derivada de más de una tabla base, la función devuelve el nombre de
|la base de datos relacional de la primera tabla de la subselección
|exterior de la vista.

|El argumento no debe identificar una vista cuya subselección exterior


|incluya una función de columna, una cláusula GROUP BY o una cláusula
|HAVING. Si la subselección contiene una cláusula GROUP BY o HAVING, la
|función NODENAME sólo puede especificarse en la cláusula WHERE o como un
|operando de una función de columna. Si el argumento es un nombre de
|correlación, éste no debe identificar una referencia correlacionada.

|El tipo de datos del resultado es VARCHAR(18). El resultado no puede ser


|nulo.

Subtemas
3.2.49.1 Ejemplo

© Copyright IBM Corp. 1995, 1996


3.2.49 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplo
|3.2.49.1 Ejemplo

|Unir las tablas EMPLEADO y DEPARTAMENTO, seleccionar el número de empleado


|(NUMEMP) y determinar el nodo a partir del cual se originó cada fila
|implicada en la unión.

| SELECT NUMEMP, NODENAME(X),


| NODENAME(Y)
| FROM DATOSCORP.EMPLEADO X, DATOSCORP.DEPARTMENTO Y
| WHERE X.NUMDEP=Y.NUMDEP

© Copyright IBM Corp. 1995, 1996


3.2.49.1 - 1
DB2/400 Manual de Consulta SQL V3R7
NODENUMBER
3.2.50 NODENUMBER

+------------------------------------------------------------------------+
¦ ¦
¦ >--NODENUMBER--(--designador-tabla--)--------------------------------> ¦
¦ ¦
+------------------------------------------------------------------------+

|La función NODENUMBER devuelve el número de nodo de una fila. Si el


|argumento identifica una tabla no distribuida, se devuelve el valor 0.
|Para obtener más información sobre nodos y números de nodos, consulte la
|publicación DB2 Multisystem for OS/400, SC41-3705.

|El argumento es un designador de tabla de la subselección. Para obtener


más información sobre los designadores de tablas, consulte el apartado
"Designadores de tabla" en el tema 2.10.3.

En la denominación de SQL, el nombre de tabla puede calificarse. En la


denominación del sistema, no se puede calificar el nombre de la tabla.

|Si el argumento identifica una vista, la función devuelve el número de


|nodo de la tabla base. Si el argumento identifica una vista derivada de
|más de una tabla base, la función devuelve el número de nodo de la primera
|tabla de la subselección exterior de la vista.

El argumento no debe identificar una vista cuya subselección exterior


incluya una función de columna, una cláusula GROUP BY o una cláusula
|HAVING. Si la subselección contiene una cláusula GROUP BY o HAVING, la
|función NODENUMBER sólo puede especificarse en la cláusula WHERE o como un
|operando de una función de columna. Si el argumento es un nombre de
|correlación, éste no debe identificar una referencia correlacionada.

|El tipo de datos del resultado es entero grande. El resultado no puede


ser nulo.

Subtemas
3.2.50.1 Ejemplo

© Copyright IBM Corp. 1995, 1996


3.2.50 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplo
3.2.50.1 Ejemplo

|Determinar el número de nodo y el nombre del empleado para cada fila de la


|tabla DATOSCORP.EMPLEADO. Si se trata de una tabla distribuida, se
|devuelve el número del nodo en el que se haya la fila.

| SELECT NODENUMBER(DATOSCORP.EMPLEADO), APELL


| FROM DATOSCORP.EMPLEADO

© Copyright IBM Corp. 1995, 1996


3.2.50.1 - 1
DB2/400 Manual de Consulta SQL V3R7
NOW
3.2.51 NOW

+------------------------------------------------------------------------+
¦ ¦
¦ >--NOW--(--)---------------------------------------------------------> ¦
¦ ¦
+------------------------------------------------------------------------+

La función NOW devuelve una indicación de la hora basándose en una lectura


del reloj de la hora del día al ejecutar la sentencia SQL en el servidor
actual. El valor que devuelve la función NOW es igual al valor que
devuelve el registro especial CURRENT TIMESTAMP. Si esta función se
utiliza más de una vez dentro de una única sentencia SQL, se utiliza con
las funciones escalares CURDATE o CURTIME, o se utiliza con los registros
especiales CURRENT DATE, CURRENT TIME o CURRENT TIMESTAMP dentro de una
única sentencia, todos los valores se basan en una única lectura del
reloj.

El tipo de datos del resultado es una indicación de la hora.

Subtemas
3.2.51.1 Ejemplo

© Copyright IBM Corp. 1995, 1996


3.2.51 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplo
3.2.51.1 Ejemplo

Devuelve la indicación de la hora actual basándose en el reloj de la hora


del día.

NOW()

© Copyright IBM Corp. 1995, 1996


3.2.51.1 - 1
DB2/400 Manual de Consulta SQL V3R7
PARTITION
|3.2.52 PARTITION

+------------------------------------------------------------------------+
|¦ ¦
|¦ >--PARTITION--(--designador-tabla--)---------------------------------> ¦
¦ ¦
+------------------------------------------------------------------------+

|La función PARTITION devuelve el número de partición de una fila obtenida


|aplicando la función hash en el valor clave de partición de la fila.
|Consulte también la función HASH. Si el argumento identifica una tabla no
|distribuida, se devuelve el valor 0. Para obtener más información sobre
|números y claves de partición, consulte la publicación DB2 Multisystem for
|OS/400, SC41-3705.

|El argumento es un designador de tabla de la subselección. Para obtener


|más información acerca de los designadores de tabla, consulte el apartado
|"Designadores de tabla" en el tema 2.10.3.

|En la denominación de SQL, el nombre de tabla puede calificarse. En la


|denominación del sistema no se puede calificar el nombre de la tabla.

|Si el argumento identifica una vista SQL, la función devuelve el número de


|partición de la tabla base. Si el argumento identifica una vista SQL
|derivada de más de una tabla base, la función devuelve el número de
|partición de la primera tabla de la subselección exterior de la vista.

|El argumento no debe identificar una vista cuya subselección exterior


|incluya una función de columna, una cláusula GROUP BY o una cláusula
|HAVING. Si la subselección contiene una cláusula GROUP BY o HAVING, la
|función PARTITION sólo puede especificarse en la cláusula WHERE o como un
|operando de una función de columna. Si el argumento es un nombre de
|correlación, éste no debe identificar una referencia correlacionada.

|El tipo de datos del resultado es entero grande con un valor entre 0 y
|1023. El resultado no puede ser nulo.

Subtemas
3.2.52.1 Ejemplo

© Copyright IBM Corp. 1995, 1996


3.2.52 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplo
|3.2.52.1 Ejemplo

|Seleccionar el número de empleado (NUMEMP) de la tabla EMPLEADO para todas


|las filas en las que el número de partición sea igual a 100.

| SELECT NUMEMP
| FROM DATOSCORP.EMPLEADO
| WHERE PARTITION(DATOSCORP.EMPLEADO) = 100

© Copyright IBM Corp. 1995, 1996


3.2.52.1 - 1
DB2/400 Manual de Consulta SQL V3R7
POWER
3.2.53 POWER

+------------------------------------------------------------------------+
¦ ¦
¦ >--POWER--(--expresión--,--expresión--)------------------------------> ¦
¦ ¦
+------------------------------------------------------------------------+

La función POWER devuelve el resultado de elevar el primer argumento a la


potencia del segundo argumento. (20)

Ambos argumentos deben ser números.

El resultado de la función es un número de coma flotante de precisión


doble. Si el argumento puede ser nulo, el resultado también; si el
argumento es nulo, el resultado es el valor nulo.

(20) El resultado de la función POWER es exactamente igual que


el resultado de la: expresión-1 ** expresión-2.

Subtemas
3.2.53.1 Ejemplo

© Copyright IBM Corp. 1995, 1996


3.2.53 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplo
3.2.53.1 Ejemplo

Supongamos que la variable del lenguaje principal HPOWER es un entero con


el valor 3.

POWER(2,:HPOWER)

Devuelve el valor 8.

© Copyright IBM Corp. 1995, 1996


3.2.53.1 - 1
DB2/400 Manual de Consulta SQL V3R7
QUARTER
3.2.54 QUARTER

+------------------------------------------------------------------------+
¦ ¦
¦ >--QUARTER--(--expresión--)------------------------------------------> ¦
¦ ¦
+------------------------------------------------------------------------+

La función QUARTER devuelve un entero entre el 1 y el 4, que representa el


trimestre del año en que reside la fecha. Por ejemplo, todas las fechas de
enero, febrero o marzo devolverán el entero 1.

El argumento debe ser una fecha o indicación de la hora.

El resultado de la función es un entero grande. Si el argumento puede ser


nulo, el resultado también; si el argumento es nulo, el resultado es el
valor nulo.

Subtemas
3.2.54.1 Ejemplo

© Copyright IBM Corp. 1995, 1996


3.2.54 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplo
3.2.54.1 Ejemplo

Utilizando la tabla PROYECTO, establecer la variable del lenguaje


principal TRIM (int) en el trimestre en que finalizó (FCHFINPR) el
proyecto 'PL2100'.

SELECT QUARTER(FCHFINPR)
INTO :TRIM
FROM PROYECTO
WHERE NUMPROY = 'PL2100'

Da como resultado que QUART quede establecido en 3 cuando se utiliza la


tabla de ejemplo.

© Copyright IBM Corp. 1995, 1996


3.2.54.1 - 1
DB2/400 Manual de Consulta SQL V3R7
RRN
3.2.55 RRN

+------------------------------------------------------------------------+
¦ ¦
¦ >--RRN--(--designador-tabla--)---------------------------------------> ¦
¦ ¦
+------------------------------------------------------------------------+

La función RRN devuelve el número relativo de registro de una fila.

El argumento es un designador de tabla de la subselección. Para obtener


más información acerca de los designadores de tabla, consulte el apartado
"Designadores de tabla" en el tema 2.10.3.

En la denominación de SQL, el nombre de tabla puede calificarse. En la


denominación del sistema, el nombre de tabla no puede calificarse.

Si el argumento identifica una vista, la función devuelve el número de


registro relativo de su tabla base. Si el argumento identifica una vista
derivada de más de una tabla base, la función devuelve el número de
registro relativo de la primera tabla de la subselección exterior de la
vista.

|Si el argumento identifica una tabla distribuida, la función devuelve el


|número de registro relativo de la fila en el nodo en el que se ubica la
|fila. Esto significa que el valor RRN no será exclusivo para cada fila de
|una tabla distribuida.

El argumento no debe identificar una vista cuya subselección exterior


incluya una función de columna, una cláusula GROUP BY o una cláusula
HAVING. La función RRN no puede especificarse en una cláusula SELECT si
la subselección contiene una función de columna, una cláusula GROUP BY o
una cláusula HAVING. Si el argumento es un nombre de correlación, éste no
debe identificar una referencia correlacionada.

El tipo de datos del resultado es entero grande. El resultado puede ser


nulo. El valor RRN para una fila que pertenezca a una tabla del lado
derecho para uniones de excepción y exteriores izquierdas devolverá 0 para
una fila que no coincida.

Subtemas
3.2.55.1 Ejemplo

© Copyright IBM Corp. 1995, 1996


3.2.55 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplo
3.2.55.1 Ejemplo

SELECT RRN(DATOSCORP.EMPLEADO), APELL


FROM DATOSCORP.EMPLEADO
WHERE NUMDEPT = 20

Devuelve el número de registro relativo y el nombre de empleado de la


tabla EMPLEADO correspondientes a los empleados del departamento 20.

© Copyright IBM Corp. 1995, 1996


3.2.55.1 - 1
DB2/400 Manual de Consulta SQL V3R7
RTRIM
3.2.56 RTRIM

+------------------------------------------------------------------------+
¦ ¦
¦ >--RTRIM--(--expresión--)--------------------------------------------> ¦
¦ ¦
+------------------------------------------------------------------------+

La función RTRIM elimina los blancos del final de una expresión de


serie. (21)

El argumento debe ser una expresión de serie.

 Si el argumento es una serie gráfica DBCS, se eliminan los blancos


DBCS de cola.

 Si el primer argumento es una serie gráfica UCS-2, se eliminan los


blancos UCS-2 de cola.

 De lo contrario, se eliminan los blancos SBCS de cola.

El resultado de la función es una serie de longitud variable con la misma


longitud máxima que el atributo de longitud de la serie. La longitud real
del resultado es la longitud de la expresión menos el número de caracteres
eliminados. Si se eliminan todos los caracteres, el resultado es una
serie de longitud variable vacía.

El CCSID del resultado es el mismo que el de la serie. Si el primer


argumento puede ser nulo, el resultado también; si el primer argumento es
nulo, el resultado es el valor nulo.

(21) La función RTRIM devuelve el mismo resultado que:


STRIP(expresión,TRAILING)

Subtemas
3.2.56.1 Ejemplo

© Copyright IBM Corp. 1995, 1996


3.2.56 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplo
3.2.56.1 Ejemplo

Supongamos que la variable de lenguaje principal HOLA de tipo CHAR(9)


tiene el valor 'Hola '.

RTRIM(:HOLA)

Da como resultado: 'Hola'.

© Copyright IBM Corp. 1995, 1996


3.2.56.1 - 1
DB2/400 Manual de Consulta SQL V3R7
SECOND
3.2.57 SECOND

+------------------------------------------------------------------------+
¦ ¦
¦ >--SECOND--(--expresión--)-------------------------------------------> ¦
¦ ¦
+------------------------------------------------------------------------+

La función SECOND devuelve la parte de un valor correspondiente a los


segundos.

El argumento debe ser una hora, una indicación de la hora, una duración de
hora o una duración de indicación de la hora.

El resultado de la función es un entero grande. Si el argumento puede ser


nulo, el resultado también; si el argumento es nulo, el resultado es el
valor nulo.

El resto de las reglas dependen del tipo de datos del argumento:

 Si el argumento es una hora o una indicación de la hora:

El resultado es la parte del valor correspondiente a los segundos, que


es un entero comprendido entre 0 y 59.

 Si el argumento es una duración de hora o de indicación de la hora:

El resultado es la parte del valor correspondiente a los segundos, que


es un entero comprendido entre -99 y 99. Un resultado no cero tiene
el mismo signo que el argumento.

Subtemas
3.2.57.1 Ejemplos

© Copyright IBM Corp. 1995, 1996


3.2.57 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplos
3.2.57.1 Ejemplos

 Supongamos que la variable de lenguaje principal DUR_TEMP


(decimal(6,0)) tiene el valor 153045.

SECOND(:DUR_TEMP)

Devuelve el valor 45.

 Supongamos que la columna RECIBIDO (timestamp) tiene un valor interno


equivalente a 1988-12-25-17.12.30.000000.

SECOND(RECIBIDO)

Devuelve el valor 30.

© Copyright IBM Corp. 1995, 1996


3.2.57.1 - 1
DB2/400 Manual de Consulta SQL V3R7
SIN
3.2.58 SIN

+------------------------------------------------------------------------+
¦ ¦
¦ >--SIN--(----expresión----)------------------------------------------> ¦
¦ ¦
+------------------------------------------------------------------------+

La función SIN devuelve el seno de un número. Las funciones SIN y ASIN


son operaciones inversas.

El argumento debe ser un número cuyo valor esté especificado en radianes.

El tipo de datos del resultado es de coma flotante de precisión doble. Si


el argumento puede ser nulo, el resultado también; si el argumento es
nulo, el resultado es el valor nulo.

Subtemas
3.2.58.1 Ejemplo

© Copyright IBM Corp. 1995, 1996


3.2.58 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplo
3.2.58.1 Ejemplo

Supongamos que la variable del lenguaje principal SENO es una variable del
lenguaje principal decimal (2,1) con un valor de 1,5.

SIN(:SENO)

Devuelve el valor aproximado 0,99.

© Copyright IBM Corp. 1995, 1996


3.2.58.1 - 1
DB2/400 Manual de Consulta SQL V3R7
SINH
3.2.59 SINH

+------------------------------------------------------------------------+
¦ ¦
¦ >--SINH--(----expresión----)-----------------------------------------> ¦
¦ ¦
+------------------------------------------------------------------------+

La función SINH devuelve el seno hiperbólico de un número.

El argumento debe ser un número cuyo valor esté especificado en radianes.

El tipo de datos del resultado es de coma flotante de precisión doble. Si


el argumento puede ser nulo, el resultado también; si el argumento es
nulo, el resultado es el valor nulo.

Subtemas
3.2.59.1 Ejemplo

© Copyright IBM Corp. 1995, 1996


3.2.59 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplo
3.2.59.1 Ejemplo

Supongamos que la variable del lenguaje principal SENOH es una variable


del lenguaje principal decimal (2,1) con un valor de 1,5.

SINH(:SENOH)

Devuelve el valor aproximado 2,12.

© Copyright IBM Corp. 1995, 1996


3.2.59.1 - 1
DB2/400 Manual de Consulta SQL V3R7
SQRT
3.2.60 SQRT

+------------------------------------------------------------------------+
¦ ¦
¦ >--SQRT--(----expresión----)-----------------------------------------> ¦
¦ ¦
+------------------------------------------------------------------------+

La función SQRT devuelve la raíz cuadrada de un número.

El argumento debe ser un número cuyo valor sea numérico y positivo.

El tipo de datos del resultado es de coma flotante de precisión doble. Si


el argumento puede ser nulo, el resultado también; si el argumento es
nulo, el resultado es el valor nulo.

Subtemas
3.2.60.1 Ejemplo

© Copyright IBM Corp. 1995, 1996


3.2.60 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplo
3.2.60.1 Ejemplo

Supongamos que la variable del lenguaje principal RAIZCUAD es una variable


del lenguaje principal decimal (2,1) con un valor de 9,0.

SQRT(:RAIZCUAD)

Devuelve el valor aproximado 3,00.

© Copyright IBM Corp. 1995, 1996


3.2.60.1 - 1
DB2/400 Manual de Consulta SQL V3R7
STRIP
3.2.61 STRIP

+------------------------------------------------------------------------+
¦ ¦
¦ >--STRIP--(--expresión-----------------------------------------------> ¦
¦ ¦
¦ >------------------------------------------------)-------------------> ¦
¦ +---,BOTH----------------------------------+ ¦
¦ +-,B--------¦ +-,carácter-eliminación-+ ¦
¦ +-,LEADING--¦ ¦
¦ +-,L--------¦ ¦
¦ +-,TRAILING-¦ ¦
¦ +-,T--------+ ¦
¦ ¦
+------------------------------------------------------------------------+

La función STRIP elimina los blancos u otros caracteres especificados del


final o del principio de cualquier expresión de tipo serie.

El primer argumento debe ser una expresión de tipo serie.

El segundo argumento, si se especifica, indica si los caracteres se


eliminan del principio o del final de la serie. Si no se especifica el
segundo argumento, se eliminarán todos los blancos del principio y del
final de la serie.

El tercer argumento, si se especifica, es una constante de un solo


carácter que indica si se debe eliminar o no el carácter SBCS o DBCS. Si
el primer argumento es una serie gráfica DBCS o una serie de sólo DBCS, el
tercer argumento debe ser una constante gráfica que conste de un solo
carácter DBCS. Si el primer argumento es una serie gráfica UCS-2, el
tercer argumento no puede especificarse. Si el tercer argumento no se
especifica:

 Si el primer argumento es una serie gráfica DBCS, el carácter de


eliminación por omisión es un blanco DBCS.

 Si el primer argumento es una serie gráfica UCS-2, el carácter de


eliminación por omisión es un blanco UCS-2.

 De lo contrario, el carácter de eliminación por omisión es un blanco


SBCS.

El resultado de la función es una serie de longitud variable con la misma


longitud máxima que el atributo de longitud de la serie. La longitud real
del resultado es la longitud de la expresión menos el número de bytes
eliminados. Si todos los caracteres se eliminan, el resultado es una serie
de longitud variable vacía.

El CCSID del resultado es el mismo que el de la serie. Si el primer


argumento puede ser nulo, el resultado también; si el primer argumento es
nulo, el resultado es el valor nulo.

Subtemas
3.2.61.1 Ejemplos

© Copyright IBM Corp. 1995, 1996


3.2.61 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplos
3.2.61.1 Ejemplos

 Supongamos que la variable de lenguaje principal HOLA de tipo CHAR(9)


tiene el valor ' Hola'.

STRIP(:HOLA)
Da como resultado: 'Hola'.

STRIP(:HOLA,TRAILING)
Da como resultado: ' Hola'.

 Supongamos que la variable del lenguaje principal SALDO de tipo


CHAR(9) tiene un valor de '000345.50'.

STRIP(:SALDO,L,'0')
Da como resultado: '345.50'

 Supongamos que la serie a recortar contiene datos mixtos.

STRIP( IMAGEN 11,BOTH, IMAGEN 12)


Da como resultado: IMAGEN 13

© Copyright IBM Corp. 1995, 1996


3.2.61.1 - 1
DB2/400 Manual de Consulta SQL V3R7
SUBSTRING o SUBSTR
3.2.62 SUBSTRING o SUBSTR

+------------------------------------------------------------------------+
¦ ¦
¦ >------SUBSTR-------(--serie,--inicio-----------------)--------------> ¦
¦ ¦ +-SUBSTRING-+ +-,longitud-+ ¦ ¦
¦ +-SUBSTRING--(--serie--FROM--inicio----------------------)-+ ¦
¦ +- FOR--longitud-+ ¦
¦ ¦
+------------------------------------------------------------------------+

Las funciones SUBSTR y SUBSTRING se utilizan para obtener una subserie de


una serie.

Si serie es una serie de caracteres, el resultado es una serie de


caracteres. Si serie es una serie gráfica, el resultado es una serie
gráfica. Si serie es una serie de caracteres, un carácter es un byte. Si
serie es una serie gráfica, un carácter es un carácter DBCS o UCS-2. Si
alguno de los argumentos de la función SUBSTR puede ser nulo, el resultado
puede ser nulo; si algún argumento es nulo, el resultado es el valor nulo.
El CCSID del resultado es el mismo que el de la serie.

serie
Denota una expresión que especifica la serie de la cual se deriva el
resultado. Serie debe ser una serie de caracteres o una serie
gráfica.

Una subserie de la serie es cero o más bytes contiguos de la serie.


La función SUBSTR acepta datos mixtos. Sin embargo, y puesto que
SUBSTR funciona basándose en un recuento estricto de los bytes, el
resultado no es necesariamente una serie de caracteres de datos mixtos
formada como es debido. Si se especifica la función SUBSTRING, serie
no puede ser una serie de caracteres mixta.

inicio
Denota una expresión que especifica la posición del primer carácter (o
byte) del resultado. Debe ser un entero binario positivo no mayor que
el atributo de longitud de serie (el atributo de longitud de una serie
de longitud variable es su longitud máxima).

longitud
Denota una expresión que especifica la longitud del resultado. Si se
especifica, longitud debe ser un entero binario comprendido entre 0 y
n, donde n es la longitud del atributo de serie - inicio + 1. No
obstante, no debe ser la constante de entero 0.

Si serie es una serie de longitud variable y longitud se especifica


explícitamente, serie se rellena de forma efectiva por la derecha con
el número de caracteres blancos que sea necesario para que la subserie
especificada de serie exista siempre.

Si serie es una serie de longitud fija, la omisión de longitud es una


especificación implícita de LENGTH(serie) - inicio + 1, que es el
número de caracteres (o bytes) desde el carácter (o byte) de inicio
hasta el último carácter (o byte) de serie. Si serie es una serie de
longitud variable, la omisión de longitud constituye la especificación
implícita de cero o LENGTH(serie) - inicio + 1, el que sea mayor de
los dos. Si la longitud del resultado es cero, el resultado es la
serie vacía.

Si longitud se especifica explícitamente mediante una constante de


entero, el resultado es una serie de longitud fija. Si longitud no se
especifica explícitamente, pero serie es una serie de longitud fija e
inicio es una constante de entero, el resultado es una serie de
longitud fija con un atributo de longitud de LENGTH(serie) - inicio +
1. En el resto de los casos, el resultado es una serie de longitud
variable con un atributo de longitud igual al atributo de longitud de
la serie (recuerde que si la longitud real de serie es menor que el
valor de inicio, la longitud real de la subserie es cero).

Subtemas
3.2.62.1 Ejemplos

© Copyright IBM Corp. 1995, 1996


3.2.62 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplos
3.2.62.1 Ejemplos

 Supongamos que la variable de lenguaje principal NOMBRE (varchar(50))


tiene un valor de 'MAITE AYALA' y que la variable de lenguaje
principal POS_APELL (int) tiene un valor de 6.

SUBSTR(:NOMBRE, :POS_APELL)

Devuelve el valor 'AYALA'

SUBSTR(:NOMBRE, :POS_APELL, 1)

Devuelve el valor 'A'.

 Seleccionar todas aquellas filas de la tabla PROYECTO para las que el


nombre de proyecto (NOMBREPR) empiece por la palabra 'OPERACION '.

SELECT * FROM PROYECTO


WHERE SUBSTR(NOMBREPR,1,10) = 'OPERACION '

El espacio al final de la constante es necesario para excluir las


palabras iniciales del tipo 'OPERACIONES'.

© Copyright IBM Corp. 1995, 1996


3.2.62.1 - 1
DB2/400 Manual de Consulta SQL V3R7
TAN
3.2.63 TAN

+------------------------------------------------------------------------+
¦ ¦
¦ >--TAN--(----expresión----)------------------------------------------> ¦
¦ ¦
+------------------------------------------------------------------------+

La función TAN devuelve la tangente de un número. Las funciones TAN y


ATAN son operaciones inversas.

El argumento debe ser un número cuyo valor esté especificado en radianes.

El tipo de datos del resultado es de coma flotante de precisión doble. Si


el argumento puede ser nulo, el resultado también; si el argumento es
nulo, el resultado es el valor nulo.

Subtemas
3.2.63.1 Ejemplo

© Copyright IBM Corp. 1995, 1996


3.2.63 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplo
3.2.63.1 Ejemplo

Supongamos que la variable del lenguaje principal TANGENTE es una variable


del lenguaje principal decimal (2,1) con un valor de 1,5.

TAN(:TANGENTE)

Devuelve el valor aproximado 14,10.

© Copyright IBM Corp. 1995, 1996


3.2.63.1 - 1
DB2/400 Manual de Consulta SQL V3R7
TANH
3.2.64 TANH

+------------------------------------------------------------------------+
¦ ¦
¦ >--TANH--(----expresión----)-----------------------------------------> ¦
¦ ¦
+------------------------------------------------------------------------+

La función TANH devuelve la tangente hiperbólica de un número. Las


funciones TANH y ATANH son operaciones inversas.

El argumento debe ser un número cuyo valor esté especificado en radianes.

El tipo de datos del resultado es de coma flotante de precisión doble. Si


el argumento puede ser nulo, el resultado también; si el argumento es
nulo, el resultado es el valor nulo.

Subtemas
3.2.64.1 Ejemplo

© Copyright IBM Corp. 1995, 1996


3.2.64 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplo
3.2.64.1 Ejemplo

Supongamos que la variable del lenguaje principal TANGENTEH es una


variable del lenguaje principal decimal (2,1) con un valor de 1,5.

TANH(:TANGENTEH)

Devuelve el valor aproximado 0,90.

© Copyright IBM Corp. 1995, 1996


3.2.64.1 - 1
DB2/400 Manual de Consulta SQL V3R7
TIME
3.2.65 TIME

+------------------------------------------------------------------------+
¦ ¦
¦ >--TIME--(--expresión--)---------------------------------------------> ¦
¦ ¦
+------------------------------------------------------------------------+

La función TIME devuelve una hora a partir de un valor.

El argumento debe ser una indicación de la hora, una hora o una


representación de serie válida de una hora.

El resultado de la función es una hora. Si el argumento puede ser nulo,


el resultado también; si el argumento es nulo, el resultado es el valor
nulo.

El resto de las reglas dependen del tipo de datos del argumento:

 Si el argumento es una indicación de la hora:

El resultado es la parte de la indicación de la hora correspondiente a


la hora.

 Si el argumento es una hora:

El resultado es esa hora.

 Si el argumento es una serie de caracteres:

Cuando una representación de serie de una hora es de datos SBCS con un


CCSID que es distinto del CCSID por omisión correspondiente a los
datos SBCS, se convierte dicho valor para adherirse al CCSID por
omisión de los datos SBCS antes de interpretarlo y convertirlo a un
valor de hora.

Cuando una representación de serie de una hora es de datos mixtos con


un CCSID que es distinto del CCSID por omisión correspondiente a los
datos mixtos, se convierte dicho valor para adherirse al CCSID por
omisión de los datos mixtos antes de interpretarlo y convertirlo a un
valor de hora.

Subtemas
3.2.65.1 Ejemplo

© Copyright IBM Corp. 1995, 1996


3.2.65 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplo
3.2.65.1 Ejemplo

Seleccionar todas las notas de la tabla de ejemplo BAND_EN recibidas en el


mismo día (cualquier día) al menos una hora después de la la hora actual.

SELECT * FROM BAND_EN


WHERE TIME(RECIBIDO) >= CURRENT TIME + 1 HOUR

© Copyright IBM Corp. 1995, 1996


3.2.65.1 - 1
DB2/400 Manual de Consulta SQL V3R7
TIMESTAMP
3.2.66 TIMESTAMP

+------------------------------------------------------------------------+
¦ ¦
¦ >--TIMESTAMP--(--expresión------------------)------------------------> ¦
¦ +-,expresión-+ ¦
¦ ¦
+------------------------------------------------------------------------+

La función TIMESTAMP devuelve una indicación de la hora a partir de un


valor o de un par de valores.

Las reglas para los argumentos dependen de si se especifica o no el


segundo argumento.

 Si sólo se especifica un argumento:

Este debe ser una indicación de la hora, una representación de serie


válida de una indicación de la hora o una serie de caracteres de
longitud 14.

La serie de caracteres de longitud 14 debe ser una serie de dígitos


que represente una fecha y hora válidas en el formato aaaaxxddhhmmss,
donde aaaa es el año, xx es el mes, dd es el día, hh la hora, mm los
minutos y ss los segundos.

 Si se especifican ambos argumentos:

El primer argumento debe ser una fecha o una representación de serie


válida de una fecha; el segundo argumento debe ser una hora o la
representación de serie válida de una hora.

El resultado de la función es una indicación de la hora. Si uno de los


dos argumentos puede ser nulo, el resultado también; si uno de los dos
argumentos es nulo el resultado es el valor nulo.

El resto de las reglas dependen de si se especifica o no el segundo


argumento:

 Si se especifican ambos argumentos:

El resultado es una indicación de la hora con la fecha especificada


por el primer argumento y la hora por el segundo. La parte de la
indicación de la hora correspondiente a los microsegundos es cero.

 Si sólo se especifica un argumento y es una indicación de la hora:

El resultado es esa indicación de la hora.

 Si sólo se especifica un argumento y es una serie de caracteres:

El resultado es la indicación de la hora representada por la serie de


caracteres. Si el argumento es una serie de caracteres de longitud
14, la indicación de la hora tiene la parte de los microsegundos igual
a cero.

Cuando una representación de serie de una indicación de la hora es de


datos SBCS con un CCSID que es distinto del CCSID por omisión
correspondiente a los datos SBCS, se convierte dicho valor para adherirse
al CCSID por omisión de los datos SBCS antes de interpretarlo y
convertirlo a un valor de indicación de la hora.

Cuando una representación de serie de una indicación de la hora es de


datos mixtos con un CCSID que es distinto del CCSID por omisión
correspondiente a los datos mixtos, se convierte dicho valor para
adherirse al CCSID por omisión de los datos mixtos antes de interpretarlo
y convertirlo a un valor de indicación de la hora.

Subtemas
3.2.66.1 Ejemplo

© Copyright IBM Corp. 1995, 1996


3.2.66 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplo
3.2.66.1 Ejemplo

 Supongamos que la columna FECHA_INICIO (date) tiene un valor


equivalente a 1988-12-25 y que la columna HORA_INICIO (time) tiene un
valor equivalente a 17.12.30.

TIMESTAMP(FECHA_INICIO, HORA_INICIO)

Devuelve el valor '1988-12-25-17.12.30.000000'.

© Copyright IBM Corp. 1995, 1996


3.2.66.1 - 1
DB2/400 Manual de Consulta SQL V3R7
TRANSLATE
3.2.67 TRANSLATE

+---------------------------------------------------------------------------------------------------------------------------+
¦ ¦
¦ >>--TRANSLATE--(--expresión------------------------------------------------------)------------------------------------->< ¦
¦ +-,a-serie---------------------------------------+ ¦
¦ +-,de-serie------------------------+ ¦
¦ +-,carácter-relleno-+ ¦
¦ ¦
+---------------------------------------------------------------------------------------------------------------------------+

La función TRANSLATE convierte uno o más caracteres del primer argumento.

El primer argumento debe ser una serie de caracteres. No puede ser una
serie gráfica. El tipo de datos y el atributo de longitud del resultado
son los mismos que los del primer argumento.

El segundo argumento es una constante de serie de caracteres que no tiene


más de 256 caracteres. Observe que en algunas ocasiones a esto se le llama
la tabla de conversión de salida. Si el atributo de longitud de a-serie es
menor que el atributo de longitud de de-serie, a-serie se rellena hasta
la longitud más larga utilizando el carácter-relleno o un blanco. Si el
atributo de longitud de a-serie es mayor que el atributo de longitud de
de-serie, los caracteres que sobran en a-serie se ignoran sin ningún
aviso.

El tercer argumento es una constante de serie de caracteres que no tiene


más de 256 caracteres. Observe que en algunas ocasiones a esto se le llama
la tabla de conversión de entrada. Si existen caracteres duplicados en
de-serie, se utiliza el primero que se encuentra por la izquierda mediante
lectura con escáner, y no se emite ningún aviso. El valor por omisión para
de-serie es una serie que empieza con el carácter X'00' y termina con el
carácter X'FF' (decimal 255).

El cuarto argumento es una constante de tipo carácter de longitud 1 que se


utiliza para rellenar a-serie si es más corto que de-serie. El valor por
omisión para el carácter-relleno es un espacio SBCS.

Si sólo se especifica el primer argumento, los caracteres SBCS del


argumento se convierten a mayúsculas, basándose en el CCSID del argumento.
Consulte el manual National Language Support Reference Volume 2,
SE09-8002, si desea una descripción de las tablas de mayúsculas/minúsculas
que se utilizan para realizar esta conversión.

De lo contrario, la serie del resultado se construye carácter por carácter


a partir de expresión, convirtiendo los caracteres de de-serie en los
caracteres correspondientes de a-serie. Para cada uno de los caracteres de
expresión, se busca el mismo carácter en de-serie. Si resulta que el
carácter es el enésimo carácter de de-serie, la serie del resultado
contendrá el enésimo carácter de a-serie. Si a-serie es menor que n
caracteres de longitud, la serie del resultado contendrá el carácter de
relleno. Si no se encuentra el carácter en de-serie, se traslada a la
serie del resultado sin convertir.

Las series de datos mixtos no se tratan de ninguna manera especial. La


conversión se lleva a cabo basándose en los bytes y, si se utiliza de
forma inadecuada, puede dar como resultado una serie mixta no válida.

Si el primer argumento puede ser nulo, el resultado también; si el primer


argumento es nulo, el resultado es el valor nulo.

Subtemas
3.2.67.1 Ejemplos

© Copyright IBM Corp. 1995, 1996


3.2.67 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplos
3.2.67.1 Ejemplos

 Poner en mayúsculas o minúsculas la serie 'abcdef'.

TRANSLATE('abcdef')

Devuelve el valor 'ABCDEF'.

 Poner en mayúsculas o minúsculas la serie de caracteres mixtos.

TRANSLATE( IMAGEN 14)

Devuelve el valor IMAGEN 15

 Suponiendo que la variable del lenguaje principal LOCAL sea una serie
de caracteres de longitud variable con un valor de 'Pivabiska Lake
Place'.

TRANSLATE(:LOCAL, '$', 'L')

Devuelve el valor 'Pivabiska $ake Place'.

TRANSLATE(:LOCAL, '$$', 'Ll')

Devuelve el valor 'Pivabiska $ake P$ace'.

TRANSLATE(:LOCAL, 'pLA', 'Place', '.')

Devuelve el valor 'pivAbiskA LAk. pLA..'.

© Copyright IBM Corp. 1995, 1996


3.2.67.1 - 1
DB2/400 Manual de Consulta SQL V3R7
TRIM
3.2.68 TRIM

+------------------------------------------------------------------------+
¦ ¦
¦ +-BOTH-----+ (1) ¦
¦ >--TRIM--(--+----------+----------------------------FROM-------------> ¦
¦ +-B--------¦ +-carácter-eliminación-+ ¦
¦ +-LEADING--¦ ¦
¦ +-L--------¦ ¦
¦ +-TRAILING-¦ ¦
¦ +-T--------+ ¦
¦ ¦
¦ >--expresión--)------------------------------------------------------> ¦
¦ ¦
¦ Nota: ¦
¦ (1) La palabra clave FROM es opcional si sólo se especifica una ¦
¦ expresión. ¦
¦ ¦
+------------------------------------------------------------------------+

La función TRIM es idéntica a la función escalar STRIP. Para obtener más


información, consulte el apartado "STRIP" en el tema 3.2.61.

© Copyright IBM Corp. 1995, 1996


3.2.68 - 1
DB2/400 Manual de Consulta SQL V3R7
UCASE o UPPER
3.2.69 UCASE o UPPER

+------------------------------------------------------------------------+
¦ ¦
¦ >----UCASE----(--expresión--)----------------------------------------> ¦
¦ +-UPPER-+ ¦
¦ ¦
+------------------------------------------------------------------------+

Las funciones UCASE y UPPER son idénticas a la función escalar TRANSLATE,


únicamente con el primer argumento especificado. Para obtener más
información, consulte el apartado "TRANSLATE" en el tema 3.2.67.

Subtemas
3.2.69.1 Ejemplos

© Copyright IBM Corp. 1995, 1996


3.2.69 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplos
3.2.69.1 Ejemplos

 Poner en mayúsculas la serie 'abcdef' utilizando la función escalar


UCASE.

UCASE('abcdef')

Devuelve el valor 'ABCDEF'.

 Poner en mayúsculas la serie de caracteres mixta utilizando la función


escalar UPPER.

UPPER IMAGEN 16

Devuelve el valor IMAGEN 17

© Copyright IBM Corp. 1995, 1996


3.2.69.1 - 1
DB2/400 Manual de Consulta SQL V3R7
VALUE
3.2.70 VALUE

+------------------------------------------------------------------------+
¦ ¦
¦ <------------+ ¦
¦ >--VALUE--(--expresión----,expresión----)----------------------------> ¦
¦ ¦
+------------------------------------------------------------------------+

La función VALUE es idéntica a la función escalar COALESCE. Para obtener


más información, véase el apartado "COALESCE" en el tema 3.2.10.

© Copyright IBM Corp. 1995, 1996


3.2.70 - 1
DB2/400 Manual de Consulta SQL V3R7
VARCHAR
3.2.71 VARCHAR

+------------------------------------------------------------------------+
¦ ¦
¦ >--VARCHAR--(--expresión--------------------------------------)------> ¦
¦ +-,----longitud------------------+ ¦
¦ +-DEFAULT--+ +-,--entero-+ ¦
¦ ¦
+------------------------------------------------------------------------+

La función VARCHAR devuelve una representación de serie de caracteres de


longitud variable de una expresión de serie.

El primer argumento debe ser una expresión de tipo serie. No deben ser
datos gráficos DBCS.

El segundo argumento, si se especifica como una longitud, es el atributo


de longitud de la serie de longitud variable de resultado. Si el primer
argumento no permite nulos, el segundo argumento debe ser una constante de
entero entre 1 y 32740; si el primer argumento permite nulos, el segundo
argumento debe ser una constante de entero entre 1 y 32739. Si el primer
argumento es de datos mixtos, el segundo argumento no puede ser menor que
4.

Si el segundo argumento no se especifica o se especifica DEFAULT, el


atributo de longitud del resultado se determina de la siguiente forma
(donde n es el atributo de longitud del primer argumento):

 Si el primer argumento es SBCS o de datos mixtos, la longitud de


resultado es n.
 Si el primer argumento es de datos gráficos UCS-2 y el resultado son
datos SBCS, la longitud de resultado es n.
 Si el primer argumento es de datos gráficos UCS-2 y el resultado es de
datos mixtos, la longitud de resultado es (2.5*(n-1)) + 4.

Si se especifica el tercer argumento, debe ser un CCSID SBCS válido, un


CCSID de datos mixtos válido ó 65535 (datos de bit). El CCSID del
resultado es dicho CCSID. Si el tercer argumento es un CCSID SBCS, el
resultado son datos SBCS. Si el tercer argumento es un CCSID mixto, el
resultado son datos mixtos. Si el tercer argumento es 65535, el resultado
son datos de bit. Si el tercer argumento es un CCSID SBCS, el primer
argumento no puede ser una serie DBCS cualquiera o una serie de sólo DBCS.
Si el primer argumento es una serie gráfica UCS-2, el tercer argumento no
puede ser 65535.

Si el tercer argumento no se especifica, entonces:

 Si el primer argumento es de datos SBCS, el resultado son datos SBCS.


El CCSID del resultado es igual que el CCSID del primer argumento.
 Si el primer argumento es de datos mixtos (DBCS abierto, sólo DBCS o
DBCS cualquiera), el resultado son datos mixtos. El CCSID del
resultado es igual que el CCSID del primer argumento.
 Si el primer argumento es de datos gráficos UCS-2, el CCSID del
resultado es el CCSID por omisión del servidor actual. Si el CCSID
por omisión es de datos mixtos, el resultado son datos mixtos. Si el
CCSID por omisión es de datos SBCS, el resultado son datos SBCS.

El resultado de la función es una serie de longitud variable. Si el


primer argumento puede ser nulo, el resultado también; si el primer
argumento es nulo, el resultado es el valor nulo.

La longitud real del resultado depende del número de caracteres del


argumento. Si el atributo de longitud de la serie de longitud variable
del resultado es menor que la longitud real del argumento, se efectúa el
truncamiento y no se devuelve ningún aviso.

Subtemas
3.2.71.1 Ejemplo

© Copyright IBM Corp. 1995, 1996


3.2.71 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplo
3.2.71.1 Ejemplo

Hacer que NUMEMP sea de longitud variable con una longitud de 10.

SELECT VARCHAR(NUMEMP,10) INTO :VARHV FROM EMPLEADO

© Copyright IBM Corp. 1995, 1996


3.2.71.1 - 1
DB2/400 Manual de Consulta SQL V3R7
VARGRAPHIC
3.2.72 VARGRAPHIC

+------------------------------------------------------------------------+
¦ ¦
¦ >--VARGRAPHIC--(--expresión------------------------------------------> ¦
¦ +-,----longitud------------------+ ¦
¦ +-DEFAULT--+ +-,--entero-+ ¦
¦ ¦
¦ >--)-----------------------------------------------------------------> ¦
¦ ¦
+------------------------------------------------------------------------+

La función VARGRAPHIC devuelve una representación de serie gráfica de una


expresión de serie.

El primer argumento debe ser una expresión de serie y no deben ser datos
de bit.

El segundo argumento, si se especifica como longitud, es el atributo de


longitud del resultado, y debe ser una constante de entero entre 1 y 16370
si el primer argumento no permite nulos, o entre 1 y 16369 si permite
nulos.

Si el segundo argumento no se especifica o se especifica DEFAULT, el


atributo de longitud del resultado es el mismo que el del primer
argumento.

En las siguientes reglas, S denota una de las siguientes condiciones:

 Si la expresión de serie es una variable del lenguaje principal que


contiene datos en un esquema de codificación foráneo, S es el
resultado de la expresión después de convertir los datos a un CCSID en
un esquema de codificación nativo. (Consulte el apartado "Conversión
de caracteres" en el tema 1.21 para obtener más información.)

 Si la expresión de serie son datos en un esquema de codificación


nativo, S es dicha expresión de serie.

Si se especifica el tercer argumento, el CCSID del resultado es el tercer


argumento. Debe ser un CCSID DBCS o UCS-2. El CCSID no puede ser 65535.

Si no se especifica el tercer argumento y el primer argumento es de tipo


carácter, el CCSID del resultado se determina mediante un CCSID mixto.
Supongamos que M denota dicho CCSID mixto. M se determina de la siguiente
forma:

 Si el CCSID de S es un CCSID mixto, M es dicho CCSID.

 Si el CCSID de S es un CCSID SBCS:

- Si el CCSID de S tiene un CCSID mixto asociado, M es dicho CCSID.

- De lo contrario la operación no está permitida.

La siguiente tabla es un resumen de los CCSID del resultado basándose en


M.

+------------------------------------------------------------------------+
¦ ¦ ¦ ¦ Carácter de ¦
¦ M ¦ CCSID del ¦ Descripción ¦ sustitución ¦
¦ ¦ resultado ¦ ¦ DBCS ¦
+-------------+--------------+-----------------------------+-------------¦
¦ 930 ¦ 300 ¦ EBCDIC japonés ¦ X'FEFE' ¦
+-------------+--------------+-----------------------------+-------------¦
¦ 933 ¦ 834 ¦ EBCDIC coreano ¦ X'FEFE' ¦
+-------------+--------------+-----------------------------+-------------¦
¦ 935 ¦ 837 ¦ EBCDIC chino simplificado ¦ X'FEFE' ¦
+-------------+--------------+-----------------------------+-------------¦
¦ 937 ¦ 835 ¦ EBCDIC chino tradicional ¦ X'FEFE' ¦
+-------------+--------------+-----------------------------+-------------¦
¦ 939 ¦ 300 ¦ EBCDIC japonés ¦ X'FEFE' ¦
+-------------+--------------+-----------------------------+-------------¦
¦ 5026 ¦ 4396 ¦ EBCDIC japonés ¦ X'FEFE' ¦
+-------------+--------------+-----------------------------+-------------¦
¦ 5035 ¦ 4396 ¦ EBCDIC japonés ¦ X'FEFE' ¦
+------------------------------------------------------------------------+

Si el tercer argumento no se especifica y el primer argumento no es de


tipo carácter, el CCSID del resultado es el mismo que el del primer
argumento.

El resultado de la función es una serie gráfica de longitud variable. Si


la expresión puede ser de nulos, el resultado puede serlo también. Si la
expresión es nula, el resultado es el valor nulo. Si la expresión es una
serie vacía o la serie EBCDIC X'0E0F', el resultado es una serie vacía.

La longitud real del resultado depende del número de caracteres del


argumento. Cada uno de los caracteres del argumento determina un carácter
del resultado. Si el atributo de longitud de la serie de longitud
variable del resultado es menor que la longitud real del primer argumento,
se efectúa el truncamiento y no se devuelve ningún aviso.

Si el resultado es de datos gráficos DBCS, la equivalencia de caracteres


SBCS y DBCS dependerá de M. Independientemente del CCSID, cada uno de los
elementos de código de doble byte del argumento se considera como carácter

© Copyright IBM Corp. 1995, 1996


3.2.72 - 1
DB2/400 Manual de Consulta SQL V3R7
VARGRAPHIC
DBCS, y cada uno de los elementos de código de un solo byte del argumento
se considera como carácter SBCS a excepción de los códigos de
desplazamiento de datos mixtos EBCDIC X'0E' y X'0F'.

 Si el enésimo carácter del argumento es un carácter DBCS, el enésimo


carácter del resultado es dicho carácter DBCS.

 Si el enésimo carácter del argumento es un carácter SBCS que tiene un


carácter DBCS equivalente, el enésimo carácter del resultado es dicho
carácter DBCS equivalente.

 Si el enésimo carácter del argumento es un carácter SBCS que no tiene


un carácter DBCS equivalente, el enésimo carácter del resultado es el
carácter de sustitución DBCS.

Si el resultado es de datos gráficos UCS-2, cada uno de los caracteres del


argumento determinará un carácter del resultado. El enésimo carácter del
resultado es el equivalente UCS-2 del enésimo carácter del argumento.

Subtemas
3.2.72.1 Ejemplo

© Copyright IBM Corp. 1995, 1996


3.2.72 - 2
DB2/400 Manual de Consulta SQL V3R7
Ejemplo
3.2.72.1 Ejemplo

Utilizando la tabla EMPLEADO, establecer la variable del lenguaje


principal VAR_DESC (vargraphic(24)) en la VARGRAPHIC equivalente del
nombre (NOMB) para el número de empleado (NUMEMP) '000050'.

SELECT VARGRAPHIC(NOMB)
INTO :VAR_DESC
FROM EMPLEADO
WHERE NUMEMP = '000050'

© Copyright IBM Corp. 1995, 1996


3.2.72.1 - 1
DB2/400 Manual de Consulta SQL V3R7
WEEK
3.2.73 WEEK

+------------------------------------------------------------------------+
¦ ¦
¦ >--WEEK--(--expresión--)---------------------------------------------> ¦
¦ ¦
+------------------------------------------------------------------------+

La función WEEK devuelve una entero del 1 al 53 que representa la semana


del año. La semana empieza el domingo.

El argumento debe ser una fecha o indicación de la hora.

El resultado de la función es un entero grande. Si el argumento puede ser


nulo, el resultado también; si el argumento es nulo, el resultado es el
valor nulo.

Subtemas
3.2.73.1 Ejemplo

© Copyright IBM Corp. 1995, 1996


3.2.73 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplo
3.2.73.1 Ejemplo

Utilizando la tabla PROYECTO, establecer la variable del lenguaje


principal WEEK (int) en la semana en que finalizó el proyecto ('PL2100').

SELECT WEEK(FCHFINPR)
INTO :WEEK
FROM PROYECTO
WHERE NUMPROY = 'PL2100'

Da como resultado que WEEK quede establecido en 38 cuando se utiliza la


tabla de ejemplo.

© Copyright IBM Corp. 1995, 1996


3.2.73.1 - 1
DB2/400 Manual de Consulta SQL V3R7
XOR
3.2.74 XOR

+------------------------------------------------------------------------+
¦ ¦
¦ <-,---------+ ¦
¦ >--XOR--(--expresión,----expresión----)------------------------------> ¦
¦ ¦
+------------------------------------------------------------------------+

La función XOR devuelve una serie que es el XOR lógico de las series de
argumento. Esta función toma la primera serie de argumento, realiza una
comparación XOR con la siguiente serie y sigue después haciendo
comparaciones XOR para cada argumento sucesivo utilizando el resultado
anterior. Si encuentra un argumento que es más corto que el resultado
anterior, lo rellena con blancos.

Los argumentos deben ser series de caracteres. Los argumentos no pueden


ser series gráficas ni series de caracteres de datos mixtos. Debe haber
dos o más argumentos. Los argumentos que no sean el primero pueden ser
marcadores de parámetros.

Los argumentos se convierten, si es necesario, a los atributos del


resultado. Los atributos del resultado se determinan del siguiente modo:

 Si todos los argumentos son series de longitud fija, el resultado es


una serie de longitud fija de longitud n, donde n es la longitud del
argumento más largo.

 Si algún argumento es una serie de longitud variable, el resultado es


una serie de longitud variable con un atributo de longitud n, donde n
es el atributo de longitud del argumento con el mayor atributo de
longitud. La longitud real del resultado es m, donde m es la longitud
real del argumento más largo.

 El CCSID del resultado es 65535.

Si un argumento puede ser nulo, el resultado también; si un argumento es


nulo, el resultado es el valor nulo.

Subtemas
3.2.74.1 Ejemplo

© Copyright IBM Corp. 1995, 1996


3.2.74 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplo
3.2.74.1 Ejemplo

Supongamos que la variable del lenguaje principal L1 es una variable del


lenguaje principal de tipo character(2) con un valor de X'E1E1,', la
variable del lenguaje principal L2 es una variable del lenguaje principal
de tipo character(3) con un valor de X'F0F000' y la variable del lenguaje
principal L3 es una variable del lenguaje principal de tipo character(4)
con un valor de X'0000000F'.

XOR(:L1,:L2,:L3)

Devuelve el valor X'1111404F'. En este caso, los argumentos más cortos se


rellenan con blancos (X'40'), de manera que el resultado XOR lógico
difiere del primer resultado del ejemplo siguiente

XOR(:L3,:L2,:L1)

Devuelve el valor X'1111400F'.

© Copyright IBM Corp. 1995, 1996


3.2.74.1 - 1
DB2/400 Manual de Consulta SQL V3R7
YEAR
3.2.75 YEAR

+------------------------------------------------------------------------+
¦ ¦
¦ >--YEAR--(--expresión--)---------------------------------------------> ¦
¦ ¦
+------------------------------------------------------------------------+

La función YEAR devuelve la parte de un valor correspondiente al año.

El argumento debe ser una fecha, una indicación de la hora, una duración
de fecha o una duración de indicación de la hora.

El resultado de la función es un entero grande. Si el argumento puede ser


nulo, el resultado también; si el argumento es nulo, el resultado es el
valor nulo.

El resto de las reglas dependen del tipo de datos del argumento:

 Si el argumento es una fecha o una indicación de la hora:

El resultado es la parte del valor correspondiente al año, que es un


entero comprendido entre 1 y 9999.

 Si el argumento es una duración de fecha o duración de indicación de


la hora:

El resultado es la parte del valor correspondiente al año, que es un


entero comprendido entre -9999 y 9999. Un resultado no cero tiene el
mismo signo que el argumento.

Subtemas
3.2.75.1 Ejemplos

© Copyright IBM Corp. 1995, 1996


3.2.75 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplos
3.2.75.1 Ejemplos

 Seleccionar todos los proyectos de la tabla PROYECTO programados para


que empiecen (FCHINIPR) y acaben (FCHAFINP) en el mismo año natural.

SELECT * FROM PROYECTO


WHERE YEAR(FCHINIPR) = YEAR(FCHAFINP)

 Seleccionar todos los proyectos de la tabla PROYECTO programados para


que tarden menos de un año en completarse.

SELECT * FROM PROYECTO


WHERE YEAR(FCHFINPR - FCHAINIP) < 1

© Copyright IBM Corp. 1995, 1996


3.2.75.1 - 1
DB2/400 Manual de Consulta SQL V3R7
ZONED
3.2.76 ZONED

+------------------------------------------------------------------------+
¦ ¦
¦ >--ZONED--(----expresión---------------------------------)-----------> ¦
¦ +-,precisión--------------+ ¦
¦ +-,escala-+ ¦
¦ ¦
+------------------------------------------------------------------------+

La función ZONED devuelve la representación en decimal con zona de un


número.

El primer argumento debe ser un número. El segundo argumento, si se


especifica, debe estar dentro del rango de 1 a 31. El tercer argumento,
si se especifica, debe estar dentro del rango de 0 a p, donde p es el
segundo argumento. La omisión del tercer argumento es una especificación
implícita de cero.

El valor por omisión del segundo argumento depende del tipo de datos del
primer argumento:

 15 para coma flotante, decimal, numérico o binario de escala no cero


 11 para entero grande
 5 para entero pequeño

El resultado de la función es un número decimal con zona con la precisión


p y la escala s, donde p y s son el segundo y tercer argumento,
respectivamente. Si el primer argumento puede ser nulo, el resultado
también; si el primer argumento es nulo, el resultado es el valor nulo.

El resultado es el mismo número que se produciría si se asignase el primer


argumento a una columna decimal con zona (NUMERIC) o a una variable con
una precisión p y una escala s. Se producirá un error si el número de
dígitos decimales significativos precisos para representar la parte entera
del número es mayor que p-s.

Subtemas
3.2.76.1 Ejemplos

© Copyright IBM Corp. 1995, 1996


3.2.76 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplos
3.2.76.1 Ejemplos

 Supongamos que la variable del lenguaje principal Z1 es una variable


del lenguaje principal decimal con un valor de 1,123.

ZONED(:Z1,15,14)

Devuelve el valor 1,12300000000000.

 Supongamos que la variable del lenguaje principal Z1 es una variable


del lenguaje principal decimal con un valor de 1123.

ZONED(:Z1,11,2)

Devuelve el valor 1123,00.

ZONED(:Z1,4)

Devuelve el valor 1123.

© Copyright IBM Corp. 1995, 1996


3.2.76.1 - 1
DB2/400 Manual de Consulta SQL V3R7
Capítulo 4. Consultas
4.0 Capítulo 4. Consultas

Una consulta especifica una tabla de resultados o una tabla de resultados


intermedia.

Una consulta es un componente de ciertas sentencias SQL. Existen tres


formas de consultas:

 La subselección
 La selección completa
 La sentencia-select

En el apartado "SELECT INTO" en el tema 5.44 se describe otra forma de


selección.

Subtemas
4.1 Autorización
4.2 subselección
4.3 selección completa
4.4 sentencia select

© Copyright IBM Corp. 1995, 1996


4.0 - 1
DB2/400 Manual de Consulta SQL V3R7
Autorización
4.1 Autorización

Para todo formato de una consulta, los privilegios que tenga el ID de


autorización de la sentencia deben incluir al menos uno de los siguientes:

 Para cada tabla o vista identificada en la sentencia

- El privilegio SELECT sobre la tabla o vista y

- La autorización de sistema *EXECUTE sobre la biblioteca que


contiene la tabla o la vista

 Autorización administrativa

El ID de autorización de la sentencia tiene el privilegio SELECT sobre una


tabla si:

 Es el propietario de la tabla.
 Se le ha otorgado el privilegio SELECT sobre la tabla o bien
 Se le han otorgado las autorizaciones de sistema *OBJOPR y *READ sobre
la tabla

El ID de autorización de la sentencia tiene el privilegio SELECT sobre una


vista si:

 Es el propietario de la vista,
 Se le ha otorgado el privilegio SELECT sobre la vista o bien
 Se le han otorgado las autorizaciones de sistema *OBJOPR y *READ sobre
la vista y la autorización de sistema *READ sobre todas las tablas y
vistas de las que depende esta vista directa o indirectamente. Es
decir, sobre todas las tablas y vistas a las que se hace referencia en
la definición de la vista, y si se hace referencia a una vista, sobre
todas las tablas y vistas a las que se hace referencia en la
definición de la misma, y así sucesivamente.

© Copyright IBM Corp. 1995, 1996


4.1 - 1
DB2/400 Manual de Consulta SQL V3R7
subselección
4.2 subselección

+------------------------------------------------------------------------+
¦ ¦
¦ >--cláusula-select--cláusula-from------------------------------------> ¦
¦ +-cláusula-where-+ ¦
¦ ¦
¦ >--------------------------------------------------------------------> ¦
¦ +-cláusula-group-by-+ +-cláusula-having-+ ¦
¦ ¦
+------------------------------------------------------------------------+

La subselección es un componente de la selección completa, la sentencia


CREATE VIEW y la sentencia INSERT. También es un componente de ciertos
predicados los cuales, a su vez, son componentes de una subselección. Una
subselección que sea componente de un predicado recibe el nombre de
|subconsulta. Las subconsultas no pueden llevarse a cabo en una tabla
|distribuida. Para obtener más información sobre tablas distribuidas,
|consulte la publicación DB2 Multisystem for OS/400, SC41-3705.

Una subselección especifica una tabla de resultados derivada de las tablas


o vistas identificadas en la cláusula FROM. La derivación puede
describirse como una secuencia de operaciones en las que el resultado de
cada una de ellas es la entrada de la siguiente (ésta es tan sólo una
forma de describir las subselecciones. El método utilizado para realizar
la derivación puede ser bastante diferente de esta descripción).

La secuencia de las operaciones (hipotéticas) es:

1. cláusula FROM
2. cláusula WHERE
3. cláusula GROUP BY
4. cláusula HAVING
5. cláusula SELECT

Subtemas
4.2.1 cláusula select
4.2.2 cláusula from
4.2.3 cláusula where
4.2.4 cláusula group-by
4.2.5 cláusula having
4.2.6 Ejemplos de una subselección

© Copyright IBM Corp. 1995, 1996


4.2 - 1
DB2/400 Manual de Consulta SQL V3R7
cláusula select
4.2.1 cláusula select

+------------------------------------------------------------------------+
¦ ¦
¦ +-ALL------+ ¦
¦ >--SELECT--+----------+----------------------------------------------> ¦
¦ +-DISTINCT-+ ¦
¦ ¦
¦ >----*---------------------------------------------------------------> ¦
¦ ¦ <-,-----------------------------------+ ¦ ¦
¦ +----expresión----------------------------+ ¦
¦ ¦ ¦ +-AS-+ ¦ ¦ ¦
¦ ¦ +---------nombre-col-+ ¦ ¦
¦ +-nombre-tabla.*--------------------¦ ¦
¦ +-nombre-vista.*--------------------¦ ¦
¦ +-nombre-correlación.*--------------+ ¦
¦ ¦
+------------------------------------------------------------------------+

La cláusula SELECT especifica las columnas de la tabla de resultados


finales. Los valores de columna se generan por la aplicación de la lista
de selección a R. La lista de selección la conforman los nombres o
expresiones especificadas en la cláusula SELECT y R es el resultado de la
operación anterior de la subselección. Si, por ejemplo, las únicas
cláusulas especificadas son SELECT, FROM y WHERE, R es el resultado de la
cláusula WHERE.

ALL
Selecciona todas las filas de la tabla de resultados finales y no
elimina los duplicados. Este es el valor por omisión.

DISTINCT
Elimina todos los conjuntos de filas duplicadas de la tabla de
resultados finales menos uno.

Se dice que dos filas son un duplicado de la otra si cada valor de la


primera es idéntico al valor correspondiente de la segunda (a efectos
de la determinación de filas duplicadas, se considera que dos valores
nulos son iguales).

Notación de la lista de selección

*
Representa una lista de nombres que identifica las columnas de la
tabla R. El primer nombre de la lista identifica la primera columna
de R, el segundo la segunda y así sucesivamente.

La lista de nombres se establece cuando se prepara la sentencia que


contiene la cláusula SELECT. De ahí que * no identifique ninguna
columna que se haya añadido a una tabla una vez preparada la
sentencia.

expresión
Especifica los valores de una columna de resultados. Cada
nombre-columna de la expresión debe identificar de forma no ambigua
una columna de R.

nombre-columna o AS nombre-columna
Da nombre, o se lo cambia, a la columna de resultados. El nombre no
deber estar calificado y no tiene que ser exclusivo.

nombre.*
Representa una lista de nombres que identifica las columnas de nombre.
El nombre puede ser un nombre de tabla, un nombre de vista o un nombre
de correlación y debe designar a una tabla o vista mencionada en la
cláusula FROM. El primer nombre de la lista identifica la primera
columna de la tabla o vista, el segundo nombre la segunda columna, y
así sucesivamente.

La lista de nombres se establece cuando se prepara la sentencia que


contiene la cláusula SELECT. De ahí que * no identifique ninguna
columna que se haya añadido a una tabla una vez preparada la
sentencia.

Normalmente, cuando las sentencias SQL se vuelven a enlazar


implícitamente, la lista de nombres no se restablece. Por lo tanto, el
número de columnas devuelto por la sentencia no cambia. Sin embargo,
existen cuatro casos en los que la lista de nombres se establece de nuevo
y el número de columnas puede cambiar:

 Cuando un programa SQL o un paquete SQL se salva y a continuación se


restaura en un sistema AS/400 cuyo release es diferente al del sistema
desde el cual se ha salvado.

 Cuando se especifica la denominación SQL para un programa o paquete


SQL y el propietario del programa ha cambiado desde que se creó el
programa o paquete SQL.

 Cuando una sentencia SQL se ejecuta por primera vez después de la


instalación de un release más reciente de OS/400.

 Cuando aparece la sentencia SELECT * en la subselección de una


sentencia INSERT o en una subselección dentro de un predicado, y se ha
eliminado y vuelto a crear con columnas adicionales una tabla o vista

© Copyright IBM Corp. 1995, 1996


4.2.1 - 1
DB2/400 Manual de Consulta SQL V3R7
cláusula select
a las que se hace referencia en la subselección.

El número de columnas del resultado de SELECT es el mismo que el número de


expresiones del formato operativo de la lista de selección (es decir, la
lista queda establecida en el tiempo de preparación) y no puede sobrepasar
las 8000). El resultado de una subconsulta debe ser una sola expresión, a
menos que la subconsulta se utilice en el predicado EXISTS.

Aplicación de la lista de selección: Algunos de los resultados de aplicar


la lista de selección a R dependen de si se utiliza o no GROUP BY o
HAVING. Estos resultados se describen aparte.

Si se utiliza GROUP BY o HAVING:

 Cada nombre-columna de la lista de selección debe identificar una


columna de agrupación o debe especificarse en una función de columna.

| Las funciones RRN, PARTITION, NODENAME y NODENUMBER no pueden


| especificarse en la lista de selección.

 La lista de selección se aplica a cada grupo de R y el resultado


contiene tantas filas como grupos hay en R. Cuando la lista de
selección se aplica a un grupo de R, ese grupo es el origen de los
argumentos de las funciones de columna existentes en la lista de
selección.

Si no se utiliza GROUP BY ni HAVING:

 La lista de selección no debe incluir ninguna función de columna o


bien debe ser por entero una lista de funciones de columna.

 Si la lista de selección no incluye funciones de columna, se aplica a


cada fila de R y el resultado contiene tantas filas como filas hay en
R.

 Si la lista de selección es una lista de funciones de columna, R es el


origen de los argumentos de las funciones y el resultado de aplicar la
lista de selección a una fila.

En ambos casos, la enésima columna del resultado contiene los valores


especificados al aplicar la enésima expresión con el formato operativo de
la lista de selección.

Atributos nulos de las columnas de resultados: Las columnas de resultados


permiten los valores nulos si derivan de:

 Cualquier función de columna excepto COUNT


 Cualquier columna que permita valores nulos
 Una función escalar o una expresión con un operando que permita
valores nulos.
 Una variable del lenguaje principal que tenga una variable de
indicador.
 El resultado de una UNION si al menos uno de los elementos
correspondientes de la lista de selección puede convertirse en nulo
 Una expresión aritmética

Nombres de columnas de resultados

 Si se especifica la cláusula AS, el nombre de la columna de resultados


es el nombre de la cláusula AS.

 Si no se especifica la cláusula AS y la columna de resultados deriva


de una columna, el nombre de columna de resultados es el nombre no
calificado de esa columna.

 Todas las demás columnas de resultados no tienen nombre.

Tipos de datos de las columnas de resultados: Cada columna del resultado


de SELECT adquiere el tipo de datos de la expresión de la que deriva.

+------------------------------------------------------------------------+
¦ Cuando la ¦ El tipo de datos de ¦
¦ expresión es: ¦ la columna de resultados es: ¦
+-----------------+------------------------------------------------------¦
¦ El nombre de ¦ El mismo que el tipo de datos de la columna, con la ¦
¦ cualquier ¦ misma precisión y escala para las columnas ¦
¦ columna ¦ decimales. ¦
¦ numérica ¦ ¦
+-----------------+------------------------------------------------------¦
¦ Una constante ¦ INTEGER. ¦
¦ de entero ¦ ¦
+-----------------+------------------------------------------------------¦
¦ Una constante ¦ El mismo que el tipo de datos de la constante, con ¦
¦ decimal o de ¦ la misma precisión y escala para las constantes ¦
¦ coma flotante ¦ decimales. ¦
+-----------------+------------------------------------------------------¦
¦ El nombre de ¦ El mismo que el tipo de datos de la variable, con la ¦
¦ cualquier ¦ misma precisión y escala para las variables ¦

© Copyright IBM Corp. 1995, 1996


4.2.1 - 2
DB2/400 Manual de Consulta SQL V3R7
cláusula select
¦ variable ¦ decimales. Si el tipo de datos de la variable es ¦
¦ numérica del ¦ distinto de un tipo de datos SQL (por ejemplo, ¦
¦ lenguaje ¦ DISPLAY SIGN LEADING SEPARATE en COBOL), la columna ¦
¦ principal ¦ de resultados es decimal. ¦
+-----------------+------------------------------------------------------¦
¦ Una expresión ¦ Igual que el tipo de datos del resultado, con la ¦
¦ aritmética ¦ misma precisión y escala para los resultados ¦
¦ ¦ decimales según los descrito en el apartado ¦
¦ ¦ "Expresiones" en el tema 2.14. ¦
+-----------------+------------------------------------------------------¦
¦ Cualquier ¦ Véase el Capítulo 3 para determinar el tipo de datos ¦
¦ función ¦ del resultado. ¦
+-----------------+------------------------------------------------------¦
¦ El nombre de ¦ El mismo que el tipo de datos de la columna, con el ¦
¦ cualquier ¦ mismo atributo de longitud. ¦
¦ columna de ¦ ¦
¦ serie ¦ ¦
+-----------------+------------------------------------------------------¦
¦ El nombre de ¦ El mismo que el tipo de datos de la variable, con un ¦
¦ cualquier ¦ atributo de longitud igual a la longitud de la ¦
¦ variable del ¦ variable. Si el tipo de datos de la variable es ¦
¦ lenguaje ¦ distinto de un tipo de datos SQL (por ejemplo, una ¦
¦ principal de ¦ serie de C terminada en NUL), la columna de ¦
¦ serie. ¦ resultados es una serie de longitud variable. ¦
+-----------------+------------------------------------------------------¦
¦ Una constante ¦ VARCHAR( n) ¦
¦ de serie de ¦ ¦
¦ caracteres de ¦ ¦
¦ longitud n ¦ ¦
+-----------------+------------------------------------------------------¦
¦ Una constante ¦ VARGRAPHIC(n) ¦
¦ de serie ¦ ¦
¦ gráfica de ¦ ¦
¦ longitud n ¦ ¦
+-----------------+------------------------------------------------------¦
¦ El nombre de ¦ El mismo que el tipo de datos de la columna o ¦
¦ una columna de ¦ variable del lenguaje principal. ¦
¦ fecha y hora o ¦ ¦
¦ una variable ¦ ¦
¦ del lenguaje ¦ ¦
¦ principal de ¦ ¦
¦ fecha y hora ¦ ¦
¦ ILE RPG/400 ¦ ¦
+------------------------------------------------------------------------+

© Copyright IBM Corp. 1995, 1996


4.2.1 - 3
DB2/400 Manual de Consulta SQL V3R7
cláusula from
4.2.2 cláusula from

+---------------------------------------------------------------------------------------------------------------------------+
¦ ¦
¦ ¦
¦ ¦
¦ <-,---------+ ¦
¦ >--FROM----ref-tabla----------------------------------------------------------------------------------------------------> ¦
¦ ¦
¦ ref-tabla: ¦
¦ +----tabla-única--------------------------------------------------------------------------------------------------------¦ ¦
¦ +-tabla-unión-+ ¦
¦ ¦
¦ tabla-única: ¦
¦ +----nombre-tabla-------------------------------------------------------------------------------------------------------¦ ¦
¦ +-nombre-vista-+ ¦ +-AS-+ ¦ ¦
¦ +---------nombre-correlación-+ ¦
¦ ¦
¦ tabla-unión: ¦
¦ +-INNER-----------+ ¦
¦ +----ref-tabla----+-----------------+--JOIN--tabla-única--ON--condición-unión-------------------------------------------¦ ¦
¦ ¦ ¦ ¦ +-OUTER-+ ¦ ¦ ¦ ¦
¦ ¦ ¦ +-LEFT------------¦ ¦ ¦ ¦
¦ ¦ ¦ +-EXCEPTION-------+ ¦ ¦ ¦
¦ ¦ +-CROSS JOIN--tabla-única-------------------------------------+ ¦ ¦
|¦ +-(--tabla-unión--)----------------------------------------------------------+ ¦
¦ ¦
¦ condición-unión: ¦
¦ <-AND------------------------------+ ¦
¦ +------expresión----=-----expresión-------------------------------------------------------------------------------------¦ ¦
¦ ¦ +-¬=-¦ ¦ ¦
¦ ¦ +-<>-¦ ¦ ¦
¦ ¦ +->--¦ ¦ ¦
¦ ¦ +->=-¦ ¦ ¦
¦ ¦ +-<--¦ ¦ ¦
¦ ¦ +-<=-¦ ¦ ¦
¦ ¦ +-¬<-¦ ¦ ¦
¦ ¦ +-¬>-+ ¦ ¦
¦ +-(--condición-unión--)--------+ ¦
¦ ¦
¦ ¦
+---------------------------------------------------------------------------------------------------------------------------+
La cláusula FROM especifica una tabla de resultados intermedios. Si sólo
se especifica una tabla o vista, la tabla de resultados intermedia es
simplemente dicha tabla o vista. Si se especifica más de una tabla o vista
en la cláusula FROM sin ser una tabla de unión, la tabla de resultados
intermedia constará de todas las combinaciones posibles de las filas de la
tabla o vista que se ha especificado, concatenada con una fila de la
segunda tabla o vista, concatenada a su vez con una fila de la tercera, y
así sucesivamente. El número de filas del resultado es el producto del
número de filas de todas las tablas o vistas mencionadas.

La lista de nombres de la cláusula FROM debe ajustarse a las reglas


siguientes:

 Cada nombre-tabla y nombre-vista debe denominar una tabla o vista


| existente en el servidor actual. Si se especifica la cláusula FROM en
| una subconsulta, la tabla o vista no pueden identificar una tabla
| distribuida.

 Los nombres expuestos deben ser exclusivos. Un nombre expuesto es un


nombre-correlación, un nombre-tabla que no vaya seguido de un
nombre-correlación, o un nombre-vista que no vaya seguido de un
nombre-correlación.

Cada nombre-correlación está definido como designador de la tabla o vista


identificada mediante el nombre-tabla o nombre-vista que le precede de
forma inmediata. Si se especifica un nombre de correlación para un nombre
de tabla o de vista, cualquier referencia a una columna de tal tabla o
vista en la subselección debe utilizar ese nombre de correlación. Para
saber cuáles son las reglas que rigen la utilización de los nombres de
correlación, véase el apartado "Nombres de correlación" en el tema 2.10.2.

|tabla-unión
Especifica la forma en que se van a unir dos tablas de forma explícita
para producir la tabla de resultados intermedia. La tabla de
resultados consta sólo de las filas que satisfacen la condición-unión,
basándose en el tipo de unión que se especifica para cada par de
tablas que se unen. La tabla situada a la izquierda de la palabra
| clave JOIN puede ser una tabla-única, otra tabla-unión, o cualquier
combinación de tablas únicas y de unión separadas por comas. La
condición-unión puede hacer referencia a columnas de cualquiera de
estas tablas precedentes.

JOIN o INNER JOIN


Especifica que cada fila de la tabla situada a la izquierda se unirá a
una o más filas de la tabla situada a la derecha utilizando la
condición-unión. Todas las filas de la tabla situada a la izquierda
que no tengan una fila correspondiente en la tabla situada a la
derecha no se incluirán en la tabla de resultados.

LEFT JOIN o LEFT OUTER JOIN


Especifica que cada fila de la tabla situada a la izquierda se unirá a
una o más filas de la tabla situada a la derecha utilizando la
condición-unión. Todas las filas de la tabla situada a la izquierda
que no tengan una fila correspondiente en la tabla situada a la
derecha devolverán el valor nulo para cada columna de la tabla de la

© Copyright IBM Corp. 1995, 1996


4.2.2 - 1
DB2/400 Manual de Consulta SQL V3R7
cláusula from
derecha.

EXCEPTION JOIN
Especifica que sólo se devolverán las filas de la tabla de la
izquierda que no tengan filas correspondientes en la tabla de la
derecha utilizando la condición-unión. Se devolverá el valor nulo
para todas las columnas de todas las filas de la tabla situada a la
derecha.

CROSS JOIN
Especifica que la tabla de resultados contendrá una fila para cada una
de las filas de la tabla situada a la izquierda concatenada con cada
una de las filas de la tabla de la derecha.

ON condición-unión
Especifica la condición que se aplica a cada combinación de filas de
las dos tablas que se unen al determinar las filas que se van a añadir
a la tabla de resultados intermedia.

Si se especifica más de un predicado para LEFT OUTER JOIN o EXCEPTION


JOIN, todas las comparaciones de la condición-unión deben ser la
condición =.

| Una expresión de cada predicado debe utilizar una columna de la tabla


| especificada a la derecha de la palabra clave JOIN. La otra expresión
| puede utilizar columnas de cualquiera de las tablas especificadas en
| la cláusula from antes de la palabra clave JOIN o puede no contener
| ninguna columna. Cada nombre de columna debe identificar de forma no
ambigua una columna de una de las tablas de la cláusula from. Las
funciones de columna no pueden utilizarse en la expresión.

Subtemas
4.2.2.1 Notas

© Copyright IBM Corp. 1995, 1996


4.2.2 - 2
DB2/400 Manual de Consulta SQL V3R7
Notas
4.2.2.1 Notas

La utilización de la sintaxis INNER JOIN con una condición-unión producirá


el mismo resultado que especificar la unión listando dos tablas en la
cláusula FROM separadas mediante comas y utilizando la cláusula-where para
proporcionar la condición.

Cuando se utiliza la sintaxis JOIN, las tablas siempre se unirán de


izquierda a derecha. No se pueden utilizar paréntesis para cambiar el
orden de la unión.

© Copyright IBM Corp. 1995, 1996


4.2.2.1 - 1
DB2/400 Manual de Consulta SQL V3R7
cláusula where
4.2.3 cláusula where

+------------------------------------------------------------------------+
¦ ¦
¦ >--WHERE--condición-búsqueda-----------------------------------------> ¦
¦ ¦
+------------------------------------------------------------------------+

La cláusula WHERE especifica una tabla de resultados intermedios que


consta de aquellas filas de R para las que la condición-búsqueda es
verdadera. R es el resultado de la cláusula FROM de la sentencia.

La condición-búsqueda debe ajustarse a las siguientes reglas:

 Cada nombre-columna debe identificar de forma no ambigua a una columna


de R o ser una referencia correlacionada. Un nombre-columna es una
referencia correlacionada si identifica una columna de una tabla o
vista identificada en una subconsulta exterior.

 No puede especificarse una función de columna a menos que se


especifique la cláusula WHERE en una subconsulta de una cláusula
HAVING y el argumento de la función sea una referencia correlacionada
a un grupo.

Si está en vigor una secuencia de clasificación distinta de *HEX al


ejecutar la sentencia que contiene la cláusula WHERE y si la
condición-búsqueda contiene predicados que tengan datos SBCS o mixtos, la
comparación de dichos predicados se realiza utilizando los valores
significativos. Los valores significativos derivan de aplicar la
secuencia de clasificación a los operandos del predicado.

Toda subconsulta de la condición-búsqueda se ejecuta de forma efectiva


para cada fila de R y los resultados se utilizan en la aplicación de la
condición-búsqueda a la fila de R en cuestión. En realidad, la
subconsulta se ejecuta para cada fila de R sólo si incluye una referencia
correlacionada a una columna de R. De hecho, las subconsultas sin ninguna
referencia correlacionada se ejecutan una vez tan solo, mientras que las
que tienen una referencia correlacionada puede hayan de ejecutarse una vez
para cada fila.

© Copyright IBM Corp. 1995, 1996


4.2.3 - 1
DB2/400 Manual de Consulta SQL V3R7
cláusula group-by
4.2.4 cláusula group-by

+------------------------------------------------------------------------+
¦ ¦
¦ <-,----------+ ¦
¦ >--GROUP BY----nombre-col--------------------------------------------> ¦
¦ ¦
+------------------------------------------------------------------------+

La cláusula GROUP BY especifica una tabla de resultados intermedios que


consta de una agrupación de las filas de R. R es el resultado de la
cláusula anterior de la subselección.

nombre-columna indica una columna de R. El nombre-columna no debe


especificar una columna con un atributo de longitud mayor que 2000 ó 1999
si la columna permite nulos. Cada columna mencionada recibe el nombre de
columna de agrupación.

El resultado de GROUP BY es un conjunto de grupos de filas. En cada grupo


de más de una fila, todos los valores de cada columna de agrupación son
idénticos y todas las filas con el mismo conjunto de valores de las
columnas de agrupación están en el mismo grupo. A efectos de agrupación,
todos los valores nulos con una columna de agrupación se consideran
iguales.

Si está en vigor una secuencia de clasificación distinta de *HEX al


ejecutar la sentencia que contiene la cláusula GROUP BY, las columna se
colocan en grupos utilizando los valores significativos. Estos se derivan
aplicando la secuencia de clasificación a las columnas de datos SBCS y a
los datos SBCS de las columnas de datos mixtos.

Dado que cada fila de un grupo contiene el mismo valor de cualquier


columna de agrupación, el nombre de una columna de agrupación puede
utilizarse en una condición de búsqueda, en una cláusula HAVING o en una
expresión de una cláusula SELECT; en cada caso, la referencia especificará
sólo un valor para cada grupo.

Si la columna de agrupación contiene series de longitud variable con


blancos finales, los valores del grupo pueden diferir en el número de
blancos finales y podrían no tener la misma longitud. En ese caso, las
referencias a la columna de agrupación continuarán especificando sólo un
valor para cada grupo, pero el valor para un grupo se elegirá
arbitrariamente del conjunto de valores disponibles. Así pues, no se
puede predecir cuál será la longitud real del valor resultante.

La cláusula GROUP BY puede contener hasta 120 columnas o 2000-n bytes,


donde n es el número de columnas especificadas que permiten valores nulos.

© Copyright IBM Corp. 1995, 1996


4.2.4 - 1
DB2/400 Manual de Consulta SQL V3R7
cláusula having
4.2.5 cláusula having

+------------------------------------------------------------------------+
¦ ¦
¦ >--HAVING--condición-búsqueda----------------------------------------> ¦
¦ ¦
+------------------------------------------------------------------------+

La cláusula HAVING especifica una tabla de resultados intermedios que


consta de aquellos grupos de R para los que la condición-búsqueda es
verdadera. R es el resultado de la cláusula anterior de la subselección.
Si esta cláusula no es GROUP BY, R se considera un solo grupo sin ninguna
columna de agrupación.

Cada nombre-columna de la condición de búsqueda debe cumplir una de las


condiciones siguientes:

 Identificar de forma no ambigua a una columna de agrupación de R.

 Estar especificado en una función de columna.

 Ser una referencia correlacionada. Un nombre-columna es una


referencia correlacionada si identifica una columna de una tabla o
vista identificada en una subconsulta exterior.

|Las funciones RRN, PARTITION, NODENAME y NODENUMBER no pueden


|especificarse en la cláusula HAVING a menos que sea en una función de
|columna. Consulte el Capítulo 3, "Funciones", para saber cuáles son las
restricciones que se aplican a la utilización de funciones de columnas.

Si está en vigor una secuencia de clasificación distinta de *HEX al


ejecutar la sentencia que contiene la cláusula HAVING y si la
condición-búsqueda contiene predicados que tengan datos SBCS o mixtos, la
comparación de dichos predicados se realiza utilizando los valores
significativos. Los valores significativos derivan de aplicar la
secuencia de clasificación a los operandos del predicado.

Un grupo de R al que se le aplique la condición de búsqueda proporciona el


argumento de cada función de columna de la condición de búsqueda,
exceptuando las funciones cuyo argumento sea una referencia
correlacionada.

Si la condición de búsqueda contiene una subconsulta, puede considerarse


que ésta se ejecuta cada vez que la condición de búsqueda se aplica a una
fila y los resultados se utilizan al aplicar la condición de búsqueda. En
realidad, la subconsulta se ejecuta para todos los grupos sólo si contiene
una referencia correlacionada. Los ejemplos 6 y 7 del apartado "Ejemplos
de una subselección" en el tema 4.2.6 son una ilustración de las
diferencias.

Toda referencia correlacionada con un grupo de R debe identificar a una


columna de agrupación o estar dentro de una función de columna.

Cuando se utiliza HAVING sin GROUP BY, cualquier nombre de columna de la


lista de selección deberá aparecer en una función de columna.

© Copyright IBM Corp. 1995, 1996


4.2.5 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplos de una subselección
4.2.6 Ejemplos de una subselección

Ejemplo 1: Seleccionar todas las columnas y filas de la tabla EMPLEADO.

SELECT * FROM EMPLEADO

Ejemplo 2: Unir las tablas ACT_EMP. y EMPLEADO, seleccionar todas las


columnas de la tabla ACT_EMP y añadir el apellido del empleado (APELL) de
la tabla EMPLEADO a cada fila del resultado.

SELECT ACT_EMP.*, APELL


FROM ACT_EMP, EMPLEADO
WHERE ACT_EMP.NUMEMP = EMPLEADO.NUMEMP

Ejemplo 3: Unir las tablas EMPLEADO y DEPART, seleccionar el número de


empleado (NUMEMP), el apellido (APELLLIDO), el número de departamento
(DEPTTRAB de la tabla EMPLEADO y NUMDEPT de la tabla DEPART) y el nombre
del departamento (NOMBDEPT) de todos los empleados nacidos (FCHANACIM)
antes de 1930.

SELECT NUMEMP, APELL, DEPTTRAB, NOMBDEPT


FROM EMPLEADO, DEPART
WHERE DEPTTRAB = NUMDEPT
AND YEAR(FCHANACIM) < 1930

Esta subselección también puede escribirse de la siguiente manera:

SELECT NUMEMP, APELL, DEPTTRAB, NOMBDEPT


FROM EMPLEADO INNER JOIN DEPART
ON DEPTTRAB = NUMDEPT
WHERE AÑO(FCHANACIM) < 1930

Ejemplo 4: Seleccionar el trabajo (TRAB) y el sueldo máximo y mínimo


(SUELDO) de cada grupo de filas con el mismo código de trabajo en la tabla
EMPLEADO, pero sólo para los grupos con más de una fila y con un sueldo
máximo mayor o igual que 27000.

SELECT TRAB, MIN(SUELDO), MAX(SUELDO)


FROM EMPLEADO
GROUP BY TRAB
HAVING COUNT(*) > 1 AND MAX(SUELDO) >= 27000

Ejemplo 5: Seleccionar todas las filas de la tabla ACT_EMP


correspondientes a los empleados (NUMEMP) del departamento (DEPTTRAB)
'E11' (los números de departamento de los empleados se muestran en la
tabla EMPLEADO).

SELECT * FROM ACT_EMP


WHERE NUMEMP IN (SELECT NUMEMP FROM EMPLEADO
WHERE DEPTTRAB = 'E11')

Ejemplo 6: De la tabla EMPLEADO, seleccionar el número de departamento


(DEPTTRAB) y sueldo máximo del departamento (SUELDO) de todos los
departamentos cuyo sueldo máximo sea inferior al sueldo medio de todos los
empleados.

SELECT DEPTTRAB, MAX(SUELDO)


FROM EMPLEADO
GROUP BY DEPTTRAB
HAVING MAX(SUELDO) < (SELECT AVG(SUELDO)
FROM EMPLEADO)

La subconsulta de la cláusula HAVING sólo se ejecutaría una vez en este


ejemplo.

Ejemplo 7: Utilizando la tabla EMPLEADO, seleccionar el número de


departamento (DEPTTRAB) y el sueldo (SUELDO) máximo departamental de todos
los departamentos cuyo sueldo máximo sea inferior al sueldo medio del
resto de los departamentos.

SELECT DEPTTRAB, MAX(SUELDO)


FROM EMPLEADO COR_EMP
GROUP BY DEPTTRAB
HAVING MAX(SUELDO) < (SELECT AVG(SUELDO)
FROM EMPLEADO
WHERE NOT DEPTTRAB = COR_EMP.DEPTTRAB)

A diferencia del ejemplo 6, la subconsulta de la cláusula HAVING tendría


que ejecutarse para cada grupo.

Ejemplo 8: Unir las tablas EMPLEADO y ACT_EMP, seleccionar todos los


empleados y sus números de proyecto. Devolver incluso los empleados que
no tienen un número de proyecto asignado actualmente.

SELECT EMPLEADO.NUMEMP, NUMPRO


FROM EMPLEADO LEFT OUTER JOIN ACT_EMP
ON EMPLEADO.NUMEMP = ACT_EMP.NUMEMP

Todos los empleados de la tabla EMPLEADO que no tengan un número de


proyecto en la tabla ACT_EMP devolverán una fila en la tabla de resultados
que contendrá el valor NUMEMP y el valor nulo en la columna NUMPRO.

© Copyright IBM Corp. 1995, 1996


4.2.6 - 1
DB2/400 Manual de Consulta SQL V3R7
selección completa
4.3 selección completa

+------------------------------------------------------------------------+
¦ ¦
¦ >----subselección----------------------------------------------------> ¦
¦ +-(selección completa)-+ ¦
¦ ¦
¦ <-------------------------------------------+ ¦
¦ >--------------------------------------------------------------------> ¦
¦ +---UNION----------subselección-----------+ ¦
¦ +-UNION ALL-+ +-(selección completa)-+ ¦
¦ ¦
+------------------------------------------------------------------------+

Una selección completa especifica una tabla de resultados. Si no se


utiliza UNION, el resultado de la selección completa es el resultado de la
subselección especificada.

UNION o UNION ALL


Deriva una tabla de resultados combinando otras dos (R1 y R2). Si se
especifica UNION ALL, el resultado consta de todas las filas R1 y R2.
Si se especifica UNION sin la opción ALL, el resultado es el conjunto
de todas las filas de R1 o R2 sin las filas duplicadas, que se han
eliminado. En cualquiera de los dos casos, sin embargo, cada fila de
la tabla UNION es una fila perteneciente a R1 o a R2.

Si la enésima columna de R1 y la enésima columna de R2 tienen el mismo


nombre de columna de resultados, la enésima columna de la tabla de
resultados tendrá ese nombre de columna. Si la enésima columna de R1 y la
enésima columna de R2 no tienen el mismo nombre, la enésima columna de la
tabla de resultados no tendrá nombre.

Se dice que dos filas son duplicados si cada valor de la primera es


idéntico al valor correspondiente de la segunda. Si está en vigor una
secuencia de clasificación distinta de *HEX al ejecutar la sentencia que
contiene la palabra clave UNION y si las tablas de resultados contienen
columnas que tengan datos SBCS o mixtos, la comparación de dichas columnas
se realiza utilizando los valores significativos. Los valores
significativos derivan de aplicar la secuencia de clasificación a cada
valor (a efectos de la determinación de duplicados, se considera que dos
valores nulos son iguales).

Tanto UNION como UNION ALL son operaciones asociativas. No obstante, al


incluir en la misma sentencia SQL tanto el operador UNION ALL como el
operador UNION, el resultado de la operación dependerá del orden de
evaluación. Allí donde no hay paréntesis, la evaluación se realiza de
izquierda a derecha. Allí donde se incluyan paréntesis, la subselección
con paréntesis se evalúa primera, seguida, de izquierda a derecha, de los
demás componentes de la sentencia.

Reglas para las columnas: R1 y R2 deben tener el mismo número de columnas


y el tipo de datos de la columna enésima de R1 debe ser compatible con el
tipo de datos de la columna enésima de R2. Los valores de serie de
caracteres no son compatibles con los valores de fecha y hora.

La columna enésima del resultado de UNION y UNION ALL deriva de las


columnas enésimas de R1 y R2. Los atributos de las columnas de resultados
se determinan utilizando las reglas para las columnas de resultados. Para
obtener más información, consulte el apartado "Reglas para tipos de datos
de resultado"

Subtemas
4.3.1 Ejemplos de una selección completa
4.3.2 Reglas para tipos de datos de resultado
4.3.3 Reglas de conversión para operaciones que combinan series

© Copyright IBM Corp. 1995, 1996


4.3 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplos de una selección completa
4.3.1 Ejemplos de una selección completa

Ejemplo 1: Seleccionar todas las columnas y filas de la tabla EMPLEADO.

SELECT * FROM EMPLEADO

Ejemplo 2: Listar los números de empleado (NUMEMP) de todos los empleados


de la tabla EMPLEADO cuyo número de departamento (DEPTTRAB) empiece por
'E' o que estén asignados a proyectos de la tabla ACT_EMP cuyo número de
proyecto (NUMPRO) sea igual a 'MA2100', 'MA2110' o 'MA2112'.

SELECT NUMEMP FROM EMPLEADO


WHERE DEPTTRAB LIKE 'E%'
UNION
SELECT NUMEMP FROM ACT_EMP
WHERE NUMPRO IN('MA2100', 'MA2110', 'MA2112')

Ejemplo 3: Realizar la misma consulta que en el ejemplo 2, pero


utilizando UNION ALL para que así se no se elimine ninguna fila duplicada.

SELECT NUMEMP FROM EMPLEADO


WHERE DEPTTRAB LIKE 'E%'
UNION ALL
SELECT NUMEMP FROM ACT_EMP
WHERE NUMPRO IN('MA2100', 'MA2110', 'MA2112')

© Copyright IBM Corp. 1995, 1996


4.3.1 - 1
DB2/400 Manual de Consulta SQL V3R7
Reglas para tipos de datos de resultado
4.3.2 Reglas para tipos de datos de resultado

La función escalar COALESCE (y las funciones escalares VALUE e IFNULL),


una selección completa y la lista IN del predicado IN combinan dos o más
operandos para producir un tipo de datos de resultado. El tipo de datos
del resultado viene determinado por el tipo de datos de los operandos.
Los tipos de datos de los dos primeros operandos determinan un tipo de
datos de resultado intermedio, este tipo de datos y el del siguiente
operando determinan un nuevo tipo de datos de resultado intermedio, y así
sucesivamente. El último tipo de datos de resultado intermedio y el tipo
de datos del último operando determinan el tipo de datos del resultado.
Para cada par de tipos de datos, el tipo de datos del resultado viene
determinado por la aplicación secuencial de las reglas que se resumen en
la siguiente tabla:

+------------------------------------------------------------------------+
¦ Si una columna ¦ Y el otro ¦ El tipo de datos de ¦
¦ de operando ¦ operando es... ¦ la columna de resultados es... ¦
¦ es... ¦ ¦ ¦
+-----------------+------------------+-----------------------------------¦
¦ CHAR(x) ¦ CHAR(y) ¦ CHAR(z) donde z = max(x,y) ¦
+-----------------+------------------+-----------------------------------¦
¦ VARCHAR(x) ¦ CHAR(y) o ¦ VARCHAR(z) donde ¦
¦ ¦ VARCHAR(y) ¦ z = max(x,y) ¦
+-----------------+------------------+-----------------------------------¦
¦ datos de bit ¦ datos mixtos, ¦ datos de bit ¦
¦ ¦ SBCS o de bit ¦ ¦
+-----------------+------------------+-----------------------------------¦
¦ datos mixtos ¦ datos mixtos o ¦ datos mixtos ¦
¦ ¦ SBCS ¦ ¦
+-----------------+------------------+-----------------------------------¦
¦ datos SBCS ¦ datos SBCS ¦ datos SBCS ¦
+-----------------+------------------+-----------------------------------¦
¦ GRAPHIC(x) ¦ GRAPHIC(y) ¦ GRAPHIC(z) donde z = max(x,y) ¦
+-----------------+------------------+-----------------------------------¦
¦ VARGRAPHIC(x) ¦ GRAPHIC(y) o ¦ VARGRAPHIC(z) donde ¦
¦ ¦ VARGRAPHIC(y) ¦ z = max(x,y) ¦
+-----------------+------------------+-----------------------------------¦
¦ DATE ¦ DATE ¦ DATE ¦
+-----------------+------------------+-----------------------------------¦
¦ TIME ¦ TIME ¦ TIME ¦
+-----------------+------------------+-----------------------------------¦
¦ TIMESTAMP ¦ TIMESTAMP ¦ TIMESTAMP ¦
+-----------------+------------------+-----------------------------------¦
¦ FLOAT (doble) ¦ cualquier tipo ¦ FLOAT (doble) ¦
¦ ¦ numérico ¦ ¦
+-----------------+------------------+-----------------------------------¦
¦ FLOAT (simple) ¦ FLOAT (simple) ¦ FLOAT (simple) ¦
+-----------------+------------------+-----------------------------------¦
¦ FLOAT (simple) ¦ DECIMAL, ¦ FLOAT (doble) ¦
¦ ¦ NUMERIC, ¦ ¦
¦ ¦ INTEGER o ¦ ¦
¦ ¦ SMALLINT ¦ ¦
+-----------------+------------------+-----------------------------------¦
¦ DECIMAL(w,x) ¦ DECIMAL(y,z) o ¦ DECIMAL(p,s) donde ¦
¦ ¦ NUMERIC(y,z,) ¦ p = min(31, ¦
¦ ¦ ¦ max(x,z)+max(w-x,y-z)) ¦
¦ ¦ ¦ s = max(x,z) ¦
+-----------------+------------------+-----------------------------------¦
¦ DECIMAL(w,x) ¦ INTEGER ¦ DECIMAL(p,x) donde ¦
¦ ¦ ¦ p = min(31, x+max(w-x,11)) ¦
+-----------------+------------------+-----------------------------------¦
¦ DECIMAL(w,x) ¦ SMALLINT ¦ DECIMAL(p,x) donde ¦
¦ ¦ ¦ p = min(31, x+max(w-x,5)) ¦
+-----------------+------------------+-----------------------------------¦
¦ NUMERIC(w,x) ¦ NUMERIC(y,z) ¦ NUMERIC(p,s) donde ¦
¦ ¦ ¦ p = min(31, max(x,z) + max(w-x, ¦
¦ ¦ ¦ y-z)) ¦
¦ ¦ ¦ s = max(x,z) ¦
+-----------------+------------------+-----------------------------------¦
¦ NUMERIC(w,x) ¦ INTEGER ¦ NUMERIC(p,x) donde ¦
¦ ¦ ¦ p = min(31, x + max(w-x,11)) ¦
+-----------------+------------------+-----------------------------------¦
¦ NUMERIC(w,x) ¦ SMALLINT ¦ NUMERIC(p,x) donde ¦
¦ ¦ ¦ p = min(31, x + max(w-x,5)) ¦
+-----------------+------------------+-----------------------------------¦
¦ INTEGER ¦ INTEGER ¦ INTEGER ¦
+-----------------+------------------+-----------------------------------¦
¦ INTEGER ¦ SMALLINT ¦ INTEGER ¦
+-----------------+------------------+-----------------------------------¦
¦ SMALLINT ¦ SMALLINT ¦ SMALLINT ¦
+-----------------+------------------+-----------------------------------¦
¦ NONZERO SCALE ¦ NONZERO SCALE ¦ NONZERO SCALE BINARY (si ¦
¦ BINARY ¦ BINARY ¦ cualquiera de los dos operandos ¦
¦ ¦ ¦ es binario con escala no cero, ¦
¦ ¦ ¦ los dos operandos deben ser ¦
¦ ¦ ¦ binarios con la misma escala). ¦
+------------------------------------------------------------------------+

Si ninguna columna de operando permite valores nulos, el resultado tampoco


los permitirá. De lo contrario, el resultado permite nulos. Si la
descripción de cualquier columna de operando no es la misma que la
descripción del resultado, sus valores se convierten para ajustarse a la
descripción del resultado.

La operación de conversión es exactamente la misma que se produciría si


los valores se hubieran asignado al resultado. Por ejemplo,

© Copyright IBM Corp. 1995, 1996


4.3.2 - 1
DB2/400 Manual de Consulta SQL V3R7
Reglas para tipos de datos de resultado
 Si una columna de operando es CHAR(10) y la otra columna de operando
es CHAR(5), el resultado es CHAR(10) y los valores derivados de la
columna CHAR(5) se rellenan por la derecha con cinco blancos.

 Se produce un error si no puede mantenerse la parte completa de un


número.

© Copyright IBM Corp. 1995, 1996


4.3.2 - 2
DB2/400 Manual de Consulta SQL V3R7
Reglas de conversión para operaciones que combinan series
4.3.3 Reglas de conversión para operaciones que combinan series

Las operaciones que combinan series son la concatenación, UNION y UNION


ALL (estas reglas también se aplican a las funciones escalares MAX, MIN,
VALUE, COALESCE, IFNULL y CONCAT.) En cada caso, el CCSID del resultado
se determina en el momento del enlace, y la ejecución de la operación
puede conllevar la conversión de series al juego de caracteres codificados
que se identifica mediante dicho CCSID.

El CCSID del resultado viene determinado por los CCSID de los operandos.
Los CCSID de los dos primeros operandos determinan un CCSID de resultados
intermedios. Este CCSID y el del operando siguiente determinan un nuevo
CCSID de resultados intermedios, y así sucesivamente. El último CCSID de
resultados intermedios y el CCSID del último operando determinan el CCSID
de la serie o columna de resultados. Para cada par de CCSID, el CCSID de
resultado viene determinado por la aplicación secuencial de las reglas
siguientes:

 Si los CCSID son iguales, el resultado es este CCSID.

 Si cualquiera de los dos CCSID es 65535, el resultado es 65535.

 Si un CCSID denota datos SBCS y el otro denota datos mixtos, el


resultado es el CCSID de los datos mixtos.

 Si no es así, el CCSID resultante viene determinado según la siguiente


tabla:

+--------------------------------------------------------------------------------------------------+
¦ Tabla 6. Seleccionar el CCSID de los resultados intermedios ¦
+--------------------------------------------------------------------------------------------------¦
¦ ¦ Segundo operando ¦
¦ +----------------------------------------------------------------------¦
¦ ¦ ¦ ¦ ¦ ¦ Variable ¦
¦ ¦ Valor de ¦ Valor ¦ ¦ Registro ¦ lenguaje ¦
¦ Primer operando ¦ columna ¦ derivado ¦ Constante ¦ especial ¦ principal ¦
+---------------------------+-------------+--------------+-------------+-------------+-------------¦
¦ Valor de ¦ Primero ¦ Primero ¦ Primero ¦ Primero ¦ Primero ¦
¦ columna ¦ ¦ ¦ ¦ ¦ ¦
+---------------------------+-------------+--------------+-------------+-------------+-------------¦
¦ Valor derivado ¦ Segundo ¦ Primero ¦ Primero ¦ Primero ¦ Primero ¦
+---------------------------+-------------+--------------+-------------+-------------+-------------¦
¦ Constante ¦ Segundo ¦ Segundo ¦ Primero ¦ Primero ¦ Primero ¦
+---------------------------+-------------+--------------+-------------+-------------+-------------¦
¦ Registro ¦ Segundo ¦ Segundo ¦ Primero ¦ Primero ¦ Primero ¦
¦ especial ¦ ¦ ¦ ¦ ¦ ¦
+---------------------------+-------------+--------------+-------------+-------------+-------------¦
¦ Variable ¦ Segundo ¦ Segundo ¦ Segundo ¦ Segundo ¦ Primero ¦
¦ lenguaje ¦ ¦ ¦ ¦ ¦ ¦
¦ principal ¦ ¦ ¦ ¦ ¦ ¦
+--------------------------------------------------------------------------------------------------+

Sin embargo, una variable del lenguaje principal que contenga datos en un
esquema de codificación foráneo se convierte siempre de forma efectiva al
esquema de codificación nativo antes de utilizarse en cualquier operación.
Las reglas anteriores se basan en la suposición de que esta conversión ya
se ha realizado.

Tenga presente que se considera que un resultado intermedio es un operando


de valor derivado. Supongamos, por ejemplo, que COLA, COLB y COLC son
columnas con los CCSID 37, 278 y 500, respectivamente. El CCSID de
resultado de COLA CONCAT COLB CONCAT COLC se determina de la siguiente
manera:

1. El CCSID de resultado de COLA CONCAT COLB queda determinado primero


como 37 porque ambos operandos son columnas, con lo que se elige el
CCSID del primer operando.

2. El CCSID de resultado de la concatenación del resultado del paso 1 y


COLC queda determinado en 500. Se determina el CCSID de resultado 500
porque el primer operando es un valor derivado y el segundo operando
es una columna, con lo que se escoge el CCSID del segundo operando.

Un operando de concatenación o el argumento seleccionado de la función


escalar MAX, MIN, VALUE, COALESCE, IFNULL y CONCAT se convierte, si es
necesario, al juego de caracteres codificados de la serie resultado. Cada
serie de un operando de UNION o UNION ALL se convierte, si es necesario,
al juego de caracteres codificados de la columna de resultados. La
conversión de caracteres sólo es necesaria si se cumplen todas las
condiciones siguientes:

 Los CCSID son diferentes.


 Ninguno de los CCSID es 65535.
 La serie no es nula ni está vacía.
 La tabla para la selección de conversiones CCSID indica que es
necesaria la conversión.

Se producirá un error si no se puede convertir un carácter de una serie o


si la tabla para la selección de conversiones de CCSID utilizada no
contiene ninguna información sobre el par de CCSID. Se producirá un aviso
si un carácter de la serie se convierte al carácter de sustitución.

© Copyright IBM Corp. 1995, 1996


4.3.3 - 1
DB2/400 Manual de Consulta SQL V3R7
sentencia select
4.4 sentencia select

+------------------------------------------------------------------------+
¦ ¦
¦ >--selección completa------------------------------------------------> ¦
¦ +-cláusula-order-by-+ ¦
¦ ¦
¦ <----------------------+ (1,2) ¦
¦ >--------------------------------------------------------------------> ¦
¦ +-cláusula-update----¦ ¦
¦ +-cláusula-read-only-¦ ¦
¦ +-cláusula-optimize--¦ ¦
¦ +-cláusula-isolation-+ ¦
¦ ¦
¦ Notas: ¦
¦ (1) La cláusula-update y la cláusula-read-only no pueden ¦
¦ especificarse en la misma sentencia-select. ¦
¦ ¦
¦ (2) Cada una de las cláusulas sólo se puede especificar una vez. ¦
¦ ¦
+------------------------------------------------------------------------+

La sentencia-select es el formato de una consulta que puede especificarse


directamente en una sentencia DECLARE CURSOR o bien prepararse y luego
hacer referencia a él en una sentencia DECLARE CURSOR. También puede
emitirse interactivamente utilizando el recurso interactivo (mandato
STRSQL), lo que provoca la visualización de una tabla de resultados en el
terminal. En cualquiera de los dos casos, la tabla especificada por una
sentencia-select es el resultado de la selección completa.

Subtemas
4.4.1 cláusula order-by
4.4.2 cláusula update
4.4.3 cláusula read-only
4.4.4 cláusula optimize
4.4.5 cláusula isolation
4.4.6 Ejemplos de una sentencia select

© Copyright IBM Corp. 1995, 1996


4.4 - 1
DB2/400 Manual de Consulta SQL V3R7
cláusula order-by
4.4.1 cláusula order-by

+------------------------------------------------------------------------+
¦ ¦
¦ <-,------------------------+ ¦
¦ +-ASC--+ ¦ ¦
¦ >--ORDER BY------nombre-col----+------+------------------------------> ¦
¦ +-entero-----+ +-DESC-+ ¦
¦ ¦
+------------------------------------------------------------------------+

La cláusula ORDER BY especifica una ordenación de las filas de la tabla de


resultados. Si se identifica una sola columna, las filas se ordenan por
los valores de dicha columna. Si se identifica más de una columna, las
filas se ordenan por los valores de la primera columna identificada,
después por los valores de la segunda columna identificada, y así
sucesivamente.

Si está en vigor una secuencia de clasificación distinta de *HEX al


ejecutar la sentencia que contiene la cláusula ORDER BY y si la cláusula
ORDER BY conlleva columnas que tengan datos SBCS o mixtos, la comparación
de dichas columnas se realiza utilizando los valores significativos. Los
valores significativos derivan de aplicar la secuencia de clasificación a
los valores de las columnas.

Una columna con nombre puede estar identificada por un entero o por un
nombre-columna. Una columna sin nombre debe estar identificada por un
entero. Una columna carece de nombre si no se especifica la cláusula AS
en la lista de selección y si se ha derivado de una constante, una
expresión con operadores o una función. Si la selección completa incluye
un operador UNION, consulte el apartado "selección completa" en el
tema 4.3 para saber cuáles son las reglas sobre columnas con nombre en una
selección completa.

nombre-columna
Debe identificar de forma no ambigua una columna de la tabla de
resultados. Aunque en la cláusula ORDER BY no puede hacerse
referencia a las columnas no incluidas en la tabla de resultados, las
reglas para referencias a columnas no ambiguas son las mismas que en
el caso de las demás cláusulas de la selección completa. Consulte el
apartado "Calificadores de nombre de columna para evitar la
ambigüedad" en el tema 2.10.3 para obtener más información.

Si la selección completa incluye UNION o UNION ALL, el nombre de


columna no se puede calificar.

entero
Debe ser mayor que 0 y no mayor que el número de columnas de la tabla
de resultados. El entero n identifica la enésima columna de la tabla
de resultados.

ASC
Utiliza los valores de la columna en orden ascendente. Este es el
valor por omisión.

DESC
Utiliza los valores de la columna en orden descendente.

La ordenación se lleva a cabo siguiendo las reglas de comparación


descritas en el Capítulo 2. El valor nulo es mayor que cualquier otro
valor. Si la especificación de ordenación no determina una ordenación
completa, las filas con valores duplicados de la última columna
identificada tendrán un orden arbitrario. Si no se especifica la cláusula
ORDER BY, las filas de la tabla de resultados tendrán un orden arbitrario.

La cláusula ORDER BY puede contener hasta 10000-n columnas ó 10000-n bytes


(donde n es el número de columnas o bytes especificados que permiten
valores nulos).

© Copyright IBM Corp. 1995, 1996


4.4.1 - 1
DB2/400 Manual de Consulta SQL V3R7
cláusula update
4.4.2 cláusula update

+------------------------------------------------------------------------+
¦ ¦
|¦ >--FOR UPDATE--------------------------------------------------------> ¦
|¦ ¦ <-,----------+ ¦ ¦
|¦ +-OF----nombre-col---+ ¦
¦ ¦
+------------------------------------------------------------------------+

La cláusula UPDATE identifica las columnas que se pueden actualizar en una


sentencia UPDATE situada posteriormente. Cada nombre-columna debe ser no
calificado y debe identificar una columna de la tabla o vista que se
identifica en la primera cláusula FROM de la selección completa. Si se ha
especificado la cláusula UPDATE sin nombres de columna, se incluyen todas
las columnas actualizables de la tabla o vista que se identifica en la
primera cláusula FROM de la selección completa. La cláusula puede
aparecer antes o después de la cláusula-optimize que la acompañe.

No debe especificarse la cláusula FOR UPDATE OF si la tabla de resultados


de la selección completa es de sólo lectura, si se utiliza la cláusula FOR
READ ONLY, o si se especifica la palabra clave SCROLL sin la palabra clave
DYNAMIC en la sentencia DECLARE CURSOR.

Las sentencias UPDATE situadas que identifiquen el cursor asociado a una


sentencia-select pueden actualizar todas las columnas actualizables,
siempre que:

 La sentencia-select no contenga uno de los elementos siguientes:


- Una cláusula UPDATE
- Una cláusula FOR READ ONLY
- Una cláusula ORDER BY
 La sentencia DECLARE CURSOR no contenga una palabra clave SCROLL sin
la palabra clave DYNAMIC.

La cláusula UPDATE es una opción de rendimiento que no forma parte del SQL
ISO/ANSI.

© Copyright IBM Corp. 1995, 1996


4.4.2 - 1
DB2/400 Manual de Consulta SQL V3R7
cláusula read-only
4.4.3 cláusula read-only

+------------------------------------------------------------------------+
¦ ¦
¦ >--FOR----READ-----ONLY----------------------------------------------> ¦
¦ +-FETCH-+ ¦
¦ ¦
+------------------------------------------------------------------------+

La cláusula FOR READ ONLY indica que la tabla de resultados es de sólo


lectura. Por ejemplo, su cursor no se utiliza para sentencias DELETE o
UPDATE situadas.

Algunas tablas de resultados son de sólo lectura por naturaleza (por


ejemplo, una tabla basada en una vista de sólo lectura). De todas formas,
puede especificarse FOR READ ONLY para dichas tablas, pero la
especificación no tiene ningún efecto.

Para tablas de resultados en las que estén permitidas actualizaciones y


supresiones, es posible que si se especifica FOR READ ONLY mejore el
rendimiento de las operaciones FETCH al permitir que el gestor de bases de
datos realice bloqueos y evite los bloqueos exclusivos. Por ejemplo, en
programas que contengan sentencias SQL dinámicas sin la cláusula FOR READ
ONLY ni la cláusula ORDER BY, el gestor de bases de datos puede abrir
cursores que no tengan especificado SCROLL sin la palabra clave DYNAMIC
como si se hubiera especificado la cláusula FOR UPDATE OF.

No se puede hacer referencia a una tabla de resultados de sólo lectura en


una sentencia UPDATE o DELETE, tanto si es de sólo lectura por naturaleza
como si se especifica como FOR READ ONLY.

La cláusula FOR READ ONLY no puede aparecer en una sentencia que contenga
una cláusula UPDATE. La cláusula puede aparecer antes o después de la
cláusula-optimize que la acompañe.

© Copyright IBM Corp. 1995, 1996


4.4.3 - 1
DB2/400 Manual de Consulta SQL V3R7
cláusula optimize
4.4.4 cláusula optimize

+------------------------------------------------------------------------+
¦ ¦
¦ >--OPTIMIZE FOR--entero----ROW---------------------------------------> ¦
¦ +-ROWS-+ ¦
¦ ¦
+------------------------------------------------------------------------+
La cláusula-optimize le dice al gestor de bases de datos que dé por
supuesto que el programa no tiene la intención de recuperar más que filas
de entero de la tabla de resultados. Sin esta cláusula, el gestor de bases
de datos supone que se han de recuperar todas las filas de la tabla de
resultados y realiza la optimización según este criterio. Realizar la
optimización para las filas de entero, o como mínimo, el número de filas
que se obtienen con una operación FETCH podría mejorar el rendimiento. La
cláusula no cambia la tabla de resultados ni el orden en que se se
obtienen las filas con una operación FETCH. Con una operación FETCH puede
obtenerse cualquier número de filas, pero es posible que el rendimiento se
degrade después de realizar operaciones FETCH de entero. La cláusula
puede aparecer antes o después de una cláusula-update o cláusula-read-only
que la acompañe.

© Copyright IBM Corp. 1995, 1996


4.4.4 - 1
DB2/400 Manual de Consulta SQL V3R7
cláusula isolation
4.4.5 cláusula isolation

+------------------------------------------------------------------------+
¦ ¦
¦ (1) ¦
¦ >--WITH----NC--------------------------------------------------------> ¦
¦ ¦ (2)¦ ¦
¦ +-UR----¦ ¦
¦ +-CS----¦ ¦
¦ ¦ (3)¦ ¦
¦ +-RS----¦ ¦
¦ +-RR----+ ¦
¦ ¦
¦ Notas: ¦
¦ (1) La palabra clave NONE se puede utilizar como sinónimo de NC. ¦
¦ ¦
¦ (2) La palabra clave CHG se puede utilizar como sinónimo de UR. ¦
¦ ¦
¦ (3) La palabra clave ALL se puede utilizar como sinónimo de RS. ¦
¦ ¦
+------------------------------------------------------------------------+

La cláusula-isolation especifica un nivel de aislamiento en las sentencias


SELECT, SELECT INTO, INSERT, UPDATE, DELETE y DECLARE CURSOR. Este nivel
de aislamiento entra en vigor sólo para la ejecución de la sentencia que
contiene la cláusula de aislamiento.

© Copyright IBM Corp. 1995, 1996


4.4.5 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplos de una sentencia select
4.4.6 Ejemplos de una sentencia select

Ejemplo 1: Seleccionar todas las columnas y filas de la tabla EMPLEADO.

SELECT * FROM EMPLEADO

Ejemplo 2: Seleccionar el nombre de proyecto (NOMBREPR), la fecha de


inicio (FCHAINIP) y la fecha de finalización (FCHFINPR) a partir de la
tabla PROYECTO. Ordenar la tabla de resultados por la fecha de
finalización incluyendo en primer lugar las fechas más recientes.

SELECT NOMBREPR, FCHAINIP, FCHFINPR


FROM PROYECTO
ORDER BY FCHFINPR DESC

Ejemplo 3: Seleccionar el número de departamento (DEPTTRAB) y el sueldo


medio departamental (SUELDO) de todos los departamentos de la tabla
EMPLEADO. Disponer la tabla de resultados en orden ascendente por sueldo
medio departamental.

SELECT DEPTTRAB, AVG(SUELDO)


FROM EMPLEADO
GROUP BY DEPTTRAB
ORDER BY 2

Ejemplo 4: Declarar un cursor denominado CUR_AC para utilizarlo en un


programa PL/I y actualizar las columnas de fecha de inicio (FCHAINIP) y de
fecha de finalización (FCHFINPR) de la tabla PROYECTO. El programa debe
recibir ambos valores junto con el valor de número de proyecto (NUMPRO) de
cada fila. La declaración especifica que la vía de acceso correspondiente
a la consulta puede optimizarse para la recuperación de un máximo de 2
filas. Aun así, el programa puede recuperar más de 2 filas de la tabla de
resultados. Sin embargo, si se recuperan más de 2 filas, el rendimiento
puede degradarse.

EXEC SQL DECLARE CUR_AC CURSOR FOR


SELECT NUMPRO, FCHAINIP, FCHFINPR
FROM PROYECTO
FOR UPDATE OF FCHAINIP, FCHFINPR
OPTIMIZE FOR 2 ROWS ;

Ejemplo 5: Seleccionar los elementos de una tabla con un nivel de


aislamiento de Lectura Repetible (RS, ALL).

SELECT NOMBRE, SUELDO FROM NOMINA WHERE DEPT = 704 WITH RS

© Copyright IBM Corp. 1995, 1996


4.4.6 - 1
DB2/400 Manual de Consulta SQL V3R7
Capítulo 5. Sentencias
5.0 Capítulo 5. Sentencias
Este capítulo contiene diagramas de sintaxis, descripciones semánticas,
reglas y ejemplos de la utilización de las sentencias SQL que aparecen
listadas en la tabla siguiente.

+------------------------------------------------------------------------+
¦ Tabla 7. Sentencias SQL ¦
+------------------------------------------------------------------------¦
¦ Sentencia SQL ¦ Función ¦ Vaya a ¦
¦ ¦ ¦ la ¦
+--------------------+-----------------------------------------+---------¦
¦ ALTER TABLE ¦ Altera la descripción de una tabla ¦ p. 5.4 ¦
+--------------------+-----------------------------------------+---------¦
¦ BEGIN DECLARE ¦ Marca el comienzo de una sección de ¦ p. 5.5 ¦
¦ SECTION ¦ declaración SQL ¦ ¦
+--------------------+-----------------------------------------+---------¦
¦ CALL ¦ Llama a un procedimiento ¦ p. 5.6 ¦
+--------------------+-----------------------------------------+---------¦
¦ CLOSE ¦ Cierra un cursor ¦ p. 5.7 ¦
+--------------------+-----------------------------------------+---------¦
¦ COMMENT ON ¦ Sustituye o añade un comentario a la ¦ p. 5.8 ¦
|¦ ¦ descripción de una columna, índice, ¦ ¦
¦ ¦ paquete, parámetro, procedimiento, ¦ ¦
¦ ¦ tabla o vista ¦ ¦
+--------------------+-----------------------------------------+---------¦
¦ COMMIT ¦ Finaliza una unidad de trabajo y ¦ p. 5.9 ¦
¦ ¦ compromete los cambios de la base de ¦ ¦
¦ ¦ datos realizados por dicha unidad de ¦ ¦
¦ ¦ trabajo ¦ ¦
+--------------------+-----------------------------------------+---------¦
¦ CONNECT (Tipo 1) ¦ Efectúa la conexión a un servidor de la ¦ p. 5.10 ¦
¦ ¦ aplicación y establece las reglas para ¦ ¦
¦ ¦ la unidad de trabajo remota ¦ ¦
+--------------------+-----------------------------------------+---------¦
¦ CONNECT (Tipo 2) ¦ Realiza la conexión a un servidor de la ¦ p. 5.11 ¦
¦ ¦ aplicación y establece las reglas para ¦ ¦
¦ ¦ las unidades de trabajo distribuidas ¦ ¦
¦ ¦ dirigidas por la aplicación. ¦ ¦
+--------------------+-----------------------------------------+---------¦
¦ CREATE COLLECTION ¦ Define una colección ¦ p. 5.12 ¦
¦ ¦ ¦ ¦
+--------------------+-----------------------------------------+---------¦
¦ CREATE INDEX ¦ Define un índice en una tabla ¦ p. 5.13 ¦
¦ ¦ ¦ ¦
+--------------------+-----------------------------------------+---------¦
¦ CREATE PROCEDURE ¦ Define un procedimiento externo ¦ p. 5.14 ¦
¦ ¦ ¦ ¦
+--------------------+-----------------------------------------+---------¦
¦ CREATE SCHEMA ¦ Define una colección y un conjunto de ¦ p. 5.15 ¦
¦ ¦ sentencias DDL relacionadas con dicha ¦ ¦
¦ ¦ colección ¦ ¦
+--------------------+-----------------------------------------+---------¦
¦ CREATE TABLE ¦ Define una tabla ¦ p. 5.16 ¦
¦ ¦ ¦ ¦
+--------------------+-----------------------------------------+---------¦
¦ CREATE VIEW ¦ Define una vista de una o más tablas o ¦ p. 5.17 ¦
¦ ¦ vistas ¦ ¦
+--------------------+-----------------------------------------+---------¦
¦ DECLARE CURSOR ¦ Define un cursor SQL ¦ p. 5.18 ¦
¦ ¦ ¦ ¦
+--------------------+-----------------------------------------+---------¦
¦ DECLARE PROCEDURE ¦ Define un procedimiento externo ¦ p. 5.19 ¦
¦ ¦ ¦ ¦
+--------------------+-----------------------------------------+---------¦
¦ DECLARE STATEMENT ¦ Declara los nombres utilizados para ¦ p. 5.20 ¦
¦ ¦ identificar sentencias SQL preparadas ¦ ¦
+--------------------+-----------------------------------------+---------¦
¦ DECLARE VARIABLE ¦ Declara un subtipo o un CCSID distintos ¦ p. 5.21 ¦
¦ ¦ al valor por omisión de una variable ¦ ¦
¦ ¦ del lenguaje principal ¦ ¦
+--------------------+-----------------------------------------+---------¦
¦ DELETE ¦ Suprime una o más filas de una tabla ¦ p. 5.22 ¦
¦ ¦ ¦ ¦
+--------------------+-----------------------------------------+---------¦
¦ DESCRIBE ¦ Describe las columnas de resultado de ¦ p. 5.23 ¦
¦ ¦ una sentencia preparada ¦ ¦
+--------------------+-----------------------------------------+---------¦
¦ DESCRIBE TABLE ¦ Obtiene información sobre una tabla o ¦ p. 5.24 ¦
¦ ¦ vista ¦ ¦
+--------------------+-----------------------------------------+---------¦
¦ DISCONNECT ¦ Finaliza de forma inmediata una o más ¦ p. 5.25 ¦
¦ ¦ conexiones ¦ ¦
+--------------------+-----------------------------------------+---------¦
|¦ DROP ¦ Suprime una colección, índice, paquete, ¦ p. 5.26 ¦
|¦ ¦ procedimiento, tabla o vista ¦ ¦
+--------------------+-----------------------------------------+---------¦
¦ END DECLARE ¦ Marca el final de una sección de ¦ p. 5.27 ¦
¦ SECTION ¦ declaración SQL ¦ ¦
+--------------------+-----------------------------------------+---------¦
¦ EXECUTE ¦ Ejecuta una sentencia SQL preparada ¦ p. 5.28 ¦
¦ ¦ ¦ ¦
+--------------------+-----------------------------------------+---------¦
¦ EXECUTE IMMEDIATE ¦ Prepara y ejecuta una sentencia SQL ¦ p. 5.29 ¦
¦ ¦ ¦ ¦
+--------------------+-----------------------------------------+---------¦
¦ FETCH ¦ Sitúa un cursor en una fila de la tabla ¦ p. 5.30 ¦
¦ ¦ de resultados; también puede asignar ¦ ¦
¦ ¦ valores procedentes de una o más filas ¦ ¦

© Copyright IBM Corp. 1995, 1996


5.0 - 1
DB2/400 Manual de Consulta SQL V3R7
Capítulo 5. Sentencias
¦ ¦ de la tabla de resultados a variables ¦ ¦
¦ ¦ del lenguaje principal. ¦ ¦
+--------------------+-----------------------------------------+---------¦
¦ GRANT (Privilegios ¦ Otorga privilegios sobre un paquete ¦ p. 5.31 ¦
¦ de paquete) ¦ ¦ ¦
+--------------------+-----------------------------------------+---------¦
¦ GRANT (Privilegios ¦ Otorga privilegios sobre una tabla o ¦ p. ¦
¦ de tabla) ¦ vista ¦ 5.31.6 ¦
+--------------------+-----------------------------------------+---------¦
¦ INCLUDE ¦ Inserta declaraciones en un programa ¦ p. 5.33 ¦
¦ ¦ fuente ¦ ¦
+--------------------+-----------------------------------------+---------¦
¦ INSERT ¦ Inserta una o más filas en una tabla ¦ p. 5.34 ¦
¦ ¦ ¦ ¦
+--------------------+-----------------------------------------+---------¦
¦ LABEL ON ¦ Sustituye o añade una etiqueta a la ¦ p. 5.35 ¦
¦ ¦ descripción de una tabla, vista, ¦ ¦
¦ ¦ columna o paquete SQL ¦ ¦
+--------------------+-----------------------------------------+---------¦
¦ LOCK TABLE ¦ O bien impide que los procesos ¦ p. 5.36 ¦
¦ ¦ concurrentes modifiquen una tabla o ¦ ¦
¦ ¦ bien impide que la utilicen ¦ ¦
+--------------------+-----------------------------------------+---------¦
¦ OPEN ¦ Abre un cursor ¦ p. 5.37 ¦
¦ ¦ ¦ ¦
+--------------------+-----------------------------------------+---------¦
¦ PREPARE ¦ Prepara una sentencia SQL para su ¦ p. 5.38 ¦
¦ ¦ ejecución ¦ ¦
+--------------------+-----------------------------------------+---------¦
¦ RELEASE ¦ Coloca una o varias conexiones en el ¦ p. 5.39 ¦
¦ ¦ estado pendiente de liberación ¦ ¦
+--------------------+-----------------------------------------+---------¦
|¦ RENAME ¦ Redenomina una tabla, vista o índice. ¦ p. 5.40 ¦
¦ ¦ ¦ ¦
+--------------------+-----------------------------------------+---------¦
¦ REVOKE ¦ Revoca el privilegio de ejecutar ¦ p. 5.41 ¦
¦ (Privilegios de ¦ sentencias en un paquete ¦ ¦
¦ paquete) ¦ ¦ ¦
+--------------------+-----------------------------------------+---------¦
¦ REVOKE ¦ Revoca los privilegios sobre una tabla ¦ p. 5.42 ¦
¦ (Privilegios de ¦ o vista ¦ ¦
¦ tabla) ¦ ¦ ¦
+--------------------+-----------------------------------------+---------¦
¦ ROLLBACK ¦ Finaliza una unidad de trabajo y ¦ p. 5.43 ¦
¦ ¦ restituye los cambios de la base de ¦ ¦
¦ ¦ datos realizados por dicha unidad de ¦ ¦
¦ ¦ trabajo ¦ ¦
+--------------------+-----------------------------------------+---------¦
¦ SELECT INTO ¦ Especifica una tabla de resultados de ¦ p. 5.44 ¦
¦ ¦ no más de una fila y asigna los valores ¦ ¦
¦ ¦ a variables del lenguaje principal ¦ ¦
+--------------------+-----------------------------------------+---------¦
¦ SET CONNECTION ¦ Establece el servidor de la aplicación ¦ p. 5.45 ¦
¦ ¦ del proceso identificando una de sus ¦ ¦
¦ ¦ conexiones existentes ¦ ¦
+--------------------+-----------------------------------------+---------¦
¦ SET OPTION ¦ Establece las opciones para procesar ¦ p. 5.46 ¦
¦ ¦ sentencias SQL ¦ ¦
+--------------------+-----------------------------------------+---------¦
¦ SET RESULT SETS ¦ Identifica los conjuntos de resultados ¦ p. 5.47 ¦
¦ ¦ en un procedimiento ¦ ¦
+--------------------+-----------------------------------------+---------¦
¦ SET TRANSACTION ¦ Cambia el nivel de aislamiento para la ¦ p. 5.48 ¦
¦ ¦ unidad de trabajo actual ¦ ¦
+--------------------+-----------------------------------------+---------¦
¦ UPDATE ¦ Actualiza los valores de una o más ¦ p. 5.49 ¦
¦ ¦ columnas en una o más filas de una ¦ ¦
¦ ¦ tabla ¦ ¦
+--------------------+-----------------------------------------+---------¦
¦ WHENEVER ¦ Define las acciones que se han de ¦ p. 5.50 ¦
¦ ¦ llevar a cabo tomando como base los ¦ ¦
¦ ¦ códigos de retorno SQL ¦ ¦
+------------------------------------------------------------------------+

Subtemas
5.1 Cómo se invocan las sentencias SQL
5.2 Códigos de retorno SQL
5.3 Comentarios SQL
5.4 ALTER TABLE
5.5 BEGIN DECLARE SECTION
5.6 CALL
5.7 CLOSE
5.8 COMMENT ON
5.9 COMMIT
5.10 CONNECT (Tipo 1)
5.11 CONNECT (Tipo 2)
5.12 CREATE COLLECTION
5.13 CREATE INDEX
5.14 CREATE PROCEDURE
5.15 CREATE SCHEMA
5.16 CREATE TABLE
5.17 CREATE VIEW
5.18 DECLARE CURSOR
5.19 DECLARE PROCEDURE
5.20 DECLARE STATEMENT
5.21 DECLARE VARIABLE
5.22 DELETE
5.23 DESCRIBE

© Copyright IBM Corp. 1995, 1996


5.0 - 2
DB2/400 Manual de Consulta SQL V3R7
Capítulo 5. Sentencias
5.24 DESCRIBE TABLE
5.25 DISCONNECT
5.26 DROP
5.27 END DECLARE SECTION
5.28 EXECUTE
5.29 EXECUTE IMMEDIATE
5.30 FETCH
5.31 GRANT (Privilegios de paquete)
5.32 GRANT (Privilegios de tabla)
5.33 INCLUDE
5.34 INSERT
5.35 LABEL ON
5.36 LOCK TABLE
5.37 OPEN
5.38 PREPARE
5.39 RELEASE
5.40 RENAME
5.41 REVOKE (Privilegios de paquete)
5.42 REVOKE (Privilegios de tabla)
5.43 ROLLBACK
5.44 SELECT INTO
5.45 SET CONNECTION
5.46 SET OPTION
5.47 SET RESULT SETS
5.48 SET TRANSACTION
5.49 UPDATE
5.50 WHENEVER

© Copyright IBM Corp. 1995, 1996


5.0 - 3
DB2/400 Manual de Consulta SQL V3R7
Cómo se invocan las sentencias SQL
5.1 Cómo se invocan las sentencias SQL

Las sentencias SQL descritas en este capítulo se clasifican en ejecutables


y no ejecutables. El apartado Invocación que aparece en la descripción de
cada sentencia indica si la sentencia es ejecutable o no.

Una sentencia ejecutable puede invocarse de una de las siguientes maneras:

 Hospedada en un programa de aplicación


 Preparada y ejecutada dinámicamente
 Emitida interactivamente

Nota: Las sentencias hospedadas en REXX o procesadas utilizando RUNSQLSTM


se preparan y ejecutan dinámicamente.

Dependiendo de la sentencia, podrá utilizar todos o bien sólo algunos de


estos métodos. El apartado Invocación de la descripción de cada sentencia
le indica cuáles son los métodos que pueden utilizarse.

Una sentencia no ejecutable sólo puede hospedarse en un programa de


aplicación.

Además de las sentencias descritas en este capítulo, existe una estructura


de sentencia SQL más: la sentencia-select. Véase el apartado "sentencia
select" en el tema 4.4. No se ha incluido en este capítulo porque se
utiliza de una forma distinta a la de las demás sentencias.

Una sentencia-select puede invocarse de una de las formas siguientes:

 Incluida en DECLARE CURSOR y ejecutada implícitamente por OPEN


 Preparada dinámicamente, referenciada en DECLARE CURSOR y ejecutada
implícitamente por OPEN
 Emitida interactivamente

Los dos primeros métodos se denominan, respectivamente, la invocación


estática y dinámica de la sentencia-select.

Subtemas
5.1.1 Hospedar una sentencia en un programa de aplicación
5.1.2 Preparación y ejecución dinámicas
5.1.3 Invovación estática de una sentencia-select
5.1.4 Invocación dinámica de una sentencia-select
5.1.5 Invocación interactiva

© Copyright IBM Corp. 1995, 1996


5.1 - 1
DB2/400 Manual de Consulta SQL V3R7
Hospedar una sentencia en un programa de aplicación
5.1.1 Hospedar una sentencia en un programa de aplicación

Las sentencias SQL pueden incluirse en un programa fuente que se someterá


al precompilador utilizando los mandatos CRTSQLCBL, CRTSQLCBLI, CRTSQLCI,
|CRTSQLFTN, CRTSQLPLI, CRTSQLRPG o CRTSQLRPGI. De tales sentencias se dice
que están hospedadas en el programa. Una sentencia hospedada puede
situarse en cualquier parte del programa en el que está permitida una
sentencia del lenguaje principal. Cada sentencia hospedada debe ir
precedida de las palabras clave EXEC y SQL.

Sentencias ejecutables: Una sentencia ejecutable hospedada en un programa


de aplicación se ejecuta cada vez que se ejecutaría una sentencia del
lenguaje principal si se especificase en el mismo lugar. Esto significa
que una sentencia contenida en un bucle se ejecuta cada vez que se ejecuta
el bucle y una sentencia contenida en una construcción condicional se
ejecuta sólo cuando se cumple la condición.

Una sentencia hospedada puede contener referencias a variables del


lenguaje principal. Una variable del lenguaje principal referenciada de
esta manera puede utilizarse de dos maneras distintas:

 Como entrada (el valor actual de la variable del lenguaje principal se


utiliza en la ejecución de la sentencia)
 Como salida (se asigna un valor nuevo a la variable como resultado de
la ejecución de la sentencia)

En concreto, todas las referencias a las variables del lenguaje principal


en expresiones y predicados se sustituyen de forma efectiva por los
valores actuales de las variables, es decir, las variables se utilizan
como entrada. El tratamiento de otras referencias se describe
individualmente para cada sentencia.

Todas las sentencias ejecutables deben ir seguidas de la comprobación de


un código de retorno SQL. De forma alternativa, se puede utilizar la
sentencia WHENEVER (que en sí misma no es ejecutable) para cambiar el
flujo del control inmediatamente después de la ejecución de una sentencia
hospedada.

Los objetos a los que se hace referencia en sentencias SQL no es preciso


que existan al preparar las sentencias.

Sentencias no ejecutables: Una sentencia no ejecutable hospedada la


procesa sólo el precompilador. Este informa de cualquier error que
encuentre en ella. La sentencia no se ejecuta nunca y actúa como una no
operación si se coloca entre sentencias ejecutables del programa de
aplicación. Por tanto, dichas sentencias no deben ir seguidas de una
comprobación de un código de retorno SQL.

© Copyright IBM Corp. 1995, 1996


5.1.1 - 1
DB2/400 Manual de Consulta SQL V3R7
Preparación y ejecución dinámicas
5.1.2 Preparación y ejecución dinámicas

Un programa de aplicación puede construir dinámicamente una sentencia SQL


con el formato de una serie de caracteres colocada en una variable del
lenguaje principal. En general, la sentencia se construye a partir de
ciertos datos que el programa tiene disponibles (por ejemplo, la entrada
procedente de una estación de trabajo). La sentencia puede prepararse
para su ejecución utilizando la sentencia (hospedada) PREPARE y ejecutarse
con la sentencia (hospedada) EXECUTE. Alternativamente, puede utilizarse
la sentencia (hospedada) EXECUTE IMMEDIATE para preparar y ejecutar la
sentencia en un único paso.

Una sentencia preparada dinámicamente no debe contener referencias a


variables del lenguaje principal. En su lugar, puede contener marcadores
de parámetros. Consulte el apartado "PREPARE" en el tema 5.38 para saber
cuáles son las reglas que conciernen a esta sustitución. Al ejecutarse la
sentencia preparada, los marcadores de parámetros se sustituyen de forma
efectiva por los valores actuales de las variables del lenguaje principal
especificadas en la sentencia EXECUTE. Consulte el apartado "EXECUTE" en
el tema 5.28 para saber cuáles son las reglas que conciernen a esta
sustitución. Una vez preparada la sentencia, podrá ejecutarse varias
veces con diferentes valores de las variables del lenguaje principal. Los
marcadores de parámetros no están permitidos en EXECUTE IMMEDIATE.

La ejecución satisfactoria o insatisfactoria de la sentencia viene


indicada por el establecimiento de un código de retorno SQL en la SQLCA
tras la sentencia EXECUTE (o EXECUTE IMMEDIATE). Debe comprobar el código
de retorno SQL según lo descrito anteriormente referente a las sentencias
hospedadas. Véase el tema "Códigos de retorno SQL" en el tema 5.2 para
más información.

© Copyright IBM Corp. 1995, 1996


5.1.2 - 1
DB2/400 Manual de Consulta SQL V3R7
Invovación estática de una sentencia-select
5.1.3 Invovación estática de una sentencia-select

Una sentencia-select puede incluirse como parte de la sentencia (no


ejecutable) DECLARE CURSOR. Tal sentencia se ejecutará cada vez que se
abra el cursor por medio de la sentencia (hospedada) OPEN. Una vez
abierto el cursor, la tabla de resultados puede recuperarse fila por fila
en sucesivas ejecuciones de la sentencia FETCH o bien de varias en varias
filas utilizando la sentencia FETCH multifila.

Utilizada de esta manera, la sentencia-select puede contener referencias a


variables del lenguaje principal. Esta referencias se sustituyen de forma
efectiva por los valores que tengan las variables en el momento de
ejecutar OPEN.

© Copyright IBM Corp. 1995, 1996


5.1.3 - 1
DB2/400 Manual de Consulta SQL V3R7
Invocación dinámica de una sentencia-select
5.1.4 Invocación dinámica de una sentencia-select

Un programa de aplicación puede construir dinámicamente una


sentencia-select con el formato de una serie de caracteres colocada en una
variable del lenguaje principal. En general, la sentencia se construye a
partir de ciertos datos que el programa tiene disponibles (por ejemplo,
una consulta obtenida de una estación de trabajo). La sentencia se
ejecutará cada vez que se abra el cursor mediante la sentencia (hospedada)
OPEN. Una vez abierto el cursor, la tabla de resultados puede recuperarse
fila por fila en sucesivas ejecuciones de la sentencia FETCH o bien de
varias en varias filas utilizando la sentencia FETCH multifila.

Utilizada de esta manera, la sentencia-select no debe contener referencias


a variables del lenguaje principal. En su lugar, puede contener
marcadores de parámetros. Consulte el apartado "PREPARE" en el tema 5.38
para saber cuáles son las reglas que conciernen a esta sustitución. Estos
se sustituyen de forma efectiva por los valores de las variables del
lenguaje principal especificadas en la sentencia OPEN. Véase el apartado
"OPEN" en el tema 5.37 para saber cuáles son las reglas que conciernen a
esta sustitución.

© Copyright IBM Corp. 1995, 1996


5.1.4 - 1
DB2/400 Manual de Consulta SQL V3R7
Invocación interactiva
5.1.5 Invocación interactiva

Existe la posibilidad de introducir sentencias SQL desde una estación de


trabajo, posibilidad que forma parte parte de la arquitectura del gestor
de base de datos. El programa bajo licencia DB2 para OS/400 proporciona
el mandato Iniciar Lenguaje de Consulta Estructurada (STRSQL) y el mandato
Iniciar Gestor de Consultas (STRQM) para este recurso. También hay
disponibles otros productos. De las sentencias entradas de esta forma se
dice que se han emitido interactivamente. Una sentencia que no se pueda
preparar dinámicamente no puede emitirse interactivamente, a excepción de
las sentencias de gestión de conexión (CONNECT, DISCONNECT, RELEASE y SET
CONNECTION).

Las sentencias emitidas interactivamente deben ser sentencias ejecutables


que no contengan marcadores de parámetros o referencias a variables del
lenguaje principal, ya que éstos sólo tienen sentido en el contexto de un
programa de aplicación.

© Copyright IBM Corp. 1995, 1996


5.1.5 - 1
DB2/400 Manual de Consulta SQL V3R7
Códigos de retorno SQL
5.2 Códigos de retorno SQL

Un programa de aplicación que contenga sentencias SQL ejecutables debe


facilitar al menos uno de los elementos siguientes:

 Una estructura llamada SQLCA


 Una variable de entero autónoma llamada SQLCODE
 Una variable CHAR(5) (CHAR(6) en C) autónoma llamada SQLSTATE

Pueden facilitarse tanto el SQLCODE como el SQLSTATE autónomos. Si se


facilita una SQLCA, no se puede facilitar ni un SQLCODE ni un SQLSTATE
autónomos. En una estructura del lenguaje principal no debe declararse
ningún SQLCODE ni SQLSTATE autónomos.

REXX y RPG facilitan automáticamente una SQLCA. En otros lenguajes, la


SQLCA puede obtenerse utilizando la sentencia INCLUDE SQLCA. INCLUDE
SQLCA no debe utilizarse si se facilita un SQLCODE o un SQLSTATE autónomo.
La SQLCA incluye una variable de entero llamada SQLCODE (SQLCOD en RPG) y
una variable de serie de caracteres llamada SQLSTATE (SQLSTT en RPG).

La opción de facilitar un SQLSTATE autónomo en lugar de una SQLCA permite


la conformidad con el estándar ISO/ANSI para SQL. La opción de facilitar
un SQLCODE autónomo en lugar de un SQLSTATE autónomo es una característica
desaprobada en el estándar ISO/ANSI para SQL. Si se desea la conformidad
con el estándar ISO/ANSI para SQL, se debe utilizar el SQLSTATE autónomo.

Subtemas
5.2.1 SQLCODE
5.2.2 SQLSTATE

© Copyright IBM Corp. 1995, 1996


5.2 - 1
DB2/400 Manual de Consulta SQL V3R7
SQLCODE
5.2.1 SQLCODE

Independientemente de si el programa de aplicación facilita o no una SQLCA


o una variable autónoma, el gestor de bases de datos establece el SQLCODE
después de la ejecución de cada sentencia SQL. DB2 para OS/400 se ajusta
al estándar ISO/ANSI para SQL de la siguiente forma:

 Si SQLCODE = 0 y SQLWARN0 está en blanco, la ejecución ha sido


satisfactoria.
 Si SQLCODE = 100, no se han encontrado datos. Por ejemplo, una
sentencia FETCH no ha devuelto ningún dato porque el cursor estaba
situado detrás de la última fila de la tabla de resultados.
 Si SQLCODE > 0 y no = 100, la ejecución ha sido satisfactoria con un
aviso.
 Si SQLCODE = 0 y SQLWARN0 = 'W', la ejecución ha sido satisfactoria
con un aviso.
 Si SQLCODE < 0, la ejecución no ha sido satisfactoria.

Se proporciona una lista completa de los SQLCODE de DB2 para OS/400 y sus
SQLSTATE correspondientes en el Apéndice B del manual DB/2 for OS/400 SQL
Programming, SC41-4611.

© Copyright IBM Corp. 1995, 1996


5.2.1 - 1
DB2/400 Manual de Consulta SQL V3R7
SQLSTATE
5.2.2 SQLSTATE

Independientemente de si el programa de aplicación facilita o no una SQLCA


o una variable autónoma, el gestor de bases de datos también establece el
SQLSTATE después de la ejecución de cada sentencia SQL. De este modo, los
programas de aplicación pueden comprobar la ejecución de las sentencias
SQL verificando cómo está el SQLSTATE en lugar de comprobar el estado del
SQLCODE.

SQLSTATE da a los programas de aplicación códigos comunes para condiciones


de error comunes. Más aún, SQLSTATE está diseñado para que los programas
de aplicación puedan comprobar errores o clases de errores específicos.
El esquema es el mismo para todos los gestores de bases de datos y está
basado en el estándar ISO/ANSI propuesto. Se proporciona una lista
completa de las clases de SQLSTATE y los SQLSTATE asociados con cada
SQLCODE en el Apéndice B del manual DB/2 for OS/400 SQL Programming,
SC41-4611.

© Copyright IBM Corp. 1995, 1996


5.2.2 - 1
DB2/400 Manual de Consulta SQL V3R7
Comentarios SQL
5.3 Comentarios SQL

Las sentencias estáticas SQL pueden contener comentarios del lenguaje


principal o del SQL. Los comentarios SQL van precedidos por dos guiones
(--).

Estas son las reglas que rigen la utilización de los comentarios SQL:

 Los dos guiones deben estar en la misma línea y no pueden ir separados


por un espacio.
 Los comentarios pueden empezar allí donde haya un espacio válido
(excepto dentro de un símbolo delimitador o entre 'EXEC' y 'SQL').
 Los comentarios no pueden continuar en la línea siguiente.
 No se pueden incluir comentarios en sentencias preparadas
dinámicamente (utilizando PREPARE o EXECUTE IMMEDIATE).
 En COBOL, los guiones deben ir precedidos por un espacio.

Subtemas
5.3.1 Ejemplo

© Copyright IBM Corp. 1995, 1996


5.3 - 1
DB2/400 Manual de Consulta SQL V3R7
Ejemplo
5.3.1 Ejemplo

El ejemplo siguiente muestra cómo incluir comentarios en una sentencia:

CREATE VIEW PRY_MAXPER -- PROYECTOS CON MAS PERSONAL DE SOPORTE


AS SELECT NUMPRO, NOMBREPRO -- NUMERO Y NOMBRE DEL PROYECTO
FROM PROYECTO
WHERE NUMDEPT = 'E21' -- COD DEPTO SOPORTE DE SISTEMAS
AND PRPERSON > 1

© Copyright IBM Corp. 1995, 1996


5.3.1 - 1
DB2/400 Manual de Consulta SQL V3R7
ALTER TABLE
5.4 ALTER TABLE

La sentencia ALTER TABLE añade, elimina o altera una columna de una tabla
existente, añade restricciones de unicidad o de referencia y añade o
elimina una clave primaria, exclusiva o foránea.

Subtemas
5.4.1 Invocación
5.4.2 Autorización
5.4.3 Sintaxis
5.4.4 Descripción
5.4.5 ADD COLUMN
5.4.6 ALTER COLUMN
5.4.7 DROP COLUMN
5.4.8 ADD Restricción-unicidad
5.4.9 ADD restricción-referencial
5.4.10 DROP
5.4.11 Notas
5.4.12 Efectos en cascada
5.4.13 Ejemplos

© Copyright IBM Corp. 1995, 1996


5.4 - 1
DB2/400 Manual de Consulta SQL V3R7
Invocación
5.4.1 Invocación

Esta sentencia puede hospedarse en un programa de aplicación o emitirse


interactivamente. Es una sentencia ejecutable que puede prepararse
dinámicamente.

© Copyright IBM Corp. 1995, 1996


5.4.1 - 1
DB2/400 Manual de Consulta SQL V3R7
Autorización
5.4.2 Autorización

Los privilegios del ID de autorización de la sentencia deben incluir al


menos uno de los privilegios siguientes:

 Para la tabla identificada en la sentencia,


- El privilegio ALTER sobre la tabla y
- La autorización del sistema *EXECUTE sobre la biblioteca que
contiene la tabla
 Autorización de administrador

El ID de autorización de la sentencia tiene el privilegio ALTER sobre la


tabla si una de las siguientes condiciones es cierta:

 Es el propietario de la tabla.
 Se le ha otorgado el privilegio ALTER para utilizar la tabla.
 Se le han otorgado las autorizaciones del sistema *OBJALTER u *OBJMGT
para utilizar la tabla

Para definir una clave foránea, los privilegios que posea el ID de


autorización de la sentencia deben incluir al menos uno de los siguientes
sobre la tabla padre:

 El privilegio REFERENCES o la autorización de gestión de objetos


correspondiente a la tabla
 La propiedad de la tabla
 Autorización de administrador

El ID de autorización de la sentencia tiene el privilegio REFERENCES sobre


la tabla cuando se cumple una de las siguientes condiciones:

 Es el propietario de la tabla.
 Se le ha otorgado el privilegio REFERENCES sobre la tabla.
 Se le han otorgado las autorizaciones del sistema *OBJREF u *OBJMGT
para la tabla.

© Copyright IBM Corp. 1995, 1996


5.4.2 - 1
DB2/400 Manual de Consulta SQL V3R7
Sintaxis
5.4.3 Sintaxis

+---------------------------------------------------------------------------------------------------------------------------+
¦ ¦
¦ <-------------------------------------------------------------------------------+ ¦
¦ +-COLUMN-+ ¦ ¦
¦ >>--ALTER TABLE--nombre-tabla-------ADD--------------definición-columna------------------------------------------------>< ¦
¦ ¦ +-COLUMN-+ <-------------------------+ (1) ¦ ¦
¦ +-ALTER--------------nombre-col----SET-----DATA TYPE--tipo-datos----------¦ ¦
¦ ¦ ¦ +-cláusula-default------¦ ¦ ¦ ¦
¦ ¦ ¦ +-NOT NULL--------------+ ¦ ¦ ¦
¦ ¦ ¦ <------------+ (2) ¦ ¦ ¦
¦ ¦ +-DROP-----DEFAULT---------------------+ ¦ ¦
¦ ¦ +-NOT NULL-+ ¦ ¦
¦ ¦ +-COLUMN-+ +-CASCADE--+ ¦ ¦
¦ +-DROP----------------nombre-col--+----------+----------------------------¦ ¦
¦ ¦ +-RESTRICT-+ ¦ ¦
¦ ¦ (3) ¦ ¦
¦ +-ADD-------restricción-unicidad------------------------------------------¦ ¦
¦ ¦ +-restricción-referencia-+ ¦ ¦
¦ ¦ +-CASCADE--+ ¦ ¦
¦ +-DROP----PRIMARY KEY----------------------------+----------+-------------+ ¦
¦ +---FOREIGN KEY----nombre-restricción-+ +-RESTRICT-+ ¦
¦ +-UNIQUE------¦ ¦
¦ +-CONSTRAINT--+ ¦
¦ ¦
¦ Notas: ¦
¦ (1) Cada una de las cláusulas solo se puede especificar una vez. Si se especifica DATA TYPE, debe especificarse en ¦
¦ primer lugar. ¦
¦ ¦
¦ (2) Cada una de las cláusulas solo se puede especificar una vez. ¦
¦ ¦
¦ (3) Si se trata de la primera cláusula de la sentencia ALTER TABLE, la palabra clave ADD es opcional, pero muy ¦
¦ aconsejable. De lo contrario, es obligatoria. ¦
¦ ¦
+---------------------------------------------------------------------------------------------------------------------------+

Figura 10. Sintaxis de Alter Table

+---------------------------------------------------------------------------------------------------------------------------+
¦ ¦
¦ ¦
¦ ¦
¦ definición-columna: ¦
¦ +--nombre-col-----------------------------------------------tipo-datos--------------------------------------------------> ¦
¦ ¦ +-COLUMN-+ ¦ ¦
¦ +-FOR--------------nombre-columna-sistema-+ ¦
¦ ¦
¦ <---------------------------------------------------------------+ ¦
¦ >-----------------------------------------------------------------------------------------------------------------------¦ ¦
¦ +-NOT NULL----------------------------------------------------¦ ¦
¦ +-cláusula-default--------------------------------------------¦ ¦
¦ +-----------------------------------------UNIQUE--------------+ ¦
¦ +-CONSTRAINT--nombre-restricción-+ ¦ +-PRIMARY KEY-+ ¦ ¦
¦ +-cláusula-references-+ ¦
¦ ¦
¦ cláusula-default: ¦
¦ +-WITH-+ ¦
¦ +------------DEFAULT----------------------------------------------------------------------------------------------------¦ ¦
¦ +-constante---------¦ ¦
¦ +-NULL--------------¦ ¦
¦ +-CURRENT_DATE------¦ ¦
¦ +-CURRENT_TIME------¦ ¦
¦ +-CURRENT_TIMESTAMP-+ ¦
¦ ¦
¦ tipo-datos: ¦
¦ +------INTEGER----------------------------------------------------------------------------------------------------------¦ ¦
¦ ¦ +-INT-----+ ¦ ¦
¦ +---SMALLINT----------------------------------------------------------------------------------¦ ¦
¦ +---DECIMAL-----------------------------------------------------------------------------------¦ ¦
¦ ¦ +-DEC-----¦ +-(--entero----------------)-+ ¦ ¦
¦ ¦ +-NUMERIC-+ +-, entero-+ ¦ ¦
¦ +---FLOAT-------------------------------------------------------------------------------------¦ ¦
¦ ¦ ¦ +-(--entero--)-+ ¦ ¦ ¦
¦ ¦ +-REAL--------------------¦ ¦ ¦
¦ ¦ ¦ +-PRECISION-+ ¦ ¦ ¦
¦ ¦ +-DOUBLE------------------+ ¦ ¦
¦ +-----CHARACTER-------------------------------------------------------------------------------¦ ¦
¦ ¦ ¦ +-CHAR------+ +-(--entero--)-+ ¦ +-FOR BIT DATA---¦ ¦ ¦
¦ ¦ +-----VARCHAR-------------------(--entero--)--------------------------+ +-FOR SBCS DATA--¦ ¦ ¦
¦ ¦ ¦ +---CHARACTER----VARYING-+ ¦ +-cláusula-allocate-+ +-FOR MIXED DATA-¦ ¦ ¦
¦ ¦ ¦ +-CHAR------+ ¦ +-CCSID--entero--+ ¦ ¦
¦ ¦ +-LONG VARCHAR-----------------------------+ ¦ ¦
¦ +-----GRAPHIC---------------------------------------------------------------------------------¦ ¦
¦ ¦ ¦ +-(--entero--)-+ ¦ +-CCSID--entero-+ ¦ ¦
¦ ¦ +-----VARGRAPHIC---------(--entero--)--------------------------+ ¦ ¦
¦ ¦ ¦ +-GRAPHIC VARYING-+ ¦ +-cláusula-allocate-+ ¦ ¦
¦ ¦ +-LONG VARGRAPHIC-------------------+ ¦ ¦
¦ +---DATE--------------------------------------------------------------------------------------¦ ¦
¦ +---TIME--------------------------------------------------------------------------------------¦ ¦
¦ +---TIMESTAMP---------------------------------------------------------------------------------+ ¦
¦ ¦
¦ cláusula-allocate: ¦
¦ +--ALLOCATE--(entero)---------------------------------------------------------------------------------------------------¦ ¦
¦ ¦

© Copyright IBM Corp. 1995, 1996


5.4.3 - 1
DB2/400 Manual de Consulta SQL V3R7
Sintaxis
¦ ¦
+---------------------------------------------------------------------------------------------------------------------------+

+------------------------------------------------------------------------+
¦ ¦
¦ ¦
¦ restricción-unicidad: ¦
¦ +----------------------------------------UNIQUE---------(------------> ¦
¦ +-CONSTRAINT--nombre-restricción-+ +-PRIMARY KEY-+ ¦
¦ ¦
¦ <-,----------+ ¦
¦ >----nombre-col----)-------------------------------------------------¦ ¦
¦ ¦
¦ restricción-referencia: ¦
¦ (1) ¦
¦ +--------------------------------------FOREIGN KEY-------------------> ¦
¦ +-CONSTRAINT--nombre-restricción-+ ¦
¦ ¦
¦ <-,----------+ ¦
¦ >--(----nombre-col----)--cláusula-references-------------------------¦ ¦
¦ ¦
¦ cláusula-references: ¦
¦ +--REFERENCES--nombre-tabla------------------------------------------> ¦
¦ ¦ <-,----------+ ¦ ¦
¦ +-(----nombre-col----)-+ ¦
¦ ¦
¦ (2) ¦
¦ +-ON DELETE NO ACTION--------+ +-ON UPDATE NO ACTION-+ ¦
¦ >--+----------------------------+--+---------------------+-----------¦ ¦
¦ +-ON DELETE----RESTRICT------+ +-ON UPDATE RESTRICT--+ ¦
¦ +-CASCADE-----¦ ¦
¦ +-SET NULL----¦ ¦
¦ +-SET DEFAULT-+ ¦
¦ ¦
¦ Notas: ¦
¦ ¦
¦ (1) Por motivos de compatibilidad con otros productos, puede ¦
¦ especificarse nombre-restricción (sin la palabra clave ¦
¦ CONSTRAINT) a continuación de FOREIGN KEY. ¦
¦ ¦
¦ (2) Las cláusulas ON DELETE y ON UPDATE pueden especificarse en ¦
¦ cualquier orden. ¦
¦ ¦
¦ ¦
¦ ¦
¦ ¦
+------------------------------------------------------------------------+

© Copyright IBM Corp. 1995, 1996


5.4.3 - 2
DB2/400 Manual de Consulta SQL V3R7
Descripción
5.4.4 Descripción

nombre-tabla
Identifica la tabla que desea alterar. El nombre-tabla debe
identificar una tabla que exista en el servidor actual. No debe ser
una vista o una tabla del catálogo.

© Copyright IBM Corp. 1995, 1996


5.4.4 - 1
DB2/400 Manual de Consulta SQL V3R7
ADD COLUMN
5.4.5 ADD COLUMN

definición-columna
Añade una columna a la tabla. Si la tabla tiene filas, cada uno de
los valores de la columna se establece en su valor por omisión. Si
anteriormente la tabla tenía n columnas, el ordinal de la nueva
columna es n+1. El valor de n no debe ser mayor que 8000.

La adición de una nueva columna no debe provocar que el recuento total


de bytes de todas las columnas sea mayor que 32766 o, si se especifica
una columna VARCHAR, 32740.

nombre-columna
Da nombre a la columna que desea añadir a la tabla. No utilice el
mismo nombre para más de una columna de la tabla o para un
nombre-columna-sistema de la tabla. No califique el
nombre-columna.

FOR COLUMN nombre-columna-sistema


Proporciona un nombre del OS/400 para la columna. No utilice el
mismo nombre para más de un nombre-columna o
nombre-columna-sistema de la tabla.

Si no se especifica el nombre-columna-sistema y el nombre-columna


no es un nombre-columna-sistema válido, se genera un nombre de
columna del sistema. Para obtener más información acerca de cómo
se generan los nombres de columna del sistema, consulte el
apartado "Reglas para la generación de nombres de columna" en el
tema 5.16.10.1.

tipo-datos
Especifica el tipo de datos de la columna. Consulte el apartado
"CREATE TABLE" en el tema 5.16 para obtener una descripción de
tipo-datos.

NOT NULL
Impide que la columna contenga valores nulos. La omisión de NOT
NULL implica que la columna puede contener valores nulos. Si se
especifica NOT NULL, DEFAULT también debe especificarse.

DEFAULT
Especifica un valor por omisión para la columna. Esta cláusula no
| se puede especificar más de una vez en la definición-columna. Si
| no se especifica ningún valor y la columna puede ser nula, el
| valor por omisión es el valor nulo. Si no se especifica ningún
| valor y la columna no puede ser nula, el valor por omisión depende
| del tipo de datos de la columna:

Tipo de datos Valor por omisión


Numérico 0
Serie de longitud fija Blancos
Serie de longitud variable Una serie de longitud 0
Fecha Para las filas existentes, una fecha
correspondiente al 1 de enero 0001.
Para las filas añadidas, la fecha
actual.
Hora Para las filas existentes, una hora
correspondiente a las 0 horas, 0
minutos y 0 segundos. Para las
filas añadidas, la hora actual.
Indicación de la hora Para las filas existentes, una fecha
correspondiente al 1 de enero 0001 y
una hora correspondiente a las 0
horas, 0 minutos, 0 segundos y 0
microsegundos. Para las filas
añadidas, la indicación de la hora
actual.

La omisión de NOT NULL y DEFAULT de una definición-columna es una


especificación implícita de DEFAULT NULL.

constante
Especifica la constante como el valor por omisión de la
columna. La constante especificada debe representar un valor
que puede asignarse a la columna según las reglas de
asignación, tal como se describen en el apartado "Asignaciones
| y comparaciones" en el tema 2.7. No se debe utilizar una
| constante de coma flotante para una columna SMALLINT, INTEGER,
| DECIMAL o NUMERIC. Una constante decimal no debe contener más
| digitos a la derecha de la coma decimal que la escala
| especificada de la columna.

NULL
Especifica el valor nulo como el valor por omisión de la
columna. Si se especifica NOT NULL, no se debe especificar
| DEFAULT NULL en la misma definición-columna.

CURRENT_DATE
Especifica la fecha actual como el valor por omisión para la
columna. Si se especifica CURRENT_DATE, el tipo de datos de
la columna debe ser DATE.

CURRENT_TIME
Especifica la hora actual como el valor por omisión para la
columna. Si se especifica CURRENT_TIME, el tipo de datos de
la columna debe ser TIME.

CURRENT_TIMESTAMP

© Copyright IBM Corp. 1995, 1996


5.4.5 - 1
DB2/400 Manual de Consulta SQL V3R7
ADD COLUMN
Especifica la indicación de la hora actual como el valor por
omisión para la columna. Si se especifica CURRENT_TIMESTAMP,
el tipo de datos de la columna debe ser TIMESTAMP.

CONSTRAINT nombre-restricción
Da nombre a la restricción. Un nombre-restricción no debe
identificar una restricción que ya exista en el servidor actual.

Si no se especifica la cláusula, el gestor de bases de datos


genera un nombre de restricción de unicidad.

PRIMARY KEY
Constituye un método abreviado de definir una clave primaria
compuesta de una sola columna. Así pues, si se especifica PRIMARY
KEY en la definición de la columna C, el efecto es el mismo que si
especificase PRIMARY KEY(C) como cláusula aparte.

Con esta cláusula debe especificarse también la cláusula NOT NULL.


Esta cláusula no debe especificarse en más de una
| definición-columna ni debe especificarse en absoluto si se se
especifica la cláusula UNIQUE en la definición de columna.

UNIQUE
Constituye un método abreviado de definir una clave exclusiva
compuesta de una sola columna. Por tanto, si se especifica UNIQUE
en la definición de la columna C, el efecto es el mismo que si se
especificase la cláusula UNIQUE(C) como cláusula aparte.

Esta cláusula no puede especificarse más de una vez en una


definición de columna y no debe especificarse si se especifica
| PRIMARY KEY en la definición-columna.

cláusula-references
La cláusula-references de una definición-columna constituye un
método abreviado de definir una clave foránea compuesta de una
sola columna. Así pues, si se especifica cláusula-references en
la definición de la columna C, el efecto es el mismo que si
especificase dicha cláusula-references como parte de una cláusula
FOREIGN KEY en la que C fuese la única columna identificada.

© Copyright IBM Corp. 1995, 1996


5.4.5 - 2
DB2/400 Manual de Consulta SQL V3R7
ALTER COLUMN
5.4.6 ALTER COLUMN

Altera la definición de una columna existente. Sólo se alterarán los


atributos especificados. Los otros permanecerán sin cambios.

nombre-col
Identifica la columna que se va a alterar. El nombre de la columna no
debe calificarse. El nombre debe identificar una columna de la tabla
especificada. El nombre no debe identificar una columna que ya se
haya añadido o eliminado en esta sentencia ALTER TABLE.

SET DATA TYPE tipo-datos


Especifica el nuevo tipo de datos de la columna que se va a alterar.
El nuevo tipo de datos debe ser compatible con el tipo de datos
existente de la columna. Para obtener más información acerca de la
compatibilidad de los tipos de datos consulte el apartado
"Asignaciones y comparaciones" en el tema 2.7. Sin embargo, existen
dos excepciones a las reglas generales:

 Se permite modificar los tipos de datos entre carácter y gráficos


UCS-2.
 No se permite modificar los tipos de datos de fecha y hora a
carácter.

La longitud, precisión y escala especificadas pueden ser mayores,


menores o iguales que la longitud, precisión y escala existentes. Sin
embargo, si la nueva longitud, precisión o escala es menor, se pueden
producir errores de conversión numérica o truncamiento (sin aviso.)

Si la columna especificada tiene un valor por omisión y no se


especifica un nuevo valor por omisión, el valor por omisión existente
debe representar un valor que pueda asignarse a la columna según las
reglas de la asignación, tal como se describen en el apartado
"Asignaciones y comparaciones" en el tema 2.7.

Si la columna se especifica en una clave exclusiva, primaria o


foránea, la nueva suma de las longitudes de las columnas de las claves
no debe sobrepasar 2000-n, donde n es el número de columnas
especificadas que permiten nulos.

Cambiar los atributos provocará que todos los valores existentes de la


columna se conviertan en los nuevos atributos de columna según las
reglas para la asignación a una columna, a excepción de los valores de
serie, que se truncarán (sin aviso).

SET cláusula-default
Especifica el nuevo valor por omisión de la columna que se va a
alterar. El valor por omisión especificado debe representar un valor
que pueda asignarse a la columna según las reglas para la asignación,
tal como se describen en el apartado "Asignaciones y comparaciones" en
el tema 2.7.

SET NOT NULL


Especifica que la columna no puede contener valores nulos. Todos los
valores para esta columna en filas existentes de la tabla no deben ser
nulos. Si la columna especificada tiene un valor por omisión y no se
especifica un nuevo valor por omisión, el valor por omisión existente
no debe ser NULL. No se permite SET NOT NULL si la columna se
identifica en la clave foránea de una restricción de referencia con
una regla DELETE de SET NULL, y en la clave foránea no existen más
columnas que puedan contener nulos.

DROP DEFAULT
Elimina el valor por omisión actual para la columna. La columna
especificada debe tener un valor por omisión y no debe tener NOT NULL
como el atributo nulo. El nuevo valor por omisión es el valor nulo.

DROP NOT NULL


Elimina el atributo NOT NULL de la columna, permitiendo que la columna
tenga el valor nulo. Si no se especifica un valor por omisión o
todavía no existe, el nuevo valor por omisión es el valor nulo. No se
permite DROP NOT NULL si la columna se especifica en la clave primaria
de la tabla.

© Copyright IBM Corp. 1995, 1996


5.4.6 - 1
DB2/400 Manual de Consulta SQL V3R7
DROP COLUMN
5.4.7 DROP COLUMN

Elimina la columna identificada de la tabla.

nombre-col
Identifica la columna que se va a eliminar. El nombre de la columna
no debe calificarse. El nombre debe identificar una columna de la
tabla especificada. El nombre no debe identificar una columna que ya
se haya añadido o alterado en esta sentencia ALTER TABLE. El nombre
no debe identificar la única columna de una tabla.

CASCADE
Especifica que también se eliminan todas las vistas, índices o
restricciones que son dependientes de la columna que se elimina.

RESTRICT
Especifica que la columna no se puede eliminar si existen vistas,
índices o restricciones dependientes de la columna.

Si todas las columnas a las que se hace referencia en una restricción


se eliminan en la misma sentencia ALTER TABLE, RESTRICT no impide la
eliminación.

© Copyright IBM Corp. 1995, 1996


5.4.7 - 1
DB2/400 Manual de Consulta SQL V3R7
ADD Restricción-unicidad
5.4.8 ADD Restricción-unicidad

CONSTRAINT nombre-restricción
Da nombre a la restricción. Un nombre-restricción no debe identificar
una restricción que ya exista en el servidor actual. El
nombre-restricción debe ser exclusivo dentro de una colección.

Si no se especifica, el gestor de bases de datos generará un nombre de


restricción de unicidad.

UNIQUE(nombre-col,...)
Define una clave exclusiva compuesta por las columnas identificadas.
Cada nombre-col debe ser un nombre no calificado que identifique una
columna de la tabla. La misma columna no debe identificarse más de
una vez. El número de columnas identificadas no debe pasar de 120 y
la suma de sus longitudes no debe ser superior a 2000-n, donde n es el
número de columnas especificadas que permiten nulos. Las columnas
identificadas no pueden ser las mismas que las especificadas en otra
restricción UNIQUE o PRIMARY KEY de la tabla. UNIQUE(A,B), por
ejemplo, no está permitido si UNIQUE(B,A) o PRIMARY KEY(A,B) ya
existen en la tabla. Cualquier valor no nulo existente en el conjunto
de columnas debe ser exclusivo. Está permitido que existan varios
valores nulos.

Si ya existe un índice exclusivo en las columnas identificadas, dicho


índice se designa como índice exclusivo. De lo contrario, se creará
un índice exclusivo para dar soporte a la exclusividad de la clave
exclusiva. El índice exclusivo se crea como parte del archivo físico
AS/400, y no como un archivo lógico AS/400 separado.

PRIMARY KEY(nombre-col,...)
Define una clave primaria compuesta por las columnas identificadas.
Cada nombre-col debe ser un nombre no calificado que identifique una
columna de la tabla. La misma columna no debe identificarse más de
una vez. El número de columnas identificadas no debe pasar de 120 y
la suma de sus longitudes no debe ser superior a 2000. La tabla no
debe tener ya una clave primaria. Las columnas identificadas no
pueden ser las mismas que las especificadas en otra restricción UNIQUE
o PRIMARY KEY de la tabla. PRIMARY KEY(A,B), por ejemplo, no está
permitido si UNIQUE(B,A) ya existe en la tabla. Las columnas
identificadas no deben definirse como NOT NULL. Cualquier valor
existente en el conjunto de columnas debe ser exclusivo.

Si ya existe un índice exclusivo en las columnas identificadas, dicho


índice se designa como índice primario. Si no es así, se creará un
índice primario para dar soporte a la exclusividad de la clave
exclusiva. El índice exclusivo se crea como parte del archivo físico
AS/400, y no como un archivo lógico AS/400 separado.

© Copyright IBM Corp. 1995, 1996


5.4.8 - 1
DB2/400 Manual de Consulta SQL V3R7
ADD restricción-referencial
5.4.9 ADD restricción-referencial

CONSTRAINT nombre-restricción
Da nombre a la restricción. Un nombre-restricción no debe identificar
una restricción que ya exista en el servidor actual.

Si no se especifica, el gestor de bases de datos generará un nombre de


restricción de unicidad.

FOREIGN KEY
Define una restricción de referencia.

Sea T1 la tabla que se altera.

(nombre-col,...)
La clave foránea de la restricción de referencia está compuesta
por las columnas identificadas. Cada nombre-col debe ser un
nombre no calificado que identifique una columna de T1. La misma
columna no debe identificarse más de una vez. El número de
columnas identificadas no debe pasar de 120 y la suma de sus
longitudes no debe ser superior a 2000-n, donde n es el número de
columnas especificadas que permiten nulos.

REFERENCES nombre-tabla
El nombre-tabla especificado en una cláusula REFERENCES debe
identificar una tabla base que exista en el servidor actual, pero
no debe identificar ninguna tabla del catálogo. Se hace
referencia a esta tabla como la tabla padre de la relación de
restricción.

Una restricción de referencia es un duplicado si su clave foránea,


clave padre y tabla padre son las mismas que las de una
restricción de referencia existente. Las restricciones de
referencia duplicadas están permitidas, pero no son aconsejables.

Sea T2 la tabla padre identificada.

(nombre-col,...)
La clave padre de la restricción de referencia está compuesta por
las columnas especificadas. Cada nombre-col debe ser un nombre no
calificado que identifique una columna de T2. La misma columna no
debe identificarse más de una vez. El número de columnas
identificadas no debe pasar de 120 y la suma de sus longitudes no
debe ser superior a 2000-n, donde n es el número de columnas
especificadas que permiten nulos.

La lista de nombres de columna debe ser idéntica a la lista de


nombres de columna de la clave primaria de T2 o de una restricción
UNIQUE que exista en T2. Los nombres se pueden especificar en
cualquier orden. Por ejemplo, si se especifica (A,B), una
restricción de unicidad definida como UNIQUE(B,A) satisface el
requisito. Si no se especifica ninguna lista de nombres de
columna, T2 debe tener una clave primaria. La omisión de la lista
de nombres de columna es una especificación implícita de las
columnas de la clave primaria.

La clave foránea especificada debe tener el mismo número de


columnas que la clave padre de T2. La descripción de la enésima
columna de la clave foránea y la enésima columna de la clave padre
deben tener tipos de datos y longitudes idénticos.

A menos que la tabla esté vacía, los valores de la clave foránea deben
validarse antes de utilizar la tabla. Los valores de la clave foránea
se validan durante la ejecución de la sentencia ALTER TABLE. Por lo
tanto, cada uno de los valores no nulos de la clave foránea debe
coincidir con algún valor de la clave padre de T2.

La restricción de referencia especificada por la cláusula FOREIGN KEY


define una relación en la que T2 es la tabla padre y T1 la
dependiente.

ON DELETE
Especifica la acción que ha de llevarse a cabo en las tablas
dependientes cuando se suprime una fila de la tabla padre.

No debe especificarse SET NULL a menos que alguna columna de la


clave foránea permita los valores nulos.

No debe especificarse CASCADE si T1 tiene un desencadenante de


supresión. No deben especificarse SET NULL ni SET DEFAULT si T1
tiene un desencadenante de actualización.

La regla de supresión se aplica cuando una fila de T2 es objeto de


una operación DELETE o de supresión propagada y dicha fila tiene
dependientes en T1. Sea p dicha fila de T2.

 Si se especifica RESTRICT o NO ACTION, se produce un error y


no se suprime ninguna fila.
 Si se especifica CASCADE, la operación de supresión se propaga
a las dependientes de p en T1.
 Si se especifica SET NULL, cada columna que permite nulos en
la clave foránea de cada dependiente de p en T1 queda
establecida en el valor nulo.
 Si se especifica SET DEFAULT, cada columna de la clave foránea
de cada dependiente de p en T1 queda establecida en su valor
por omisión.

© Copyright IBM Corp. 1995, 1996


5.4.9 - 1
DB2/400 Manual de Consulta SQL V3R7
ADD restricción-referencial

ON UPDATE
Especifica la acción que ha de llevarse a cabo en las tablas
dependientes cuando se actualiza una fila de la tabla padre.

La regla de actualización se aplica cuando una fila de T2 es


objeto de una operación UPDATE o de actualización propagada y
dicha fila tiene dependientes en T1. Sea p dicha fila de T2.

 Si se especifica RESTRICT o NO ACTION, se produce un error y


no se actualiza ninguna fila.

© Copyright IBM Corp. 1995, 1996


5.4.9 - 2
DB2/400 Manual de Consulta SQL V3R7
DROP
5.4.10 DROP

PRIMARY KEY
Elimina la definición de la clave primaria y todas las restricciones
de referencia de las que la clave primaria sea una clave padre. La
tabla debe tener una clave primaria.

FOREIGN KEY nombre-restricción


Elimina la restricción de referencia nombre-restricción. El
nombre-restricción debe identificar una restricción de referencia en
la que la tabla sea una tabla dependiente.

UNIQUE nombre-restricción
Elimina la restricción exclusiva nombre-restricción y todas las
restricciones de referencia en las que la clave exclusiva sea una
clave padre. El nombre-restricción debe identificar una restricción
exclusiva sobre la tabla. DROP UNIQUE no eliminará ninguna
restricción de unicidad PRIMARY KEY.

CONSTRAINT nombre-restricción
Elimina la restricción nombre-restricción. Si la restricción es una
restricción PRIMARY KEY o UNIQUE, también se eliminarán todas las
restricciones en las que la clave primaria o exclusiva sea una clave
padre. El nombre-restricción debe identificar una restricción
exclusiva sobre la tabla.

CASCADE
Especifica, para restricciones de unicidad, que también se eliminan
todas las restricciones de referencia que son dependientes de la
restricción que se elimina.

RESTRICT
Especifica, para restricciones de unicidad, que la restricción no se
puede eliminar si existen restricciones de referencia dependientes de
la restricción.

© Copyright IBM Corp. 1995, 1996


5.4.10 - 1
DB2/400 Manual de Consulta SQL V3R7
Notas
5.4.11 Notas

Sólo se puede hacer referencia a una columna una vez en una cláusula ADD,
ALTER o DROP COLUMN de una única sentencia ALTER TABLE. Sin embargo, se
puede hacer múltiples referencias a esa misma columna para añadir o
eliminar restricciones en la misma sentencia ALTER TABLE.

El orden de operaciones dentro de una sentencia ALTER TABLE es:

 eliminar restricciones

 eliminar columnas para las que se haya especificado la opción RESTRICT

 alterar todas las demás definiciones de columna (esto incluye añadir y


eliminar las columnas para las que se ha especificado la opción
CASCADE)

 añadir restricciones

En cada una de estas etapas, el orden en que el usuario especifica las


cláusulas es el orden en que se ejecutan, con una excepción. Si se
elimina alguna columna, dicha operación se realiza de forma lógica antes
de añadir o alterar definiciones de columna, en caso de que la longitud de
registro se incremente como resultado de la sentencia ALTER TABLE.

Se eliminarán todas las vistas o archivos lógicos de otra QTEMP de trabajo


que sean dependientes de la tabla que se altera, como resultado de una
sentencia ALTER TABLE.

La comprobación de autorización sólo se lleva a cabo en la tabla que se


altera. Se puede acceder a otros objetos mediante la sentencia ALTER
TABLE, pero no es necesaria autorización para dichos objetos. Por
ejemplo, no se necesita autorización para las vistas que existen en la
tabla que se altera, ni para las tablas dependientes que hacen referencia
a la tabla que se altera mediante una restricción de referencia.

Es muy aconsejable que exista una copia de seguridad actual de la tabla,


las vistas dependientes y los archivos lógicos antes de alterar una tabla.

© Copyright IBM Corp. 1995, 1996


5.4.11 - 1
DB2/400 Manual de Consulta SQL V3R7
Efectos en cascada
5.4.12 Efectos en cascada

La adición de una columna no tiene efectos en cascada para las vistas SQL
o la mayoría de archivos lógicos. (22) Por ejemplo, la adición de una
columna a una tabla no provoca que se añada la columna a las vistas
dependientes, incluso si dichas vistas se crearon con una cláusula SELECT
*.

Eliminar o alterar una columna puede provocar varios efectos en cascada.


La Tabla 8 lista los efectos en cascada de eliminar una columna.

+------------------------------------------------------------------------+
¦ Tabla 8. Efectos en cascada de eliminar una columna ¦
+------------------------------------------------------------------------¦
¦ Operación ¦ Efecto RESTRICT ¦ Efecto CASCADE ¦
+-------------+-----------------------------+----------------------------¦
¦ Eliminación ¦ No se permite la ¦ Se elimina la vista y ¦
¦ de una ¦ eliminación de la columna. ¦ todas las vistas ¦
¦ columna a ¦ ¦ dependientes de esa vista. ¦
¦ la que una ¦ ¦ ¦
¦ vista hace ¦ ¦ ¦
¦ referencia ¦ ¦ ¦
+-------------+-----------------------------+----------------------------¦
¦ Eliminación ¦ Se permite la eliminación ¦ Se elimina el índice. ¦
¦ de una ¦ del índice a menos que lo ¦ ¦
¦ columna a ¦ utilice una restricción que ¦ ¦
¦ la que un ¦ no se pueda eliminar. ¦ ¦
¦ índice hace ¦ ¦ ¦
¦ referencia ¦ ¦ ¦
+-------------+-----------------------------+----------------------------¦
¦ Eliminación ¦ Si todas las columnas a las ¦ Se elimina la restricción ¦
¦ de una ¦ que se hace referencia en ¦ de unicidad, al igual que ¦
¦ columna a ¦ la restricción de unicidad ¦ todas las restricciones de ¦
¦ la que se ¦ se eliminan en la misma ¦ referencia que hagan ¦
¦ hace ¦ sentencia ALTER COLUMN, y ¦ referencia a dicha ¦
¦ referencia ¦ una restricción de ¦ restricción de unicidad. ¦
¦ en una ¦ referencia no hace ¦ (Por tanto, también se ¦
¦ restricción ¦ referencia a la restricción ¦ eliminan todos los índices ¦
¦ de unicidad ¦ de unicidad, se eliminan ¦ utilizados por dichas ¦
¦ ¦ las columnas y la ¦ restricciones). ¦
¦ ¦ restricción. (Por tanto, ¦ ¦
¦ ¦ también se elimina el ¦ ¦
¦ ¦ índice utilizado para ¦ ¦
¦ ¦ satisfacer la restricción.) ¦ ¦
¦ ¦ Por ejemplo, si se elimina ¦ ¦
¦ ¦ la columna A, y existe una ¦ ¦
¦ ¦ restricción de unicidad de ¦ ¦
¦ ¦ UNIQUE(A) o PRIMARY KEY(A) ¦ ¦
¦ ¦ y ninguna restricción de ¦ ¦
¦ ¦ referencia hace referencia ¦ ¦
¦ ¦ a la restricción de ¦ ¦
¦ ¦ unicidad, se permite la ¦ ¦
¦ ¦ operación. ¦ ¦
¦ ¦ ¦ ¦
¦ ¦ De lo contrario, no se ¦ ¦
¦ ¦ permite la eliminación de ¦ ¦
¦ ¦ la columna. ¦ ¦
+-------------+-----------------------------+----------------------------¦
¦ Eliminación ¦ Si todas las columnas a las ¦ Se elimina la restricción ¦
¦ de una ¦ que se hace referencia en ¦ de referencia. (Por ¦
¦ columna a ¦ la restricción de ¦ tanto, también se elimina ¦
¦ la que se ¦ referencia se eliminan al ¦ el índice utilizado por la ¦
¦ hace ¦ mismo tiempo, se eliminan ¦ clave foránea.) ¦
¦ referencia ¦ las columnas y la ¦ ¦
¦ en una ¦ restricción. (Por tanto, ¦ ¦
¦ restricción ¦ también se elimina el ¦ ¦
¦ de ¦ índice utilizado por la ¦ ¦
¦ referencia ¦ clave foránea.) Por ¦ ¦
¦ ¦ ejemplo, si se elimina la ¦ ¦
¦ ¦ columna B y existe una ¦ ¦
¦ ¦ restricción de referencia ¦ ¦
¦ ¦ de FOREIGN KEY (A), se ¦ ¦
¦ ¦ permite la operación. ¦ ¦
¦ ¦ ¦ ¦
¦ ¦ De lo contrario, no se ¦ ¦
¦ ¦ permite la eliminación de ¦ ¦
¦ ¦ la columna. ¦ ¦
+------------------------------------------------------------------------+

La Tabla 9 lista los efectos en cascada de alterar una columna. (Alterar


una columna en el siguiente diagrama significa alterar un tipo de datos,
la precisión, la escala, la longitud o la característica de permitir
nulos.)

+------------------------------------------------------------------------+
¦ Tabla 9. Efectos en cascada de alterar una columna ¦
+------------------------------------------------------------------------¦
¦ Operación ¦ Efecto ¦
+-------------+----------------------------------------------------------¦
+-------------+----------------------------------------------------------¦
¦ Alteración ¦ Se permite la alteración. ¦
¦ de una ¦ ¦
¦ columna a ¦ Se volverán a crear las vistas que son dependientes de ¦
¦ la que una ¦ la tabla. Se utilizarán los nuevos atributos de columna ¦
¦ vista hace ¦ cuando se vuelvan a crear las vistas. ¦
¦ referencia ¦ ¦
+-------------+----------------------------------------------------------¦
¦ Alteración ¦ Se permite la alteración. (Por tanto, se suprime y se ¦

© Copyright IBM Corp. 1995, 1996


5.4.12 - 1
DB2/400 Manual de Consulta SQL V3R7
Efectos en cascada
¦ de una ¦ vuelve a crear el índice utilizado para satisfacer la ¦
¦ columna a ¦ restricción.) ¦
¦ la que un ¦ ¦
¦ índice hace ¦ ¦
¦ referencia ¦ ¦
+-------------+----------------------------------------------------------¦
¦ Alteración ¦ Se permite la alteración. (Por tanto, se suprime y se ¦
¦ de una ¦ vuelve a crear el índice utilizado para satisfacer la ¦
¦ columna a ¦ restricción.) ¦
¦ la que se ¦ ¦
¦ hace ¦ Si una restricción de referencia hace referencia a la ¦
¦ referencia ¦ restricción de unicidad, los atributos de la clave ¦
¦ en una ¦ foránea ya no coinciden con los atributos de la ¦
¦ restricción ¦ restricción de unicidad. La restricción se colocará en ¦
¦ de unicidad ¦ un estado definido y pendiente de comprobación. ¦
+-------------+----------------------------------------------------------¦
¦ Alteración ¦ Se permite la alteración. ¦
¦ de una ¦ ¦
¦ columna a ¦  Si la restricción de referencia está en el estado ¦
¦ la que se ¦ definido pero pendiente de comprobación, se permite ¦
¦ hace ¦ la alteración y se realiza un intento de poner la ¦
¦ referencia ¦ restricción en el estado habilitado. (Por tanto, se ¦
¦ en una ¦ suprime y se vuelve a crear el índice utilizado para ¦
¦ restricción ¦ satisfacer la restricción de unicidad.) ¦
¦ de ¦ ¦
¦ referencia ¦  Si la restricción de referencia está en el estado ¦
¦ ¦ habilitado, la restricción se coloca en el estado ¦
¦ ¦ definido y pendiente de comprobación. ¦
+------------------------------------------------------------------------+

(22) Se añadirá también una columna a un archivo lógico que


compar