SQL ストアード・プロシージャーは、execute ステートメント、open ステートメント、または get ステートメントと、#sql ディレクティブを使用して呼び出すことができます。
ストアード・プロシージャーは、EGL における関数に似た、データベースに関する命令のセットです。 ストアード・プロシージャーは、準備済みステートメントとは異なります。ストアード・プロシージャーはデータベース自体の中に永続的に維持されますが、準備済みステートメントはプログラムまたは論理パーツに対してローカルであり、データベースでは一時的にしかキャッシュされません。 また、ストアード・プロシージャーは多くの SQL ステートメントから構成することができますが、準備済みステートメントは 1 つの SQL ステートメントからしか構成できません。 ただし基本的には、準備済みステートメントで実行するのと同じ命令をストアード・プロシージャーでも実行することができます。
execute キーワードは、結果セットを戻さないストアード・プロシージャーの呼び出しに適しています。 execute を使用して、1 つ以上の結果セットを戻すストアード・プロシージャーを呼び出すこともできますが、この場合、結果セットは無視されます。
execute #sql{
CALL MYSTOREDPROCEDURE
};
myParameter int = 5;
execute #sql{
CALL MYSTOREDPROCEDURE(:myParameter)
};
prepare p1 from "CALL MYSTOREDPROCEDURE(?)";
execute p1 using myParameter;
open キーワードを使用して、1 つの結果セットのみを戻すストアード・プロシージャーを呼び出すことができます。 結果セットを戻さないストアード・プロシージャー、または複数の結果セットを戻すストアード・プロシージャーを呼び出すためには、execute を使用してください。
open myResultSet with #sql{
CALL GETCUSTOMERS
};
その後で、次の例のように、myResultSet ID を使用して結果セットにアクセスできます (この例では、MyCustomerPart という名前のレコード・パーツ (ステレオタイプ SQLRecord) を想定しています)。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;
get キーワードを動的配列とともに使用して、正確に 1 つの結果セットを戻すストアード・プロシージャーのみを呼び出すことができます。結果セットを戻さないストアード・プロシージャー、または複数の結果セットを戻すストアード・プロシージャーを呼び出すためには、execute を使用してください。
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;
Oracle データベースで作業を行う場合、ストアード・プロシージャーまたは ストアード・ファンクションを呼び出すことができます。
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; };
また、ストアード・ファンクションを Oracle 内で作成することができます。ストアード・ファンクションは、値を返すこと以外はストアード・プロシージャーと同じです (Oracle のストアード・プロシージャーは値を返すことができません)。ストアード・プロシージャー呼び出しの場合とは 少し異なる SQL 構文を使用して、EGL から Oracle ストアード・ファンクションを 呼び出すことができます。
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;
EGL でストアード・プロシージャーを使用する場合は、以下の制限事項が適用されます。