Eine gespeicherte Prozedur ist ein kompiliertes Programm, das auf dem lokalen oder fernen DB2-Server gespeichert ist und SQL-Anweisungen ausführen kann. In Net.Data werden gespeicherte Prozeduren von Net.Data-Funktionen mit Hilfe der SQL-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.
In diesem Abschnitt werden folgende Themen behandelt:
Die Syntax für die gespeicherte Prozedur verwendet die Anweisung FUNCTION, die Anweisung CALL und wahlfrei einen REPORT-Block.
%function (dtw_sql) function_name ([IN datatype arg1, INOUT datatype arg2,
OUT tablename, ...])
CALL stored_procedure
[%REPORT(resultsetname...)]
Dabei gilt folgendes:
Tabelle 2. Datentypen für gespeicherte Prozeduren
| CHAR | FLOAT | TIME |
| DATE | GRAPHIC | TIMESTAMP |
| DECIMAL | INTEGER | VARCHAR |
| DOUBLE | REAL | VARGRAPHIC |
| DOUBLEPRECISION | SMALLINT |
|
|
|
|
|
|
|
|
|
Gehen Sie wie folgt vor, um eine gespeicherte Prozedur aufzurufen:
%function (dtw_sql) function_name()
%function (dtw_sql) function_name (IN datatype arg1, INOUT datatype arg2, OUT tablename...)
CALL stored_procedure
%report {
...
%}
Beispiel:
%function (dtw_sql) mystoredproc (IN CHAR(30) arg1 OUT mytable) {
CALL myproc
%report {
...
%row { ... %}
...
%}
%}
%function (dtw_sql) function_name (OUT tablename, ...)
%REPORT(resultsetname1) {
...
%}
Beispiel:
%function (dtw_sql) mystoredproc (IN CHAR(30) arg1, OUT table1, table2) {
CALL myproc
%report (table1) {
...
%row { ... %}
...
%}
%report (table1) {
...
%row { ... %}
...
%}
%}
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. Ein Parameter wird an eine gespeicherte Prozedur übergeben, indem der Parametername mit dem Schlüsselwort IN angegeben wird. Wenn eine gespeicherte Prozedur den Parameter aktualisiert, müssen Sie den Parameter für den zurückzugebenden Wert mit dem Schlüsselwort INOUT bzw. OUT übergeben. Der Datentyp, der für einen Parameter angegeben wird, muß mit dem übereinstimmen, den die gespeicherte Prozedur erwartet.
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
...
Sie können angeben, ob eine oder mehrere Ergebnismengen von einer gespeicherten Prozedur zurückgegeben werden. Die Ergebnismengen können in Net.Data-Tabellen zur weiteren Verarbeitung innerhalb Ihres Makros gespeichert oder mit Hilfe eines REPORT-Blocks angezeigt werden. Sie müssen jeder durch eine gespeicherte Prozedur generierten Ergebnismenge einen Namen zuordnen. Dies geschieht durch die Angabe von Parametern in der FUNCTION-Anweisung. 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 die Daten später in der Makrodatei verwenden 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 hinsichtlich der Verwendung mehrerer REPORT-Blöcke finden Sie im Abschnitt Richtlinien und Einschränkungen für mehrere REPORT-Blöcke.
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
%}
Wenn nur eine Ergebnismenge zurückgegeben und ein REPORT-Block für die Verarbeitung der Anzeige angegeben werden soll:
Verwenden Sie die folgende Syntax:
%function (dtw_sql) function_name (OUT tablename) {
CALL stored_procedure
%REPORT (resultsetname) {
...
%}
%}
Beispiel:
%function (dtw_sql) mystoredproc (OUT mytable1) {
CALL myproc
%REPORT (mytable1) {
...
%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 { ... %}
...
%}
%}
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 = "MULTIPLE"
%function (dtw_sql) mystoredproc (OUT mytable1, mytable2) {
CALL myproc
%}
Wenn mehrere Ergebnismengen zurückgegeben und REPORT-Blöcke für die Verarbeitung der Anzeige angegeben werden sollen:
Jeder Ergebnismenge wird ein eigener REPORT-Block zugeordnet. Verwenden Sie die folgende Syntax:
%function (dtw_sql) function_name (OUT tablename1, tablename2) {
CALL stored_procedure
%REPORT (resultsetname1)
...
%row { ... %}
...
%}
%REPORT (resultsetname2)
...
%row { ... %}
...
%}
%}
Beispiel:
%function (dtw_sql) mystoredproc (OUT mytable1, mytable2) {
CALL myproc
%REPORT (mytable1) {
...
%row { ... %}
...
%}
%REPORT(mytable2) {
...
%row { ... %}
...
%}
%}