2009-07-10 15 views
17

So che siamo rari, noi poveri che usano iSeries per DB2/AS400, ma spero che qualcuno possa rispondere a questa semplice domanda. Esiste un modo per restituire il valore dell'identità da un'istruzione di inserimento senza utilizzare due righe di SQL? Sono costretto a utilizzare SQL inline in C# per eseguire un inserimento, e quindi ho bisogno di utilizzare l'identità generata per l'inserto per qualcosa in seguito. In poche parole, ho bisogno dell'equivalente iSeries DB2 di Oracle "RETURNING". I.e.,iSeries DB2: esiste un modo per selezionare il valore dell'identità da un'istruzione di inserimento?

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

Chiunque? Grazie in anticipo.

EDIT: A meno che qualcuno sa di un modo per eseguire due linee di SQL in un'IBM.Data.DB2.iSeries.iDB2Command (non un proc memorizzato), vorrei fare tutto questo in una sola riga di SQL

+0

+1 Buona domanda –

+0

Sei riuscito a risolvere questo? Se si, per favore pubblica la tua risposta. –

+0

@DamienJoe Non uso più iSeries e non ho accesso a nessun sistema che potrei usare per testare queste risposte. Se trovi che uno di loro funziona, per favore commenta qui e segnerò la risposta come accettata. –

risposta

7

È necessario utilizzare la funzione scalare IDENTITY_VAL_LOCAL. Dal IBM documentation:

IDENTITY_VAL_LOCAL è una funzione non deterministica che restituisce il valore più recente assegnato per una colonna di identità.

Esempio:

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 
+1

Nel programma C#, probabilmente aggiungerei quanto segue come un secondo comando SQL: "seleziona identity_val_local() da sysibm.sysdummy1" invece dell'istruzione VALUES INTO nell'esempio sopra. –

+0

Grazie, Tracy - buon suggerimento. Ho aggiornato la risposta. –

+0

Ciò restituirebbe il campo identità inserito dall'ultima operazione eseguita su qualsiasi tabella e non su quella tabella specifica. Immagina un ambiente con molti utenti che inseriscono in molte tabelle di colonne identitarie? –

13

non sono sicuro di iSeries, ma le seguenti lavorato su db2v8.1:

consideri 'ID' è il nome della colonna di identità. Il seguente stmt restituirà l'id appena generato (lo stesso che viene inserita dal stmt inserto):

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

Qualche spiegazione che ho trovato sul sito publib: (io ho usato come riferimento per testare la mia domanda sopra)

 /* 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)); 

Spero che questo aiuti :)

+1

Sì, l'ho trovato anche sul sito pubblico e non riesco a farlo funzionare con iSeries. Grazie mille per la tua risposta. –

+1

Vuoi dire che FINAL TABLE non è supportato da iSeries? –

+1

TABELLA FINALE è supportata a partire dalla versione 6.1. È l'approccio consigliato per determinare il valore dell'identità utilizzato da un'istruzione di inserimento. –

0

Ecco un esempio:

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)); 

// Si noti la parola chiave predefinita in cui si trova il campo di incremento automatico.

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

// E utilizzando la funzione per restituire l'ultimo valore della colonna di identità.

// Nota: preleva solo la prima riga.

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

... Questo è essenzialmente un duplicato di una risposta che è stata pubblicata qui ** 2 anni fa **. Cosa differenzia la tua risposta da quella? –

Problemi correlati