ストアード・プロシージャーの呼び出し
SQL ストアード・プロシージャーは、execute ステートメント、open ステートメント、または get ステートメントと、#sql ディレクティブを使用して呼び出すことができます。
ストアード・プロシージャーは、EGL における関数に似た、データベースに関する命令のセットです。 ストアード・プロシージャーは、準備済みステートメントとは異なります。ストアード・プロシージャーはデータベース自体の中に永続的に維持されますが、準備済みステートメントはプログラムまたは論理パーツに対してローカルであり、データベースでは一時的にしかキャッシュされません。 また、ストアード・プロシージャーは多くの SQL ステートメントから構成することができますが、準備済みステートメントは 1 つの SQL ステートメントからしか構成できません。 ただし基本的には、準備済みステートメントで実行するのと同じ命令をストアード・プロシージャーでも実行することができます。
前提条件
- EGL プロジェクトおよびプログラムまたはその他の論理パーツ
- ストアード・プロシージャーを含む SQL データベース
execute によるストアード・プロシージャーの呼び出し
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 によるストアード・プロシージャーの呼び出し
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 によるストアード・プロシージャーの呼び出し
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 DBMS に関する特別な考慮事項
Oracle データベースで作業を行う場合、ストアード・プロシージャーまたは ストアード・ファンクションを呼び出すことができます。
- プロシージャーは少なくとも 1 つのパラメーターを持つ必要があります。
- 最初のパラメーターは、out または inOut 修飾子を持ち、REF CURSOR タイプ (このタイプの定義方法の例は後で示 します) である必要があります。カーソル変数と呼ばれる、このタイプに基づいた変数は、 プログラムのパーツ間で結果セットを受け渡すことができます。
- 以下の例に示すように、疑問符 (?) でプロシージャーの最初のパラメーターを表します。
- プロシージャー呼び出しが準備済みステートメント内にある場合は、最初のパラメーターの using 節に何も含めないでください。他にパラメーターがない場合は、 using 節を省略します。
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 );
- EGL open または get ステートメントで関数を呼び出す
- 関数は REF CURSOR タイプを返さなければならない
- 関数が返す値を表すには、open ステートメントが実行する SQL コードに 疑問符 (?) マークを組み込まなければならない
- 関数呼び出しが準備済みステートメント内にある場合は、最初の疑問符 (?) の using 節に何も含めない。関数にパラメーターがない場合、using 節を省略します。
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 でストアード・プロシージャーを使用する場合は、以下の制限事項が適用されます。
- open または get を使用してストアード・プロシージャーを呼び出せるのは、そのストアード・プロシージャーが 1 つの結果セットのみを戻す場合に限られます。
- ストアード・プロシージャーに out パラメーターが含まれる場合、Microsoft SQL Server DBMS に関するストアード・プロシージャーを呼び出すことはできません。