SELECT from INSERT – Neue SQL Funktion in V6R1, Teil 2

9. Februar 2009 | Von | Kategorie: Programmierung

INSERT und SELECT waren vor V6R1 in DB2 für i5/OS zwei getrennte Operationen. Um eing fügte Spaltenwerte abzufragen, konnte eine nachfolgende SELECT Operation benutzt werden, um auf das Ziel einer INSERT Operation zuzugreifen. Nach Erläuterung der neuen Funktion, praktischen Informationen und syntaktischen Beispielen im ersten Teil des Artikels (erschienen in NEWSolutions, Ausgabe Januar/Februar 2009) …

balaton12_sail_MG_7653Zwei Operationen werden zu einer neuen Funktion

von Jinmei Shen und Karl Hanson INSERT und SELECT waren vor V6R1 in DB2 für i5/OS zwei getrennte Operationen. Um eingefügte Spaltenwerte abzufragen, konnte eine nachfolgende SELECT Operation benutzt werden, um auf das Ziel einer INSERT Operation zuzugreifen. Nach Erläuterung der neuen Funktion, praktischen Informationen und syntaktischen Beispielen im ersten Teil des Artikels (erschienen in NEWSolutions, Ausgabe Januar/Februar 2009) befassen sich die Autoren im heutigen zweiten Teil mit dem Einsatz von SELECT from INSERT auf dem System i.

Der Einsatz von SELECT from INSERT auf dem System i

Die folgenden Szenarien beschreiben einige Einsatzmöglichkeiten von SELECT from INSERT in DB2 für i5/OS und geben einen kurzen Einblick in die beteiligten Prozesse. Abfrage eines generierten Spaltenwertes für eine einzelne hinzugefügte Spalte

Über den Autor

Jinmei Shen (jinmeis(ät)us.ibm.com) ist als IBM Softwareentwicklerin in Rochester, Minnesota tätig und beschäftigt sich ca. 10 Jahren mit IBM DB2 für System i. Karl Hanson (kchanson(ät)us.ibm.com) ist als Softwareentwickler im IBM Entwicklungslabor in Rochester, Minnesota tätig und hat sich in der Vergangenheit mit den Betriebssystemen des System/38 und der AS/400 Produktlinie beschäftigt. Seit ca. 10 Jahren ist er Mitglied des IBM DB2 für System i Entwicklungsteams. Übersetzt und für den deutschsprachigen Markt überarbeitet von Joachim Riener.

Voraussetzungen:

Die Zieltabelle des INSERT ist vorhanden und enthält eine Spalte mit generierten Werten. Der Requester, der das INSERT ausführt, verfügt über die Berechtigung, der Zieltabelle Zeilen hinzuzufügen.

Ablauf:

  1. Ein Anwendungsprogramm wird aufgerufen, das ein SQL SELECT INTO Statement mit einem INSERT Statement in der FROM Klausel enthält. Das INSERT benutzt die VALUES Klausel, um eine einzelne neue Zeile in die Tabelle einzufügen (Abbildung 10).
  2. Das Anwendungsprogramm führt das SELECT INTO Statement aus und übergibt einen Wert für die Eingabespalte (custnum host variable) an den Datenbankmanager.
  3. DB2 verarbeitet den INSERT Request (eingebunden in das SELECT INTO) und fügt eine neue Zeile in die Tabelle orders ein. Hierbei wird ein Wert für die Spalte Auftragsnummer generiert.
  4. DB2 verarbeitet den SELCT INTO Request und gibt den für die Spalte Auftragsnummer generierten Wert zurück an das Anwendungsprogramm.
EXEC SQL SELECT inorder.ordernum INTO :ordnum

          FROM FINAL TABLE (INSERT INTO orders (custno)

                                   VALUES(:custnum) ) inorder ;

Abbildung 10: SQL Beispiel-Statement Abfrage einer gesonderten, mit den eingefügten Zeilen in Verbindung stehenden Spalte mit Hilfe eine Subquery

balaton12_sail_MG_7653

Voraussetzungen:

  • Es existieren zwei Tabellen: Das Ziel des INSERT und die Quelle der abgefragten Daten, die eingefügt werden sollen.
  • Der Requester, der das INSERT ausführt, verfügt über die Berechtigung, der Zieltabelle Zeilen hinzuzufügen.
  • Der Requester, der das INSERT ausführt, verfügt über die Berechtigung, Daten aus der abzufragenden Tabelle zu lesen.

Ablauf:

  1. Der Requester stellt eine Verbindung zu der DB2 für i5/OS Datenbank her.
  2. Der Requester führt ein SQL Script aus, das ein SELECT Statement mit einem INSERT Statement in der FROM Klausel enthält. Das INSERT verwendet eine Query, um die einzufügenden Zeilen zu ermitteln und spezifiziert eine INCLUDE-Spalte, die dem Result-Set (jedoch nicht der Zieltabelle) hinzugefügt werden soll (Abbildung 11).
  3. DB2 verarbeitet den (im SELECT enthaltenen) INSERT Request. Zeilen aus der Query der sales_summary Tabelle werden in die bonus_candidates Tabelle eingefügt. Die gleichen Zeilen werden ebenfalls – zusammen mit den Werten der ytd_sales Spalte aus der sales_summary Tabelle – in eine temporäre Ergebnistabelle eingefügt.
  4. Der Script Prozessor übernimmt die Zeilen aus der temporären Ergebnistabelle (Result-Set für das Outer SELECT). Jede zurückgegebene Zeile enthält alle in die bonus_candidates Tabelle eingefügten Spaltenwerte sowie die entsprechenden Werte der ytd_sales Spalten.
SELECT * FROM FINAL TABLE

  ( INSERT INTO bonus_candidates (empname, empserial, empsalary)

      INCLUDE inc_ytd_sales

      SELECT name, serial, salary, ytd_sales FROM sales_summary

        WHERE ytd_sales > 700000.00 )

Abbildung 11: SQL Beispiel-Statement mit einem INSERT in der FROM Klausel Query-Abfrage eines einzelnen Wertes, der sich aus einer variablen Anzahl der in eine Tabelle eingefügten Zeilen ergibt. Voraussetzungen:

  • Es existieren zwei Tabellen: Das Ziel des INSERT und die Quelle der abgefragten Daten, die eingefügt werden sollen.
  • Der Requester, der das INSERT ausführt, verfügt über die Berechtigung, der Zieltabelle Zeilen hinzuzufügen.
  • Der Requester, der das INSERT ausführt, verfügt über die Berechtigung, Daten aus der abzufragenden Tabelle zu lesen.

Ablauf:

  1. Der Requester ruft eine Anwendung auf, die die CLI SQL Schnittstelle bedient und übergibt einen einzelnen Parameterwert, der die in die Tabelle einzufügenden Zeilen spezifiziert.
  2. Das CLI Programm stellt eine SQL Verbindung zu der DB2 für i5/OS Datenbank her.
  3. Das CLI Programm bereitet ein SQL Statement vor, um einerseits eine variable Anzahl von Zeilen in eine Tabelle einzufügen und andererseits einen einzelnen Wert aus dem Result Set der eingefügten Zeilen zurückzugeben. (Abbildung 12).
  4. Das CLI Programm bindet Programmvariablen sowohl für den input parameter marker (WHERE Klausel) als auch für den output parameter marker des zuvor vorbereiteten Statements z. B. mit der API SQLSetParam(). Als Programmvariable für den input parameter marker wird der mit dem CLI Programmaufruf übergebene Input Parameterwert übernommen.
  5. Das CLI Programm führt das vorbereitete Statement aus.
  6. DB2 verarbeitet den (im SELECT enthaltenen) INSERT Request. Zeilen aus der Tabelle sales_summary werden in die Tabelle bonus_candidates eingefügt. Die gleichen Zeilen werden in eine temporäre Ergebnistabelle eingefügt. Die Zeilen der temporären Ergebnistabelle dienen als Eingabe für die Funktion AVG() in der Outer Query. Das Ergebnis dieses AVG() wird in die Programmvariable für den output parameter marker eingestellt.
VALUES ( SELECT AVG(C2) FROM FINAL TABLE

          (INSERT INTO VALI1 SELECT * FROM VALI2) WHERE C1 > ? )

       ) INTO ?

Abbildung 12: SQL Beispiel-Statement mit einem INSERT in der FROM Klausel Einfügen einer Zeile in eine Tabelle und Abfrage aller generierten Spaltenwerte der eingefügten Zeile unter Einsatz von JDBC Voraussetzungen:

  • Die Zieltabelle des INSERT existiert und verfügt über zumindest eine Spalte, die generierte Werte enthält.
  • Der Requester, der das INSERT ausführt, verfügt über die Berechtigung, der Zieltabelle Zeilen hinzuzufügen.

Ablauf:

  1. Der Requester stellt eine SQL Verbindung zu der i5/OS Datenbank her.
  2. Der Requester führt ein JAVA Programm aus, das die Option RETURN_GENERATED_KEYS aus der executeUpdate() Methode und die getGeneratedKeys() Statement Methode verwendet (Abbildung 13).
  3. Das JAVA Programm führt die executeUpdate Methode aus und veranlasst dadurch den JDBC Treiber, das INSERT Statement in ein SELECT Statement einzubinden.
  4. DB2 verarbeitet den (in das SELECT eingebundenen) INSERT Request. Eine neue Zeile wird in die Tabelle authors eingefügt und die Werte für Spalten wie beispielsweise die IDENTITY Spalte oder Spalten mit Unterlassungswerten, deren Werte nicht mit dem INSERT übergeben wurden, werden generiert. Die gleichen Zeilendaten (einschließlich der generierten Spaltenwerte) werden zusammen mit dem cursor für das vom JDBC Treiber gelieferte SELECT in eine temporäre Ergebnistabelle eingefügt. Das JAVA Programm führt die getGeneratedKeys() Methode aus, die den cursor für das SELECT öffnet und den Zugriff auf das Result Set des cursors erlaubt. Weitere Result Set Methoden laufen ab, um die generierten Spaltenwerte abzufragen.
String sql = "INSERT INTO authors (last, first, home) VALUES " +

             "'Shara', 'Ron', 'Minnesota, USA'";

int rows = stmt.executeUpdate(sql, Statement.RETURN_GENERATED_KEYS);

ResultSet rs = stmt.getGeneratedKeys();

if (rs.next()) {

  ResultSetMetaData rsmd = rs.getMetaData();

  int colCount = rsmd.getColumnCount();

  do {

    for (int i = 1; i <= colCount; i++) {

      String key = rs.getString(i);

      System.out.println("key " + i + " is " + key);

    }

  } while (rs.next());

}

else {

  System.out.println("There are no generated keys.");

}

Abbildung 13: SQL Beispiel-Statement mit einem INSERT in der FROM Klausel

Anmerkung:

Schlagworte: , , , , , , , , , , ,

Schreibe einen Kommentar

Sie müssen eingeloggt sein, um einen Kommentar schreiben.