Recuperación de conjuntos de resultados de una sentencia de cambio de datos de SQL

Las aplicaciones que modifican tablas con sentencias INSERT, UPDATE o DELETE pueden requerir proceso adicional en las filas modificadas. Para facilitar este proceso, puede incluir operaciones de cambio de datos de SQL en la cláusula FROM de las sentencias SELECT y SELECT INTO.

Dentro de una única unidad de trabajo, las aplicaciones pueden recuperar un conjunto de resultados que contenga las filas modificadas de una vista o tabla modificada mediante una operación de cambio de datos de SQL.

Por ejemplo, la sentencia siguiente actualiza los salarios de todos los registros de la tabla EMPLOYEE de la base de datos SAMPLE y, después, devuelve el número de empleado y el salario nuevo para todas las filas actualizadas.

SELECT empno, salary FROM FINAL TABLE
	(UPDATE employee SET salary = salary * 1.10 WHERE job = 'CLERK')

Para devolver datos satisfactoriamente, las sentencias SELECT que recuperan conjuntos de datos de (FROM) operaciones de cambio de datos de SQL requieren que las operaciones de cambio de datos de SQL se ejecuten satisfactoriamente. El resultado satisfactorio de las operaciones de cambio de datos de SQL incluye el proceso de todas las restricciones y activadores, si procede.

Por ejemplo, suponga que un usuario con privilegios SELECT, pero sin privilegios INSERT en la tabla EMPLOYEE intenta efectuar una sentencia SELECT FROM INSERT en la tabla EMPLOYEE. La operación INSERT falla debido a los privilegios que faltan y, como resultado, falla toda la sentencia SELECT.

Tenga en cuenta la consulta siguiente, en la que se seleccionan los registros de la tabla EMPLOYEE y después se insertan en una tabla diferente, denominada EMP. Esta sentencia SELECT fallará.

SELECT empno FROM FINAL TABLE
	(INSERT INTO emp(name, salary)
	SELECT firstnme || midinit || lastname, salary
	FROM employee)

Si la tabla EMPLOYEE tiene 100 filas y la fila 90 tiene un valor de SALARY de $9.999.000,00, la suma de $10.000,00 haría que se produjera un desbordamiento decimal. El desbordamiento impondría que el gestor de base de datos retrotrajera las inserciones en la tabla EMP.

Tablas de resultados intermedios

Las filas modificadas de la vista o tabla que es objetivo de una operación de cambio de datos de SQL en la cláusula FROM de una sentencia SELECT componen una tabla de resultados intermedios. La tabla de resultados intermedios incluye todas las columnas de la vista o tabla de destino, además de las columnas include definidas en la operación de cambio de datos de SQL. Puede hacer referencia a todas las columnas de una tabla de resultados intermedios por su nombre en la lista de selección, mediante cláusula ORDER BY o la cláusula WHERE.

El contenido de la tabla de resultados intermedios depende del calificador especificado en la cláusula FROM. Deberá incluir uno de los siguientes calificadores de cláusula FROM en las sentencias SELECT que recuperan conjuntos de resultados como tablas de resultados intermedios.
OLD TABLE
Las filas de la tabla de resultados intermedios contendrán valores de las filas de tablas de destino en el punto inmediatamente anterior a la ejecución de activadores BEFORE y la operación de cambio de datos de SQL. El calificador OLD TABLE se aplica a las operaciones UPDATE y DELETE.
NEW TABLE
Las filas de la tabla de resultados intermedios contendrán valores de las filas de tablas de destino en el punto inmediatamente posterior a la ejecución de la sentencia de cambio de datos de SQL, pero antes de la evaluación de la integridad referencial y de que se active cualquier activador AFTER. El calificador NEW TABLE se aplica a las operaciones UPDATE e INSERT.
FINAL TABLE
Este calificador devuelve la misma tabla de resultados intermedios que NEW TABLE. Además, la utilización de FINAL TABLE garantiza que ningún activador AFTER ni restricción de integridad referencial modificará aún más el destino de la operación de UPDATE o INSERT. El calificador FINAL TABLE se aplica a las operaciones UPDATE e INSERT.

Los calificadores de la cláusula FROM determinan que la versión de los datos de destino está en la tabla de resultados intermedios. Estos calificadores no afectan a la inserción, supresión o actualizaciones de las filas de la tabla de destino.

Vistas y tablas de destino

Al seleccionar conjuntos de resultados de (FROM) operaciones de cambio de datos de SQL, el destino puede ser una tabla o una vista.

En las operaciones de cambio de datos de SQL, la tabla de resultados no puede incluir filas que ya no satisfagan la definición de vista para las tablas NEW TABLE y FINAL TABLE. Si incluye una sentencia INSERT o UPDATE que haga referencia a una vista de una sentencia SELECT, la vista debe definirse como WITH CASCADED CHECK OPTION (con opción de comprobación en cascada). De modo alternativo, la vista debe satisfacer las restricciones que le permitirían definirlo como WITH CASCADED CHECK OPTION (con opción de comprobación en cascada).

Si el destino de las operaciones de cambio de datos de SQL incluidas en la cláusula FROM de una sentencia SELECT es fullselect (selección completa), la tabla de resultados puede incluir filas que ya no se califiquen en fullselect. Esto se debe a que los predicados de la cláusula WHERE no vuelven a evaluarse con respecto a los valores actualizados.

Ordenación del conjunto de resultados basada en INPUT SEQUENCE

Para seleccionar (SELECT) filas en el mismo orden en el que se insertaron en la vista o tabla de destino, utilice las palabras clave INPUT SEQUENCE de la cláusula ORDER BY. La utilización de las palabras clave INPUT SEQUENCE no hace que las filas se inserten en el mismo orden en el que se facilitaron.

El ejemplo siguiente demuestra la utilización de las palabras clave INPUT SEQUENCE en la cláusula ORDER BY para ordenar el conjunto de resultados de una operación INSERT.

CREATE TABLE orders (purchase_date DATE,
                     sales_person VARCHAR(16),
                     region VARCHAR(10),
                     quantity SMALLINT,
                     order_num INTEGER NOT NULL
                       GENERATED ALWAYS AS IDENTITY (START WITH 100,
		                                    INCREMENT BY 1))

SELECT * FROM FINAL TABLE
         (INSERT INTO orders
          (purchase_date, sales_person, region, quantity)
          VALUES (CURRENT DATE,'Judith','Beijing',6),
                 (CURRENT DATE,'Marieke','Medway',5),
                 (CURRENT DATE,'Hanneke','Halifax',5))
         ORDER BY INPUT SEQUENCE

PURCHASE_DATE SALES_PERSON     REGION     QUANTITY ORDER_NUM
------------- ---------------- ---------- -------- -----------
07/18/2003    Judith           Beijing           6         100
07/18/2003    Marieke          Medway            5         101
07/18/2003    Hanneke          Halifax           5         102

También puede ordenar las filas del conjunto de resultados utilizando columnas include.