Notas del release
Añada la nota siguiente a este apartado del Capítulo 3:
Los nombres siguientes, si se utilizan en el contexto de
Procedimientos SQL, están limitados a los caracteres permitidos en
un identificador ordinario, aunque los nombres estén delimitados:
- nombre-condición
- etiqueta
- nombre-parámetro
- nombre-procedimiento
- nombre-variable-SQL
- nombre-sentencia
Se ha cambiado un párrafo de esta sección, que ahora es así:
Observe que el tamaño de un parámetro de URL o resultado de función
es el mismo en la entrada y en la salida, y está limitado por la
longitud de la columna DATALINK.
Pero en algunos casos, el valor de URL devuelto tiene asociado un
símbolo de acceso.
En las situaciones en las que esto sea posible, la ubicación de salida
debe tener suficiente espacio de almacenamiento para el símbolo de
acceso y la longitud de la columna DATALINK. Por tanto, la longitud
real del comentario y del URL en su forma totalmente ampliada que se
proporciona en la entrada debe estar limitada para que se ajuste al
espacio de almacenamiento de salida. Si se excede la longitud
restringida, se produce un error.
El diagrama de sintaxis se ha cambiado a lo siguiente:
.-operador-------------------------------------.
V |
>>----+-----+---+-función----------------------+--+------------><
+- + -+ +-(expresión)------------------+
'- - -' +-constante--------------------+
+-nombre-columna---------------+
+-variable-lenguaje-principal--+
+-registro-especial------------+
+-(selección-completa-escalar)-+
+-duración-etiquetada----------+
+-expresión-case---------------+
+-especificación-cast----------+
+-operación-desreferencia------+
+-función-OLAP-----------------+
+-invocación-método------------+
+-tratamiento-subtipos---------+
'-referencia-secuencia---------'
operador
(1)
|---+-CONCAT------+---------------------------------------------|
+- / ---------+
+- * ---------+
+- + ---------+
'- - ---------'
Notas:
- Se puede utilizar | como sinónimo de CONCAT.
Lo siguiente representa una corrección a la sección "Funciones de OLAP" del
apartado "Expresiones" del Capítulo 3.
función-agregación
|--función-columna--OVER---------------------------------------->
>----(--+---------------------------------+--------------------->
'-| cláusula-partición-ventana |--'
>----+-------------------------------------------------------------------------+>
'-| cláusula-orden-ventana |--+----------------------------------------+--'
'-| cláusula-grupo-agregación-ventana |--'
>---------------------------------------------------------------|
cláusula-orden-ventana
.-,-----------------------------------------------------.
V .-| opción asc |---. |
|---ORDER BY-----expresión-clave-clasificación--+------------------+--+->
'-| opción desc |--'
>---------------------------------------------------------------|
opción asc
.-NULLS LAST--.
|---ASC--+-------------+----------------------------------------|
'-NULLS FIRST-'
opción desc
.-NULLS FIRST--.
|---DESC--+--------------+--------------------------------------|
'-NULLS LAST---'
cláusula-grupo-agregación-ventana
|---+-ROWS--+---+-| inicio-grupo |-+----------------------------|
'-RANGE-' +-| entre-grupo |--+
'-| fin-grupo |----'
fin-grupo
|---+-UNBOUNDED FOLLOWING-------------+-------------------------|
'-constante-sin-signo--FOLLOWING--'
En la descripción de cláusula-orden-ventana:
- NULLS FIRST
- El orden de la ventana considera los valores nulos antes que todos los
valores no nulos en el orden de clasificación.
- NULLS LAST
- El orden de la ventana considera los valores nulos después de todos los
valores no nulos en el orden de clasificación.
En la descripción de cláusula-grupo-agregación-ventana:
- cláusula-grupo-agregación-ventana
- El grupo de agregación de una fila R es un conjunto de filas, definido en
relación a R en la ordenación de las filas de la partición de R. Esta
cláusula especifica el grupo de agregación. Si no se especifica esta
cláusula, el valor por omisión es igual que el de RANGE BETWEEN UNBOUNDED
PRECEDING AND CURRENT ROW, siempre que se produzca una agregación
acumulativa.
- ROWS
- Indica que el grupo de agregación se define contando filas.
- RANGE
- Indica que el grupo de agregación se define mediante un desplazamiento
desde una clave de clasificación.
- inicio-grupo
- Especifica el punto inicial del grupo de agregación. El final del
grupo de agregación es la fila actual. El hecho de especificar la
cláusula de inicio-grupo es equivalente a una cláusula entre-grupo con formato
"BETWEEN inicio-grupo AND CURRENT ROW".
- entre-grupo
- Especifica el inicio y el fin del grupo de agregación en base a ROWS o
RANGE.
- fin-grupo
- Especifica el punto final del grupo de agregación. El inicio del
grupo de agregación es la fila actual. El hecho de especificar la
cláusula fin-grupo es equivalente a una cláusula entre-grupo
con formato "BETWEEN CURRENT ROW AND fin-grupo".
- UNBOUNDED PRECEDING
- Incluye la partición completa que precede a la fila actual. Se
puede especificar con ROWS o RANGE. Asimismo, se puede especificar con
varias expresiones-clave-clasificación en la cláusula-orden-ventana.
- UNBOUNDED FOLLOWING
- Incluye la partición completa que sigue a la fila actual. Se puede
especificar con ROWS o RANGE. Asimismo, se puede especificar con varias
expresiones-clave-clasificación en la cláusula-orden-ventana.
- CURRENT ROW
- Especifica el inicio o el final del grupo de agregación en base a la fila
actual. Si se especifica ROWS, la fila actual es el límite del grupo de
agregación. Si se especifica RANGE, el límite del grupo de agregación
incluye el conjunto de filas que tienen para las
expresiones-clave-clasificación valores iguales a los de la fila
actual. Esta cláusula no se puede especificar en
vinculación2-grupo si vinculación1-grupo especifica
valor FOLLOWING.
- valor PRECEDING
- Especifica el rango o número de filas que preceden a la fila
actual. Si se especifica ROWS, valor es un entero positivo que
indica un número de filas. Si se especifica RANGE, el tipo de datos de
valor debe ser comparable al tipo de la expresión-clave-clasificación
de la cláusula-orden-ventana. Sólo puede haber una
expresión-clave-clasificación y el tipo de datos de la misma debe permitir las
restas. Esta cláusula no se puede especificar en
vinculación2-grupo si vinculación1-grupo es CURRENT ROW o
valor FOLLOWING.
- valor FOLLOWING
- Especifica el rango o número de filas que siguen a la fila actual.
Si se especifica ROWS, valor es un entero positivo que indica un
número de filas. Si se especifica RANGE, el tipo de datos de
valor debe ser comparable al tipo de la expresión-clave-clasificación
de la cláusula-orden-ventana. Sólo puede haber una
expresión-clave-clasificación y el tipo de datos de la misma debe permitir las
adiciones.
La información siguiente se debe añadir al final de la sección
"Expresiones" (a continuación de "Tratamiento de subtipos").
referencia-secuencia
|--+-| expresión-nextval |-+------------------------------------|
'-| expresión-prevval |-'
expresión-nextval
|---NEXTVAL FOR--nombre-secuencia-------------------------------|
expresión-prevval
|---PREVVAL FOR--nombre-secuencia-------------------------------|
- NEXTVAL FOR nombre-secuencia
- La expresión NEXTVAL devuelve el valor siguiente de la secuencia
especificada por nombre-secuencia.
- PREVVAL FOR nombre-secuencia
-
La expresión PREVVAL devuelve el último valor generado en una sentencia
anterior, para la secuencia especificada, dentro de la sesión actual.
Este valor se puede referenciar repetidamente utilizando expresiones PREVVAL
que especifiquen el nombre de la secuencia. Pueden existir varias
expresiones PREVVAL que especifiquen el mismo nombre de secuencia dentro de
una sentencia individual y todas ellas devuelven el mismo valor.
Sólo se puede utilizar una expresión PREVVAL si previamente se ha
especificado una expresión NEXTVAL con el mismo nombre de secuencia en la
sesión de usuario actual (en la transacción actual o en una anterior)(SQLSTATE
51035).
- Nota:
-
- Cuando una expresión NEXTVAL especifica el nombre de la secuencia, se
genera una nuevo número de secuencia. Pero, si existen varias
expresiones NEXTVAL que especifican el mismo nombre de secuencia dentro de una
consulta, el contador de la secuencia se incrementa una sola vez para cada
fila del resultado.
- Se puede referenciar repetidamente el valor generado más recientemente
para una secuencia, utilizando una expresión PREVVAL que especifique el nombre
de la secuencia. Pueden existir varias expresiones PREVVAL que
especifiquen el mismo nombre de secuencia dentro de una sentencia
individual.
- Se puede utilizar el mismo número de secuencia como valor de clave
exclusivo en dos tablas diferentes, referenciando el número de secuencia con
una expresión NEXTVAL para la primera fila (esto genera el valor de secuencia)
y una expresión PREVVAL para las demás filas (esta expresión PREVVAL
referencia el valor de secuencia generado por la expresión NEXTVAL en la
expresión anterior), tal como se muestra a continuación:
INSERT INTO order(orderno, custno)
VALUES (NEXTVAL FOR order_seq, 123456);
INSERT INTO line_item (orderno, partno, quantity)
VALUES (PREVVAL FOR order_seq, 987654, 1);
- Ejemplos de dónde se pueden especificar las expresiones NEXTVAL y
PREVVAL:
- Sentencia-select o sentencia SELECT INTO: dentro de la
cláusula-select, siempre que la sentencia no contenga las palabras clave
DISTINCT, UNION, INTERSECT ni EXCEPT, ni las cláusulas GROUP BY ni ORDER
BY.
- Sentencia INSERT: dentro de una cláusula VALUES
- Sentencia INSERT: dentro de la cláusula-select de la selección
completa
- Sentencia UPDATE: dentro de la cláusula-select de la selección
completa de una expresión de la cláusula SET (en una sentencia UPDATE de
búsqueda o de posición)
- Sentencia VALUES INTO: dentro de la cláusula-select de la selección
completa de una expresión
- Ejemplos de dónde no se pueden especificar las expresiones NEXTVAL y
PREVVAL (SQLSTATE 428F9):
- Condición de unión de una unión exterior completa
- Valor DEFAULT para una columna en una sentencia CREATE TABLE o ALTER TABLE
- Definición de columna generada en una sentencia CREATE TABLE o ALTER TABLE
- Condición de una restricción CHECK
- Sentencia CREATE TRIGGER
- Sentencia CREATE VIEW
- Sentencia CREATE METHOD
- Sentencia CREATE FUNCTION.
- Además, no se puede especificar una expresión NEXTVAL en estos lugares
(SQLSTATE 428F9):
- Expresión CASE
- Lista de parámetros de una función de agregación
- Subconsulta.
- Sentencia SELECT que contiene un operador DISTINCT
- Condición de unión de una unión
- Cláusula GROUP BY de una sentencia SELECT
- Sentencia SELECT que está combinada con otra sentencia SELECT utilizando
el operador de conjuntos UNION, INTERSECT o EXCEPT
- Expresión de tabla anidada
- Lista de parámetros de una función de tabla
- Cláusula WHERE de una sentencia SELECT, DELETE o UPDATE
- Cláusula ORDER BY
- Lista de parámetros de una sentencia CALL.
- Cuando se genera un valor para una secuencia, se utiliza ese valor y se
genera uno nuevo la próxima vez que se necesite uno. Esto es válido
aunque falle la sentencia donde reside la expresión NEXTVAL.
- Si una sentencia INSERT contiene una expresión NEXTVAL en la lista VALUES
de la columna, y se produce un error durante la ejecución de INSERT (por
ejemplo, un problema al generar el valor siguiente de la secuencia o un
problema en un valor para otra columna), se produce un error de inserción y el
valor generado para la secuencia se considera utilizado. En algunos
casos, es posible tener éxito al volver a emitir la misma sentencia
INSERT.
Por ejemplo, suponga un error que es el resultado de la existencia de un
índice de unicidad para la columna sobre la que se utiliza NEXTVAL y el valor
de secuencia generado ya existe en el índice. Es posible que el
siguiente valor generado para la secuencia sea un valor que no exista en el
índice, y por tanto la inserción subsiguiente se realice con éxito.
- Cuando se genera un valor para una secuencia, si se sobrepasa el valor
máximo de la secuencia (o el valor mínimo en el caso de una secuencia
descendente) y no está permitida la generación cíclica de valores, entonces se
produce un error (SQLSTATE 23522). En este caso, el usuario puede
modificar la secuencia (mediante la sentencia ALTER) y ampliar el rango de
valores aceptables, o habilitar la generación cíclica de valores para la
secuencia, o bien eliminar (DROP) la secuencia y crear (CREATE) una nueva con
un otro tipo de datos que tenga un rango mayor de valores.
Por ejemplo, una secuencia se puede haber definido con el tipo de datos
SMALLINT, y con el transcurso del tiempo la secuencia se queda sin valores
asignables. Para redefinir la secuencia como INTEGER, debe eliminar la
secuencia y volver a crearla con la nueva definición.
- Una referencia a PREVVAL en una sentencia select de un cursor hace
referencia a un valor generado para la secuencia especificada antes de abrir
el cursor. Sin embargo, el hecho de cerrar el cursor puede afectar a
los valores que devuelve PREVVAL para la secuencia especificada en siguientes
sentencias, e incluso para la misma sentencia en el caso de que se vuelva a
abrir el cursor. Este sería el caso si la sentencia select del cursor
incluyera una referencia a NEXTVAL para el mismo nombre de secuencia.
En estos ejemplos se supone que existe una tabla llamada "order" y que se
crea un secuencia llamada "order_seq" del siguiente modo:
CREATE SEQUENCE order_seq
START WITH 1
INCREMENT BY 1
NOMAXVALUE
NOCYCLE
CACHE 24
- He aquí algunos ejemplos de cómo generar un valor para la secuencia
"order_seq", creada anteriormente, utilizando una expresión NEXTVAL:
INSERT INTO order(orderno, custno)
VALUES (NEXTVAL FOR order_seq, 123456);
o bien,
UPDATE order
SET orderno = NEXTVAL FOR order_seq
WHERE custno = 123456;
o bien,
VALUES NEXTVAL FOR order_seq INTO :hv_seq;
[ Principio de página | Página anterior | Página siguiente ]