IBM Buch

Verwaltung und Programmierung für OS/400

Gespeicherte Prozeduren

Eine gespeicherte Prozedur ist ein kompiliertes Programm, das in DB2 gespeichert ist und SQL-Anweisungen ausführen kann. In Net.Data werden gespeicherte Prozeduren von Net.Data-Funktionen mit Hilfe der Anweisung CALL aufgerufen. Parameter für gespeicherte Prozeduren werden aus der Parameterliste der Net.Data-Funktion übergeben. Sie können gespeicherte Prozeduren einsetzen, um die Leistung und die Integrität zu verbessern, indem Sie kompilierte SQL-Anweisungen auf dem Datenbank-Server speichern. Net.Data unterstützt die Verwendung gespeicherter Prozeduren unter DB2 über die SQL- und ODBC-Sprachumgebungen.

In diesem Abschnitt werden folgende Themen behandelt:

Syntax für gespeicherte Prozeduren

Die Syntax für die gespeicherte Prozedur verwendet die Anweisung FUNCTION, die Anweisung CALL und wahlfrei einen REPORT-Block.

%FUNCTION  function_name ([IN datatype arg1, INOUT datatype arg2, 
    OUT tablename, ...]) {
  CALL stored_procedure 
[%REPORT [(resultsetname)] { %}]
...
[%REPORT [(resultsetname)] { %}]
[%MESSAGE %}]
 
%}

Dabei gilt folgendes:

function_name
Ist der Name der Net.Data-Funktion, die den Aufruf der gespeicherten Prozedur initialisiert.

stored_procedure
Ist der Name der gespeicherten Prozedur.

datatype
Ist einer der von Net.Data unterstützten Datentypen der Datenbank wie in Tabelle 6 gezeigt. Die in der Parameterliste angegebenen Datentypen müssen mit den Datentypen in der gespeicherten Prozedur übereinstimmen. Weitere Informationen zu diesen Datentypen finden Sie in Ihrer Datenbankdokumentation.

tablename
Ist der Name einer Net.Data-Tabelle, in der die Ergebnismenge gespeichert werden soll (wird nur verwendet, wenn die Ergebnismenge in einer Net.Data-Tabelle gespeichert werden soll). Wenn dieser Parametername angegeben ist, muß er mit dem zugehörigen Parameternamen für resultsetname übereinstimmen.

resultsetname
Ist der Name, der ein von einer gespeicherten Prozedur zurückgegebenes Ergebnis einem REPORT-Block und/oder einem Tabellennamen in der Funktionsparameterliste zuordnet. Die Angabe resultsetname in einem REPORT-Block muß mit einer Angabe für tablename in der Funktionsparameterliste übereinstimmen.

Tabelle 6. Datentypen für gespeicherte Prozeduren
CHAR FLOAT SMALLINT
DATE GRAPHIC TIME
DECIMAL INTEGER TIMESTAMP
DOUBLE REAL VARCHAR
DOUBLEPRECISION
VARGRAPHIC






Aufrufen einer gespeicherten Prozedur

  1. Definieren Sie eine Funktion, die einen Aufruf an die gespeicherte Prozedur initialisiert.
    %FUNCTION (DTW_SQL) function_name() 
    

  2. Geben Sie wahlfrei IN-, INOUT- oder OUT-Parameter für die gespeicherte Prozedur an, einschließlich des Namens von Ergebnismengen, die von der gespeicherten Prozedur zurückgegeben werden. Sie können für die Tabellennamen bzw. Ergebnismengen auch IN- oder INOUT-Parameter aus einer anderen gespeicherten Prozedur angeben.
    %FUNCTION (DTW_SQL) function_name (IN datatype
    arg1, INOUT datatype arg2,
    OUT tablename...) 
    

  3. Geben Sie mit Hilfe der Anweisung CALL den Namen der gespeicherten Prozedur an.
     CALL stored_procedure
    

  4. Wenn die gespeicherte Prozedur nur eine Ergebnismenge generiert, können Sie wahlfrei einen REPORT-Block angeben, um zu definieren, wie Net.Data die Ergebnismenge anzeigen soll.
    %REPORT  {
    ...
    %}
    

    Beispiel:

    %FUNCTION (DTW_SQL) mystoredproc (IN CHAR(30) arg1 OUT mytable)  {
         CALL  myproc   
     %REPORT {
      ...
      %ROW {  ...   %}
      ...   
     %} 
    %}
    

  5. Wenn die gespeicherte Prozedur mehrere Ergebnismengen generiert, haben Sie folgende Möglichkeiten:

Übergeben von Parametern

Sie können Parameter an eine gespeicherte Prozedur übergeben und die gespeicherte Prozedur die Parameterwerte aktualisieren lassen, so daß die neuen Werte an das Net.Data-Makro zurückgegeben werden. Die Anzahl und der Typ der Parameter in der Funktionsparameterliste müssen mit der Anzahl und dem Typ übereinstimmen, die für die gespeicherte Prozedur definiert sind. Wenn z. B. ein Parameter in der für die gespeicherte Prozedur definierten Parameterliste INOUT ist, dann muß der entsprechende Parameter in der Funktionsparameterliste auch INOUT sein. Wenn ein Parameter in der für die gespeicherte Prozedur definierten Parameterliste vom Typ CHAR(30) ist, dann muß der entsprechende Parameter in der Funktionsparameterliste auch CHAR(30) sein.

Beispiel 1: Übergeben eines Parameterwerts an die gespeicherte Prozedur

%FUNCTION (DTW_SQL) mystoredproc (IN CHAR(30) valuein)  {
     CALL  myproc 
...

Beispiel 2: Zurückgeben eines Werts aus einer gespeicherten Prozedur

%FUNCTION (DTW_SQL) mystoredproc (OUT VARCHAR(9) retvalue)  {
     CALL  myproc  
...

Verarbeiten von Ergebnismengen

Sie können eine oder mehrere Ergebnismengen aus einer gespeicherten Prozedur zurückgeben. Die Ergebnismengen können in Net.Data-Tabellen zur weiteren Verarbeitung innerhalb Ihres Makros gespeichert oder mit Hilfe eines REPORT-Blocks verarbeitet werden. Wenn eine gespeicherte Prozedur mehrere Ergebnismengen generiert, müssen Sie jeder durch die gespeicherte Prozedur generierten Ergebnismenge einen Namen zuordnen. Dies geschieht durch die Angabe von Parametern in der Anweisung FUNCTION. Der Name, den Sie für eine Ergebnismenge angeben, kann anschließend einem REPORT-Block oder einer Net.Data-Tabelle zugeordnet werden, so daß Sie festlegen können, wie die einzelnen Ergebnismengen von Net.Data verarbeitet werden. Sie haben folgende Möglichkeiten:

Ergebnismengen werden immer in lokalen Tabellen gespeichert, so daß eine andere Funktion im Makro auch auf die Daten zugreifen kann. Zum Beispiel können Sie die Net.Data-Tabelle an eine andere Funktion übergeben, die die Daten zu Berechnungen und zum Anzeigen der berechneten Ergebnisse verwenden kann.

Richtlinien und Einschränkungen zur Verwendung mehrerer REPORT-Blöcke finden Sie in Richtlinien und Einschränkungen für mehrere REPORT-Blöcke.

Gehen Sie wie folgt vor, wenn nur eine Ergebnismenge zurückgegeben und diese in einem Standardbericht angezeigt werden soll:

Verwenden Sie die folgende Syntax:

%FUNCTION (DTW_SQL) function_name (OUT tablename) {
     CALL stored_procedure 
%}

Beispiel:

 %FUNCTION (DTW_SQL) mystoredproc(OUT mytable1) {
     CALL  myproc 
%}

Gehen Sie wie folgt vor, wenn nur eine Ergebnismenge zurückgegeben und ein REPORT-Block angegeben werden soll:

Verwenden Sie die folgende Syntax:

%FUNCTION (DTW_SQL) function_name (OUT tablename) {    
     CALL stored_procedure  [(resultsetname)]
 %REPORT [(resultsetname)] {
  ...
 %}
%}

Beispiel:

%FUNCTION (DTW_SQL) mystoredproc (OUT mytable1) {
     CALL  myproc   
%REPORT {
      ...
  %ROW {  ...   %}
      ...  
 %} 
%}

Alternativ kann die folgende Syntax verwendet werden:

%FUNCTION (DTW_SQL) function_name () {
    CALL stored_procedure  
 
 %REPORT () {
  ...
 %}
%}

Beispiel:

%FUNCTION (DTW_SQL) mystoredproc () {
    CALL myproc   
 %REPORT  {
  ...      
  %ROW {  ...   %}
  ...  
 %} 
%}

Gehen Sie wie folgt vor, wenn mehrere Ergebnismengen zurückgegeben und diese im Standardberichtsformat angezeigt werden sollen:

Verwenden Sie die folgende Syntax:

%FUNCTION (DTW_SQL) function_name (OUT tablename1, tablename2) {
    CALL stored_procedure 
%}

Dabei wird kein REPORT-Block angegeben.

Beispiel:

%DEFINE DTW_DEFAULT_REPORT = "YES"
%FUNCTION (DTW_SQL) mystoredproc (OUT mytable1, mytable2) {
     CALL  myproc
%}

Gehen Sie wie folgt vor, wenn mehrere Ergebnismengen zurückgegeben und REPORT-Blöcke für die Verarbeitung der Anzeige angegeben werden sollen:

Jede Ergebnismenge ist einem REPORT-Block oder mehreren REPORT-Blöcken zugeordnet. Verwenden Sie die folgende Syntax:

%FUNCTION (DTW_SQL) function_name (OUT tablename1, tablename2, ...) { 
   CALL stored_procedure 
 %REPORT (tablename1) 
   ...      
  %ROW {  ...   %}   
   ...   
 %}    
 %REPORT (tablename2)       
   ...      
  %ROW {  ...   %} 
   ...   
 %} 
 
...
%}

Beispiel:

%FUNCTION (DTW_SQL) mystoredproc (OUT mytable1, mytable2) {  
   CALL myproc    
 
 %REPORT (mytable1) {     
  ...    
  %ROW {  ...   %}     
  ...  
 %}   
 
 %REPORT(mytable2) {     
  ...     
  %ROW {  ...   %}     
  ...  
 %} 
%}


[ Seitenanfang | Vorherige Seite | Nächste Seite | Inhaltsverzeichnis | Index ]