sentencias sentencia ejemplos datos consultas clausulas sql db2 ibm-midrange

sql - sentencia - iSeries DB2: ¿hay alguna forma de seleccionar el valor de identidad de una instrucción de inserción?



sentencia select sql (3)

Sé que somos raros, somos pobres que estamos utilizando iSeries para DB2 / AS400, pero espero que alguien pueda responder a esta simple pregunta. ¿Hay alguna manera de devolver el valor de identidad de una declaración de inserción sin usar dos líneas de SQL? Me veo obligado a usar SQL en línea en C # para realizar una inserción, y luego necesito usar la identidad generada para la inserción para algo más adelante. En pocas palabras, necesito el equivalente de iSeries DB2 del "DEVOLUCION" de Oracle. Es decir,

INSERT INTO AwesomeTable (column1, column2, etc.) VALUES (value1, value2, etc.) RETURNING something;

¿Nadie? Gracias por adelantado.

EDITAR: A menos que alguien sepa de una manera que puedo ejecutar dos líneas de SQL en una IBM.Data.DB2.iSeries.iDB2Command (no un proceso almacenado), me gustaría hacer esto todo en una línea de SQL


Aquí hay un ejemplo:

CREATE TABLE AUTOINC ( AUTO91 INTEGER GENERATED ALWAYS AS IDENTITY, SCDS91 CHAR(35) NOT NULL DEFAULT '''', MCLD91 DECIMAL(3,0) NOT NULL DEFAULT 0, CONSTRAINT PK_AUTOINC PRIMARY KEY(AUTO91));

// Observe la palabra clave predeterminada donde se encuentra el campo de incremento automático.

insert into AUTOINC Values( default ,''SYSC'' , 0 )

// Y usando la función para devolver el último valor de la columna de identidad.

// Nota: solo busca la primera fila.

select **IDENTITY_VAL_LOCAL**() from AUTOINC **fetch first row only**


Necesita usar la función escalar IDENTITY_VAL_LOCAL . De la documentación de IBM :

IDENTITY_VAL_LOCAL es una función no determinista que devuelve el valor asignado más recientemente para una columna de identidad.

Ejemplo:

CREATE TABLE EMPLOYEE (EMPNO INTEGER GENERATED ALWAYS AS IDENTITY, NAME CHAR(30), SALARY DECIMAL(5,2), DEPT SMALLINT) INSERT INTO EMPLOYEE (NAME, SALARY, DEPTNO) VALUES(''Rupert'', 989.99, 50) SELECT IDENTITY_VAL_LOCAL() FROM SYSIBM.SYSDUMMY1


No estoy seguro de iSeries, pero lo siguiente funcionó en db2v8.1:

Considera "ID" es el nombre de tu columna de identidad. El siguiente comando devolverá la nueva ID generada (la misma que se inserta mediante la inserción stmt):

SELECT ID FROM FINAL TABLE ( INSERT INTO AwesomeTable (column1, column2, etc.) VALUES (value1, value2, etc.) )

Alguna explicación que encontré en el sitio publib: (Lo usé como referencia para probar mi consulta anterior)

/* The following SELECT statement references an INSERT statement in its FROM clause. It inserts an employee record from host variables into table company_b. The current employee ID from the cursor is selected into the host variable new_id. The keywords FROM FINAL TABLE determine that the value in new_id is the value of ID after the INSERT statement is complete. Note that the ID column in table company_b is generated and without the SELECT statement an additional query would have to be made in order to retreive the employee''s ID number. */ EXEC SQL SELECT ID INTO :new_id FROM FINAL TABLE(INSERT INTO company_b VALUES(default, :name, :department, :job, :years, :salary, :benefits, :id));

Espero que esto ayude :)