Mit den Anweisungen execute, open und get können Sie eine gespeicherte SQL-Prozedur aufrufen; in jedem dieser Fälle wird die #sql-Direktive verwendet.
Eine gespeicherte Prozedur besteht (wie eine Funktion in EGL) aus einer Gruppe von Anweisungen für eine Datenbank. Gespeicherte Prozeduren unterscheiden sich von vorbereiteten Anweisungen dahingehend, dass die gespeicherte Prozedur permanent in der Datenbank verbleibt, während eine vorbereitete Anweisung für das Programm oder den Logikabschnitt lokal ist und von der Datenbank nur vorübergehend zwischengespeichert wird. Eine gespeicherte Prozedur kann außerdem aus vielen SQL-Anweisungen bestehen, während eine vorbereitete Anweisung nur aus einer SQL-Anweisung besteht. Grundsätzlich können mit einer gespeicherten Prozedur jedoch dieselben Instruktionen ausgeführt werden wie mit einer vorbereiteten Anweisung.
Das Schlüsselwort execute ist zum Aufrufen gespeicherter Prozeduren geeignet, die keine Ergebnismenge zurückgeben. Ferner können mit execute gespeicherte Prozeduren aufgerufen werden, die eine oder mehrere Ergebnismengen zurückgeben, wobei die Ergebnismengen in diesem Fall aber ignoriert werden.
execute #sql{
CALL MYSTOREDPROCEDURE
};
myParameter int = 5;
execute #sql{
CALL MYSTOREDPROCEDURE(:myParameter)
};
prepare p1 from "CALL MYSTOREDPROCEDURE(?)";
execute p1 using myParameter;
Mit dem Schlüsselwort open können nur gespeicherte Prozeduren aufgerufen werden, die genau eine Ergebnismenge zurückgeben. Bei gespeicherten Prozeduren, die keine oder mehrere Ergebnismengen zurückgeben, wird die Anweisung execute verwendet.
open myResultSet with #sql{
CALL GETCUSTOMERS
};
Dann können Sie über die ID myResultSet auf die Ergebnismenge zugreifen (siehe
folgendes Beispiel, in dem ein Datensatzabschnitt (Stereotyp SQLRecord) namens
MyCustomerPart verwendet wird:myCustomers MyCustomerPart;
get next from myResultSet into myCustomers;
myParameter int = 5;
open myResultSet with #sql{
CALL GETCUSTOMERS(:myParameter)
};
prepare p1 from "CALL GETCUSTOMERS(?)";
open myResultSet with p1 using myParameter;
Sie können das Schlüsselwort get zusammen mit einer dynamischen Feldgruppe verwenden, um nur gespeicherte Prozeduren aufzurufen, die genau eine Ergebnismenge zurückgeben. Bei gespeicherten Prozeduren, die keine oder mehrere Ergebnismengen zurückgeben, wird die Anweisung execute verwendet.
myCustomers MyCustomerPart[]{};
get myArray with #sql{
CALL GETCUSTOMERS
};
myCustomers MyCustomerPart[]{};
myParameter int = 5;
get myArray with #sql{
CALL GETCUSTOMERS(:myParameter)
};
myCustomers MyCustomerPart[]{};
myParameter int = 5;
prepare p1 from "CALL GETCUSTOMERS(?)";
get myCustomers with p1 using myParameter;
Wenn Sie mit einer Oracle-Datenbank arbeiten, können Sie entweder eine gespeicherte Prozedur oder eine gespeicherte Funktion aufrufen.
open rs1 with #sql { call p1( ? ) };
x int = 10;
y int = 1000;
open rs2 with #sql { call p2( ?, :x, :y ) };
prepare pstmt3 from "call p1( ? )";
open rs3 with pstmt3;
prepare pstmt4 from "call p2( ?, ?, ? )";
open rs4 with pstmt4 using x, y;
execute #sql{ CREATE OR REPLACE PACKAGE MYPKG
AS
TYPE RC12 IS REF CURSOR;
END; };
execute #sql{ CREATE PROCEDURE ZPQPRM2( c IN OUT MYPKG.RC12, x IN CHAR )
AS
BEGIN
OPEN c FOR SELECT firstnme, empno FROM empx WHERE empno > x ORDER BY empno;
END; };
Darüber hinaus können in Oracle gespeicherte Funktionen erstellt werden. Eine gespeicherte Funktion entspricht einer gespeicherten Prozedur mit der Ausnahme, dass ein Wert zurückgegeben wird (gespeicherte Oracle-Prozeduren können keine Werte zurückgeben). Eine gespeicherte Oracle-Funktion kann in EGL aufgerufen werden. Dazu wird eine SQL-Syntax verwendet, die sich geringfügig von der Syntax für den Aufruf einer gespeicherten Prozedur unterscheidet.
x int;
y string = "hello";
execute #sql{ call :x := func1( :y ) };
writeStdout( "The function returned " :: x );
prepare q from "call ? := func1( ? )";
execute q using x, y;
writeStdout( "The function returned " :: x );
open rs5 with #sql { call ? := f5() };
x int = 10;
y int = 1000;
open rs6 with #sql { call ? := f6( :x, :y ) };
prepare pstmt7 from "call ? := f5()";
open rs7 with pstmt7;
prepare pstmt8 from "call ? := f6( ?, ? )";
open rs8 with pstmt8 using x, y;
Für die Verwendung gespeicherter Prozeduren in EGL gelten die folgenden Einschränkungen: