loop for español as400 adidas sql db2 db2400

sql - for - db2400 adidas



DB2 almacena los resultados de la cláusula de la tabla final (2)

La cláusula FINAL TABLE es excelente para recuperar valores de DML en DB2, por ejemplo:

SELECT id FROM FINAL TABLE ( INSERT INTO mySchema.myTable (val) VALUES (''data'') )

Sin embargo, no parece haber una manera de almacenar los resultados de esta consulta en otra tabla, persistiendo los contenidos en alguna parte. Por ejemplo, los dos siguientes fallan con el error "Referencia de la tabla de cambio de datos no permitida donde se especificó". (Estoy ejecutando DB2 para i v7.1):

CREATE TABLE mySchema.otherTable AS ( SELECT id FROM FINAL TABLE ( INSERT INTO mySchema.myTable (val) VALUES (''data'') ) ) WITH DATA

Después de crear mySchema.otherTable en una instrucción CREATE TABLE por separado, esto también falla:

INSERT INTO mySchema.otherTable (ID) SELECT id FROM FINAL TABLE ( INSERT INTO mySchema.myTable (val) VALUES (''data'') )


No estoy seguro de si esto funciona en la Serie i, pero DB2 para LUW le permite hacer esto:

with i1 (id) as ( SELECT id FROM FINAL TABLE ( INSERT INTO mySchema.myTable (val) VALUES (''data'') ) ) select * from new table ( INSERT INTO mySchema.otherTable (ID) select id from i1 )


Traté de usar la técnica de FINAL TABLE hoy en una IBM i en OS V7R1 y no funcionaría como se describe en DB2 para LUW, cuando intento alimentar el valor de la columna de identidad a una segunda inserción. Anticipo que obtendremos esta habilidad eventualmente.

Como alternativa, pude enrutar el valor de la columna de identidad asignada a una variable global de SQL utilizando un comando SET, y luego usar esa variable global para asignar el mismo valor de columna de identidad a 2 inserciones posteriores en 2 tablas de asociación relacionadas. Para las secuencias de comandos SQL no compiladas, es una buena técnica para usar en una solución de servidor hasta que obtengamos la misma capacidad que la descrita en DB2 para LUW. Una mesa temporal también funcionaría.

create variable MY_SCHEMA.MY_TABLE_ID ; set MY_SCHEMA.MY_TABLE_ID = ( select ID from final table ( insert into MY_SCHEMA.MY_TABLE values (''data'') ) ) ; insert into MY_SCHEMA.MY_OTHER_TABLE ( ID, DATA ) values( MY_SCHEMA.MY_TABLE_ID, ''more data'' ) ;

Del manual de referencia de V7R1 SQL: las variables globales tienen un alcance de sesión. Esto significa que, aunque están disponibles para todas las sesiones que están activas en la base de datos, su valor es privado para cada sesión.

Para los procedimientos almacenados SQL compilados, una variable con SELECT INTO también funciona bien.