Sentencia SET variable
La sentencia SET variable asigna valores a variables.
La sentencia no está bajo el control de la transacción.
Invocación
Esta sentencia puede incorporarse en un programa de aplicación o emitirse de forma interactiva. Se trata de una sentencia ejecutable que puede prepararse de forma dinámica.
Autorización
- Privilegio UPDATE para las columnas a las que se hace referencia en la parte izquierda de la asignación y privilegio SELECT para las columnas a las que se hace referencia en la parte derecha.
- Privilegio CONTROL para la tabla (tabla sujeto del activador)
- Autorización DATAACCESS
- el privilegio READ sobre la variable global que no está definida en un módulo
- el privilegio EXECUTE sobre el módulo de la variable global que está definida en un módulo
- el privilegio WRITE sobre la variable global que no está definida en un módulo
- el privilegio EXECUTE sobre el módulo de la variable global que está definida en un módulo
Para ejecutar esta sentencia con una selección-completa-fila como la parte derecha de la asignación, los privilegios del ID de autorización de la sentencia deben incluir los privilegios necesarios para ejecutar la selección-completa-fila. Consulte la sección Autorización en "Consultas de SQL".
Para ejecutar esta sentencia con un constructor-valor-cursor que utiliza una sentencia-select, los privilegios del ID de autorización de la sentencia deben incluir los privilegios necesarios para ejecutar la sentencia-select. Consulte la sección Autorización en "Consultas de SQL".
Sintaxis
- 1 El nombre-sentencia no se puede especificar si se ha especificado la declaración-parámetro.
- 2 La cláusula FOR BIT DATA se puede especificar en cualquier orden con las restricciones de columna siguientes. La cláusula FOR BIT DATA no se puede especificar con unidades de serie CODEUNITS32 (SQLSTATE 42613).
- 3 El tipo de datos debe ser un tipo de fila.
Descripción
- variable-destino
- Identifica la variable de destino de la asignación. Una variable-destino que represente la misma variable no debe especificarse más de una vez (SQLSTATE 42701).
- nombre-variable-global
- Identifica la variable global que es el sujeto de la asignación. El nombre-variable-global debe identificar una variable global que exista en el servidor actual (SQLSTATE 42704).
- variable-lenguaje-principal
- Identifica la variable del lenguaje principal que es el sujeto de la asignación.
- marcador-parámetro
- Identifica el marcador de parámetro que es el sujeto de la asignación.
- nombre-parámetro-SQL
- Identifica el parámetro que es el sujeto de la asignación. El parámetro se debe especificar en la declaración-parámetro de la sentencia CREATE PROCEDURE.
- referencia-campo
- Identifica el campo de un valor de tipo de fila que es el destino de
la asignación.
- nombre-variable-fila
- El nombre de una variable con un tipo de datos que es un tipo de fila.
- nombre-campo
- El nombre de un campo dentro de un tipo de fila.
- nombre-variable-SQL
- Identifica la variable de SQL que es el sujeto de la asignación. Las variables de SQL se deben declarar antes de utilizarlas.
- nombre-variable-transición
- Identifica la columna que se debe actualizar en la fila de transición. Un nombre-variable-transición debe identificar una columna en la tabla sujeto de un activador, calificado opcionalmente por un nombre de correlación que identifique el nuevo valor (SQLSTATE 42703).
- ..nombre-atributo
- Especifica el atributo de un tipo estructurado que está definido (esto se denomina asignación de atributos). El nombre-variable-SQL o nombre-variable-transición especificado debe definirse con un tipo estructurado definido por el usuario (SQLSTATE 428DP). El ..nombre-atributo debe ser un atributo del tipo estructurado (SQLSTATE 42703). Una asignación que no incluye la cláusula ..nombre-atributo se denomina asignación convencional.
- expresión
- Indica el nuevo valor del destino de la asignación. La expresión es cualquier expresión del tipo que se describe en el apartado "Expresiones". La expresión no puede incluir una función agregada salvo cuando aparece dentro de una selección completa escalar (SQLSTATE 42903). En el contexto de una sentencia CREATE TRIGGER, una expresión puede contener referencias a las variables de transición OLD y NEW. Las variables de transición debe calificarlas el nombre-correlación (SQLSTATE 42702).
- NULL
- Especifica el valor nulo. Si el destino de la asignación es una variable de fila, se asigna a cada campo el valor nulo. NULL no puede ser el valor en una asignación de atributos a menos que se convirtiera específicamente al tipo de datos del atributo (SQLSTATE 429B9).
- DEFAULT
- Especifica que se debe utilizar el valor por omisión.
En procedimientos SQL, la cláusula DEFAULT puede especificarse sólo para sentencias de SQL estático. La excepción es que la cláusula DEFAULT puede especificarse cuando la variable-destino es una variable global de una sentencia de SQL dinámico.
Si variable-destino es una columna, el valor insertado depende de cómo se haya definido la columna en la tabla.- Si la columna se ha definido utilizando la cláusula WITH DEFAULT, el valor se establece en el valor por omisión que se ha definido para la columna (consulte el apartado cláusula-valor-por-omisión en "ALTER TABLE").
- Si se utiliza la cláusula IDENTITY para definir la columna, el gestor de bases de datos genera el valor.
- Si la columna se ha definido sin especificar la cláusula WITH DEFAULT, la cláusula IDENTITY ni la cláusula NOT NULL, el valor es NULL.
- Si la columna se ha definido utilizando la cláusula NOT NULL y:
- No se utiliza la cláusula IDENTITY o
- No se ha utilizado la cláusula WITH DEFAULT o
- se ha utilizado la cláusula DEFAULT NULL
Si la variable-destino es una variable global, el valor que se ha insertado es el valor por omisión, tal como se ha especificado en la creación de la variable.
Si la variable-destino es una variable de SQL o un parámetro de SQL de un procedimiento de SQL, una variable del lenguaje principal o un marcador de parámetro, no puede especificarse la palabra clave DEFAULT (SQLSTATE 42608).
- seleccióncompleta-fila
- Una selección completa que devuelve una sola fila con el número de columnas correspondiente al número de variables de destino campos de la variable de fila especificados para la asignación. Los valores se asignan a cada campo o variable de destino correspondiente. Si la selección completa de fila da como resultado ninguna fila, se asignan valores nulos a las variables de destino de la lista o, en el caso de la asignación a una variable de fila, se asigna un valor nulo único. En el contexto de una sentencia CREATE TRIGGER, una selección-completa-fila puede contener referencias a las variables de transición OLD y NEW, que se deben calificar por su nombre-correlación para especificar qué variable de transición se debe utilizar (SQLSTATE 42702). Se devuelve un error si hay más de una fila en el resultado (SQLSTATE 21000).
- nombre-variable-booleana
- Identifica una variable o un parámetro de SQL o una variable global. La variable o el parámetro debe ser de tipo booleano (SQLSTATE 428H0). La sentencia SET se debe emitir dentro de una sentencia de SQL compuesto (compilado) (SQLSTATE 428H2).
- condición-búsqueda
- Condición de búsqueda cuyo resultado es verdadero, falso o desconocido. Se devuelve el resultado de desconocido como valor booleano NULL.
- TRUE
- Especifica el valor booleano TRUE.
- FALSE
- Especifica el valor booleano FALSE.
- NULL
- Especifica el valor booleano NULL.
- nombre-variable-matriz
- Identifica una variable de SQL, un parámetro de SQL o una variable global con tipo de matriz (SQLSTATE 428H0).
- [índice-matriz]
- Expresión que especifica qué elemento de la matriz será el destino de la asignación. Para una matriz común, el índice-matriz debe poderse asignar a INTEGER (SQLSTATE 22018 o 428H1). Su valor debe estar entre 1 y la cardinalidad máxima definida para la matriz y no puede ser el valor nulo (SQLSTATE 2202E).
- variable-cursor-destino
- Identifica una variable de cursor. El tipo de datos de una variable-cursor-destino tiene que ser un tipo de cursor (SQLSTATE 42821).
- nombre-variable-cursor
- Identifica una variable de cursor del mismo tipo de cursor que la variable-cursor-destino.
- constructor-valor-cursor
- Un constructor-valor-cursor especifica la sentencia-select asociada con la variable de destino. La asignación de un constructor-valor-cursor a una variable de cursor define el cursor
subyacente de esa variable de cursor.
- ASENSITIVE o INSENSITIVE
- Especifica si el cursor es sensible o insensible a los cambios.
Consulte el apartado "DECLARE CURSOR" para obtener más información. El valor por omisión es ASENSITIVE.
- ASENSITIVE
- Especifica que el cursor debe ser todo lo sensible que sea posible para las inserciones, actualizaciones o supresiones realizadas en las filas subyacentes de la tabla de resultados, en función de cómo se haya optimizado sentencia-select. ASENSITIVE es el valor por omisión.
- INSENSITIVE
- Especifica que el cursor no debe contar con sensibilidad para las inserciones, actualizaciones o supresiones que se han realizado en las filas subyacentes de la tabla de resultados. Si se especifica INSENSITIVE, el cursor es de sólo lectura y la tabla de resultados se materializa al abrirse el cursor. Como resultado de ello, el tamaño de la tabla de resultados, el orden de las filas y los valores de cada fila no cambian tras abrirse el cursor. La sentencia SELECT no puede contener una cláusula FOR UPDATE, y el cursor no puede utilizarse para las actualizaciones o supresiones posicionadas.
- (declaración-parámetro, ...)
- Especifica los parámetros de entrada del cursor, incluido el nombre y el tipo de datos de cada parámetro. Sólo se pueden especificar parámetros de entrada con nombre si la sentencia-select también está especificada en el constructor-valor-cursor (SQLSTATE 428HU).
- nombre-parámetro
- Asigna un nombre al parámetro de cursor que se debe utilizar como variable de SQL dentro de la sentencia-select. El nombre no puede ser igual que ningún otro nombre de parámetro del cursor. Los nombres deben elegirse también evitando nombres de columna que se puedan utilizar en la sentencia-select, ya que los nombres de columna se resuelven antes que los nombres de parámetro.
- tipo-datos
- Especifica el tipo de datos del parámetro de cursor utilizado dentro de una sentencia-select. No se pueden especificar tipos estructurados ni tipos de referencia (SQLSTATE
429BB).
- tipo-incorporado
- Especifica un tipo de datos incorporado. Para obtener una descripción más completa de cada tipo de datos incorporado, consulte "CREATE TABLE".
- tipo-datos-parámetro-anclado
- Identifica otro objeto que se utiliza para determinar el tipo de datos del parámetro de cursor. El tipo de datos del objeto de anclaje se ve afectado por las mismas limitaciones que se aplican cuando se especifica el tipo de datos directamente.
- ANCHOR DATA TYPE TO
- Indica que se utiliza un tipo de datos anclados para especificar el
tipo de datos.
- nombre-variable
- Identifica una variable de SQL local, un parámetro SQL o una variable global. El tipo de datos de la variable a la que se hace referencia se utiliza como tipo de datos para el parámetro de cursor.
- nombre-tabla.nombre-columna
- Identifica un nombre de columna de una tabla o vista existente. El tipo de datos de la columna se utiliza como tipo de datos para el parámetro de cursor.
- nombre-tipo-diferenciado
- Especifica el nombre de un tipo diferenciado. Si se especifica el nombre-tipo-diferenciado sin un nombre de esquema, el tipo diferenciado se resuelve buscando en los esquemas de la vía de acceso de SQL.
- posibilidad de mantenimiento
- Especifica si se impedirá que el cursor se cierre como consecuencia de una
operación de confirmación. Consulte el apartado "DECLARE CURSOR" para obtener más información. El valor por omisión es WITHOUT HOLD.
- WITHOUT HOLD
- No impide que el cursor se cierre como consecuencia de una operación de confirmación.
- WITH HOLD
- Mantiene recursos en varias unidades de trabajo. Impide que el cursor se cierre como consecuencia de una operación de confirmación.
- sentencia-select
- Especifica la sentencia SELECT del cursor. Consulte el apartado "sentencia-select" para obtener más información. Si se incluye una declaración-parámetro en el constructor-valor-cursor, la sentencia-select no debe incluir ninguna variable de SQL local ni parámetros de SQL de rutina (SQLSTATE 42704).
- nombre-sentencia
- Especifica la sentencia-select preparada del cursor. Consulte el apartado "PREPARE" para obtener una explicación de las sentencias preparadas. La variable del cursor de destino no debe tener un tipo de datos que sea un tipo de cursor definido por el usuario con tipo firme (SQLSTATE 428HU). No se deben especificar parámetros de entrada con nombre en el constructor-valor-cursor si se especifica un nombre-sentencia (SQLSTATE 428HU).
- variable-fila-destino
- Identifica la variable de fila de destino de la asignación. El tipo de datos debe ser un tipo de fila.
- expresión-fila
- Especifica el nuevo valor de fila para el destino de la asignación. Puede ser cualquier expresión de fila del tipo descrito en "Expresión de fila". El número de campos de la fila debe coincidir con el destino de la asignación, y cada campo de la fila debe poderse asignar al campo correspondiente en el destino de la asignación. Si los valores fuente y de destino son un tipo de fila definido por el usuario, los nombres de los tipos deben ser iguales (SQLSTATE 42821).
Normas
- El número de valores que se debe asignar a partir de las expresiones, NULL, DEFAULT o la selección-completa-fila debe coincidir con el número de variables-destino especificado para la asignación (SQLSTATE 42802).
- Una sentencia SET variable no puede asignar una variable de SQL y una variable de transición en una sentencia (SQLSTATE 42997).
- Las variables globales no se pueden asignar dentro de activadores que no se han definido mediante una sentencia de SQL compuesto (compilado), funciones que no se han definido mediante una sentencia de SQL compuesto (compilado), métodos o sentencias de SQL compuesto (en línea) (SQLSTATE 428GX).
- Si el valor que se asigna es una matriz resultante de un constructor de matriz o de ARRAY_AGG, los tipos base de la matriz y de la variable de destino deben ser idénticos (SQLSTATE 42821).
- Utilización de tipos de datos anclados: Un tipo de datos anclado no puede hacer referencia a los siguientes objetos (SQLSTATE 428HS): un apodo, una tabla con tipo, una vista con tipo, una vista estadística asociada con un índice basado en la expresión, una tabla temporal declarada, una definición de fila asociada con un cursor de tipo débil, un objeto con una página de códigos o una clasificación que es diferente de la página de códigos de la base de datos o la asignación de base de datos.
- Asignaciones que implican variables de cursor: las asignaciones que hacen referencia a una variable de cursor y que la establecen en el valor de un constructor de valor de cursor sólo se pueden utilizar en sentencias de SQL compuesto (compilado). Todas las sentencias OPEN que utilizan una variable de cursor deben aparecer en el mismo ámbito que la asignación (SQLSTATE 51044).
Notas
- Se asignan valores a las variables de destino en función de normas de asignación específicas.
- Sentencia de asignación en procedimientos de SQL: las sentencias de asignación de los procedimientos de SQL deben ajustarse a las normas de asignación de SQL. Las asignaciones de series utilizan normas de asignación de recuperación.
- Asignaciones de elementos de matriz: si la asignación tiene la forma
SET A[idx] = rhs, dondeAes un nombre de variable de matriz,idxes una expresión utilizada como índice-matriz yrhses una expresión del mismo tipo que el elemento de matriz, entonces:- Si la matriz
Aes el valor nulo, definaAen la matriz vacía. Ctiene que ser la cardinalidad de la matrizA.- Si
Aes una matriz común:- Si
idxes menor que o igual aC, el valor en la posición queidxidentifica se sustituye por el valor derhs. - Si
idxes mayor queC, entonces:- El valor en posición i, dado que i es mayor que
Cy menor queidx, se establece en el valor nulo. - El valor en posición
idxse establece en el valor derhs. - La cardinalidad de
Ase establece enidx.
- El valor en posición i, dado que i es mayor que
- Si
- Si
Aes una matriz asociativa:- Si
idxcoincide con un valor de índice de matriz existente, el valor de elemento cuyo índice de matriz esidxse sustituye por el valor derhs. - Si
idxno coincide con ningún valor de índice de matriz existente, entonces:- La cardinalidad de
Aaumenta en 1. - El nuevo valor de elemento se establece en
rhscon el valor de índice de matriz asociadoidx.
- La cardinalidad de
- Si
- Si
idxes menor que o igual aC, el valor en la posición queidxidentifica se sustituye por el valor derhs. - Si
idxes mayor queC, entonces:- El valor en posición i, dado que i es mayor que
Cy menor queidx, se establece en el valor nulo. - El valor en posición
idxse establece en el valor derhs. - La cardinalidad de
Ase establece enidx.
- El valor en posición i, dado que i es mayor que
- Si la matriz
- Si una variable se ha declarado con un identificador que coincide con el
nombre de un registro especial (por ejemplo, PATH), se debe delimitar la variable
para impedir una asignación no intencionada al registro especial
(por ejemplo,
SET "PATH" = 1;para una variable llamada PATH que se ha declarado como entero). - Si se incluye más de una asignación, se evalúa cada expresión y selección-completa-fila antes de que se realicen las asignaciones. Por lo tanto, las referencias a variables de destino en una expresión o una selección completa de fila siempre son el valor de la variable de destino antes de cualquier asignación en una única sentencia SET.
- Cuando se actualiza una columna de identidad que se ha definido como un tipo diferenciado, todo el cálculo tiene lugar en el tipo de fuente y el resultado se convierte al tipo diferenciado antes de que el valor se asigne realmente a la columna. (No se produce ninguna conversión del valor anterior en el tipo de fuente antes de realizarse el cálculo.)
- Para que el gestor de bases de datos genere un valor en una sentencia SET para una columna de identidad,
utilice la palabra clave DEFAULT:
En este ejemplo, NEW.EMPNO está definido como una columna de identidad, y el valor utilizado para actualizar la columna es generado por el gestor de bases de datos.SET NEW.EMPNO = DEFAULT - Para obtener más información acerca de la utilización máxima de los valores de una secuencia generada para una columna de identidad y para obtener información acerca de cuándo se excede el valor máximo de una columna de identidad, consulte el apartado "INSERT".
Ejemplos
- Ejemplo 1: Establezca la
columna del salario de la fila para la que se ejecuta actualmente la acción del
activador en 50000.
O bien:SET NEW_VAR.SALARY = 50000;SET (NEW_VAR.SALARY) = (50000); - Ejemplo 2: Establezca las columnas del salario y la comisión
de la fila para la que se está ejecutando actualmente la acción
de activador en 50000 y 8000, respectivamente.
O bien:SET NEW_VAR.SALARY = 50000, NEW_VAR.COMM = 8000;SET (NEW_VAR.SALARY, NEW_VAR.COMM) = (50000, 8000); - Ejemplo 3: Establezca la columna del salario y
la comisión de la fila para la que se está ejecutando actualmente la acción
del activador en el salario y la comisión promedio de los empleados del departamento
que está asociado a la fila actualizada.
SET (NEW_VAR.SALARY, NEW_VAR.COMM) = (SELECT AVG(SALARY), AVG(COMM) FROM EMPLOYEE E WHERE E.WORKDEPT = NEW_VAR.WORKDEPT); - Ejemplo 4: Establezca la columna de salario y
de comisión de la fila para la que se ejecuta actualmente la acción del
activador en 10000 y el valor original del salario (es decir, antes
de ejecutar la sentencia SET), respectivamente.
O bien:SET NEW_VAR.SALARY = 10000, NEW_VAR.COMM = NEW_VAR.SALARY;SET (NEW_VAR.SALARY, NEW_VAR.COMM) = (10000, NEW_VAR.SALARY); - Ejemplo 5: Incremente la variable de SQL
P_SALARYen un 10 por ciento.SET P_SALARY = P_SALARY + (P_SALARY * .10) - Ejemplo 6: Establezca la variable de SQL
P_SALARYen el valor nulo.SET P_SALARY = NULL - Ejemplo 7: Asigne los números
2.71828183 y 3.1415926 al primer y décimo elemento de la variable de matriz
SPECIALNUMBERS. Después de la primera asignación, la cardinalidad deP_PHONENUMBERSes 1. Después de la segunda asignación, la cardinalidad es 10 y se ha asignado implícitamente a los elementos del 2 al 9 el valor nulo.SET SPECIALNUMBERS[1] = 2.71828183; SET SPECIALNUMBERS[10] = 3.14159265; - Ejemplo 8: A partir de una tabla llamada SECURITY.USERS, que tiene una fila para cada usuario que puede conectarse a la base de datos, asigne la hora actual y el nivel de autorización a las variables globales
USERINFO.GV_CONNECT_TIMEyUSERINFO.GV_AUTH_LEVEL, respectivamente.SET USERINFO.GV_CONNECT_TIME = CURRENT TIMESTAMP, USERINFO.GV_AUTH_LEVEL = ( SELECT AUTHLEVEL FROM SECURITY.USERS WHERE USERID = CURRENT USER) - Ejemplo 9: Asigne valores a la variable de matriz asociativa,
CAPITALS, que se ha declarado como el tipo de matrizCAPITALSARRAY.
Al rellenar los valores de la matrizSET CAPITALS['British Columbia'] = 'Victoria'; SET CAPITALS['Alberta'] = 'Edmonton'; SET CAPITALS['Manitoba'] = 'Winnipeg'; SET CAPITALS['Canada'] = 'Ottawa';CAPITALS, los índices de matriz son nombres de provincia, territorio y país especificados con series y los elementos de matriz asociados son capitales, que también se especifican con series. - Ejemplo 10: Asigne nombres fáciles de recordar como índices para los números de teléfono personales almacenados en la variable de matriz
PHONELISTcon el tipo de matrizPERSONAL_PHONENUMBERS.SET PHONELIST['Casa'] = '4163053745'; SET PHONELIST['Trabajo'] = '4163053746'; SET PHONELIST['Madre'] = '4164789683';
