Db2 11.1

Automatisch generierte Schlüssel für eine Anweisung INSERT abrufen

Mit dem IBM® Data Server Driver for JDBC and SQLJ können Sie JDBC 3.0-Methoden verwenden, um die Schlüssel abzurufen, die automatisch generiert werden, wenn Sie eine Anweisung INSERT ausführen.

Vorgehensweise

Wenn Sie automatisch generierte Schlüssel abrufen möchten, die von einer Anweisung INSERT generiert werden, müssen Sie die folgenden Schritte ausführen:

  1. Verwenden Sie eine der folgenden Methoden, um anzugeben, dass automatisch generierte Schlüssel zurückgegeben werden sollen:
    • Wenn Sie die Methode PreparedStatement.executeUpdate verwenden möchten, um Zeilen einzufügen, rufen Sie eine der folgenden Formen der Methode Connection.prepareStatement auf, um ein PreparedStatement -Objekt zu erstellen:

      Das folgende Formular ist für eine Tabelle in jeder Datenquelle gültig, die Identitätsspalten unterstützt. sql-statement muss eine einzeige_INSERT-Anweisung sein.

      Einschränkung: Für IBM Data Server Driver for JDBC and SQLJ Version 3.57 oder höher ist das folgende Format für das Einfügen von Zeilen in eine Sicht auf einem Db2 for z/OS-Datenserver nicht gültig.
      Connection.prepareStatement(sql-anweisung,
        Statement.RETURN_GENERATED_KEYS);

      Die folgenden Formulare sind nur gültig, wenn die Datenquelle SELECT FROM INSERT-Anweisungen unterstützt. sql-statement kann eine einzeiliges INSERT-Anweisung oder eine Anweisung INSERT mit mehreren Zeilen sein. Mit der ersten Maske geben Sie die Namen der Spalten an, für die automatisch generierte Schlüssel generiert werden sollen. Mit dem zweiten Formular geben Sie die Positionen in der Tabelle der Spalten an, für die automatisch generierte Schlüssel generiert werden sollen.

      Connection.prepareStatement(sql-anweisung, String [] spaltennamen);
      Connection.prepareStatement(sql-anweisung, int [] spaltenindizes);
    • Wenn Sie die Methode Statement.executeUpdate verwenden, um Zeilen einzufügen, rufen Sie eine der folgenden Formen der Methode Statement.executeUpdate auf:

      Das folgende Formular ist für eine Tabelle in jeder Datenquelle gültig, die Identitätsspalten unterstützt. sql-statement muss eine einzeige_INSERT-Anweisung sein.

      Einschränkung: Für IBM Data Server Driver for JDBC and SQLJ Version 3.57 oder höher ist das folgende Format für das Einfügen von Zeilen in eine Sicht auf einem Db2 for z/OS-Datenserver nicht gültig.
      Statement.executeUpdate(sql-anweisung, Statement.RETURN_GENERATED_KEYS);

      Die folgenden Formulare sind nur gültig, wenn die Datenquelle SELECT FROM INSERT-Anweisungen unterstützt. sql-statement kann eine einzeiliges INSERT-Anweisung oder eine Anweisung INSERT mit mehreren Zeilen sein. Mit der ersten Maske geben Sie die Namen der Spalten an, für die automatisch generierte Schlüssel generiert werden sollen. Mit dem zweiten Formular geben Sie die Positionen in der Tabelle der Spalten an, für die automatisch generierte Schlüssel generiert werden sollen.

      Statement.executeUpdate(sql-anweisung, String [] spaltennamen);
      Statement.executeUpdate(sql-anweisung, int [] spaltenindizes);
  2. Rufen Sie die Methode PreparedStatement.getGeneratedKeys oder die Methode Statement.getGeneratedKeys auf, um ein ResultSet -Objekt abzurufen, das die automatisch generierten Schlüsselwerte enthält.

    Wenn Sie den Parameter Statement.RETURN_GENERATED_KEYS angeben, ist der Datentyp der automatisch generierten Schlüssel in ResultSet DECIMAL, unabhängig vom Datentyp der entsprechenden Spalte.

Beispiel

Der folgende Code erstellt eine Tabelle mit einer Identitätsspalte, fügt eine Zeile in die Tabelle ein und ruft den automatisch generierten Schlüsselwert für die Identitätsspalte ab. Die Zahlen rechts von den ausgewählten Anweisungen entsprechen den zuvor beschriebenen Schritten.
import java.sql.*;
import java.math.*;
import com.ibm.db2.jcc.*;

Connection con;
Statement stmt;
ResultSet rs;
java.math.BigDecimal iDColVar;
…
stmt = con.createStatement();         // Anweisungsobjekt erstellen

stmt.executeUpdate( 
  "CREATE TABLE EMP_PHONE (EMPNO CHAR(6), PHONENO CHAR(4), " +
    "IDENTCOL INTEGER GENERATED ALWAYS AS IDENTITY)"); 
                                      // Tabelle mit Identitätsspalte erstellen
stmt.executeUpdate("INSERT INTO EMP_PHONE (EMPNO, PHONENO) " +                    1 
  "VALUES ('000010', '5555')",        // Zeile einfügen
  Statement.RETURN_GENERATED_KEYS);   // Angeben, dass automatisch generierte
                                      // Schlüssel zurückgegeben werden sollen
rs = stmt.getGeneratedKeys();         // Automatisch generierten Schlüssel-        2 
                                      // wert in Ergebnismenge abrufen
                                      // Rückgabe einer einzigen Zeile
                                      // Ergebnismenge für Abfrage erstellen
while (rs.next()) {
  java.math.BigDecimal idColVar = rs.getBigDecimal(1);     
                                      // Automatisch generierten
                                      // Schlüsselwert abrufen
  System.out.println("automatically generated key value = " + idColVar);
}
rs.close();                           // Ergebnismenge schließen
stmt.close();                         // Anweisung schließen
Der folgende Code erstellt eine Tabelle mit einer Identitätsspalte, fügt zwei Zeilen mithilfe einer Anweisung INSERT mit mehreren Zeilen in die Tabelle ein und ruft die automatisch generierten Schlüsselwerte für die Identitätsspalte ab. Die Zahlen rechts von den ausgewählten Anweisungen entsprechen den zuvor beschriebenen Schritten.
import java.sql.*;
import java.math.*;
import com.ibm.db2.jcc.*;

Connection con;
Statement stmt;
ResultSet rs;
…
stmt = con.createStatement();

stmt.executeUpdate(                                                      
  "CREATE TABLE EMP_PHONE (EMPNO CHAR(6), PHONENO CHAR(4), " +
  "IDENTCOL INTEGER GENERATED ALWAYS AS IDENTITY)");
                                      // Tabelle mit Identitätsspalte erstellen
String[] id_col = {"IDENTCOL"};
int updateCount =                                                                  1 
  stmt.executeUpdate("INSERT INTO EMP_PHONE (EMPNO, PHONENO)" +
  "VALUES ('000010', '5555'), ('000020', '5556')", id_col);
                                      // Zwei Zeilen einfügen
                                      // Angeben, dass automatisch generierte
                                      // Schlüssel zurückgegeben werden sollen
rs = stmt.getGeneratedKeys();         // Automatisch generierte Schlüssel-         2 
                                      // werte in Ergebnismenge abrufen
                                      // Es werden zwei Zeilen zurückgegeben.
                                      // Ergebnismenge für Abfrage erstellen
while (rs.next()) {
 int idColVar = rs.getInt(1);     
                                      // Automatisch generierte
                                      // Schlüsselwerte abrufen
 System.out.println("automatically generated key value = " + idColVar);
}
stmt.close();
con.close();