ストアード・プロシージャーの呼び出し

SQL ストアード・プロシージャーは、execute ステートメント、open ステートメント、または get ステートメントと、#sql ディレクティブを使用して呼び出すことができます。

ストアード・プロシージャーは、EGL における関数に似た、データベースに関する命令のセットです。 ストアード・プロシージャーは、準備済みステートメントとは異なります。ストアード・プロシージャーはデータベース自体の中に永続的に維持されますが、準備済みステートメントはプログラムまたは論理パーツに対してローカルであり、データベースでは一時的にしかキャッシュされません。 また、ストアード・プロシージャーは多くの SQL ステートメントから構成することができますが、準備済みステートメントは 1 つの SQL ステートメントからしか構成できません。 ただし基本的には、準備済みステートメントで実行するのと同じ命令をストアード・プロシージャーでも実行することができます。

前提条件

execute によるストアード・プロシージャーの呼び出し

execute キーワードは、結果セットを戻さないストアード・プロシージャーの呼び出しに適しています。 execute を使用して、1 つ以上の結果セットを戻すストアード・プロシージャーを呼び出すこともできますが、この場合、結果セットは無視されます。

execute でストアード・プロシージャーを呼び出すためには、#sql ディレクティブを使用し、次のように明示的な SQL 内でストアード・プロシージャーの名前を指定してください。
execute #sql{
    CALL MYSTOREDPROCEDURE
};
ストアード・プロシージャーがパラメーターを受け入れる場合には、次のように、EGL 変数をホスト変数として渡してください (ホスト変数を参照してください)。
myParameter int = 5;
execute #sql{
    CALL MYSTOREDPROCEDURE(:myParameter)
};
以下の例は、execute ステートメントと組み合わせて prepare 文を使用しています。
prepare p1 from "CALL MYSTOREDPROCEDURE(?)";
execute p1 using myParameter;

open によるストアード・プロシージャーの呼び出し

open キーワードを使用して、1 つの結果セットのみを戻すストアード・プロシージャーを呼び出すことができます。 結果セットを戻さないストアード・プロシージャー、または複数の結果セットを戻すストアード・プロシージャーを呼び出すためには、execute を使用してください。

open でストアード・プロシージャーを呼び出すためには、#sql ディレクティブを使用し、次のように明示的な SQL 内でストアード・プロシージャーの名前を指定してください。
open myResultSet with #sql{
    CALL GETCUSTOMERS
};
その後で、次の例のように、myResultSet ID を使用して結果セットにアクセスできます (この例では、MyCustomerPart という名前のレコード・パーツ (ステレオタイプ SQLRecord) を想定しています)。
myCustomers MyCustomerPart;
get next from myResultSet into myCustomers;
ストアード・プロシージャーがパラメーターを受け入れる場合には、次のように、EGL 変数をホスト変数として渡してください。
myParameter int = 5;
open myResultSet with #sql{
    CALL GETCUSTOMERS(:myParameter)
};
以下の例は、open ステートメントと組み合わせて prepare 文を使用しています。
prepare p1 from "CALL GETCUSTOMERS(?)";
open myResultSet with p1 using myParameter;

get によるストアード・プロシージャーの呼び出し

get キーワードを動的配列とともに使用して、正確に 1 つの結果セットを戻すストアード・プロシージャーのみを呼び出すことができます。結果セットを戻さないストアード・プロシージャー、または複数の結果セットを戻すストアード・プロシージャーを呼び出すためには、execute を使用してください。

get でストアード・プロシージャーを呼び出すためには、#sql ディレクティブを使用し、次のように明示的な SQL 内でストアード・プロシージャーの名前を指定してください。
myCustomers MyCustomerPart[]{};
get myArray with #sql{
    CALL GETCUSTOMERS
};
ストアード・プロシージャーがパラメーターを受け入れる場合には、次のように、EGL 変数をホスト変数として渡してください。
myCustomers MyCustomerPart[]{};
myParameter int = 5;
get myArray with #sql{
    CALL GETCUSTOMERS(:myParameter)
};
以下の例は、get ステートメントと組み合わせて prepare 文を使用しています。
myCustomers MyCustomerPart[]{};
myParameter int = 5;
prepare p1 from "CALL GETCUSTOMERS(?)";
get myCustomers with p1 using myParameter;

Oracle DBMS に関する特別な考慮事項

Oracle データベースで作業を行う場合、ストアード・プロシージャーまたは ストアード・ファンクションを呼び出すことができます。

Oracle データベースを使用する場合、ストアード・プロシージャーを呼び出すための open または get ステートメントの使用に適用される以下の 固有の規則があります。
  • プロシージャーは少なくとも 1 つのパラメーターを持つ必要があります。
  • 最初のパラメーターは、out または inOut 修飾子を持ち、REF CURSOR タイプ (このタイプの定義方法の例は後で示 します) である必要があります。カーソル変数と呼ばれる、このタイプに基づいた変数は、 プログラムのパーツ間で結果セットを受け渡すことができます。
  • 以下の例に示すように、疑問符 (?) でプロシージャーの最初のパラメーターを表します。
  • プロシージャー呼び出しが準備済みステートメント内にある場合は、最初のパラメーターの using 節に何も含めないでください。他にパラメーターがない場合は、 using 節を省略します。
最初の例では、#sql ディレクティブを使用しており、 プロシージャーにはカーソル変数以外のパラメーターはありません。
open rs1 with #sql { call p1( ? ) };
次の例でも、 #sql を使用しており、プロシージャーにはカーソル変数の他に、 2 つのパラメーターがあります。
x int = 10;
y int = 1000;
open rs2 with #sql { call p2( ?, :x, :y ) };
次の例では、準備済みステートメントを使用しており、プロシージャーにはカーソル変数以外の パラメーターはありません。
prepare pstmt3 from "call p1( ? )";
open rs3 with pstmt3;
次の例では、準備済みステートメントを使用しており、 プロシージャーにはカーソル変数の他に、 2 つのパラメーターがあります。
prepare pstmt4 from "call p2( ?, ?, ? )";
open rs4 with pstmt4 using x, y;
次の例は、Oracle に REF CURSOR タイプを定義する 1 つの 方法を示します。(他の方法については、ご使用の Oracle の資料を参照してください。)
execute #sql{ CREATE OR REPLACE PACKAGE MYPKG
   AS
      TYPE RC12 IS REF CURSOR;
   END; };
上のコードでは、MYPKG.RC12 という新しいタイプが作成されます。 このタイプは、照会の結果を保持するパラメーターのタイプとして使用できます。 次の EGL コードは、EGL openステートメントを使用して呼び出すことができる ストアード・プロシージャーを定義します。
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 は、クエリーの結果を返す Oracle ストアード・ファンクションを呼び出す ことができます。以下の規則が適用されます。
  • EGL open または get ステートメントで関数を呼び出す
  • 関数は REF CURSOR タイプを返さなければならない
  • 関数が返す値を表すには、open ステートメントが実行する SQL コードに 疑問符 (?) マークを組み込まなければならない
  • 関数呼び出しが準備済みステートメント内にある場合は、最初の疑問符 (?) の using 節に何も含めない。関数にパラメーターがない場合、using 節を省略します。
最初の例では、#sql ディレクティブを使用しており、 関数にはカーソル変数以外のパラメーターはありません。
open rs5 with #sql { call ? := f5() };
また、次の例でも #sql を使用しており、この関数には カーソル変数の他に 2 つのパラメーターがあります。
x int = 10;
y int = 1000;
open rs6 with #sql { call ? := f6( :x, :y ) };
次の例では、準備済みステートメントを使用しており、関数にはカーソル変数以外の パラメーターはありません。
prepare pstmt7 from "call ? := f5()";
open rs7 with pstmt7;
次の例では、準備済みステートメントを使用しており、 関数にはカーソル変数の他に、 2 つのパラメーターがあります。
prepare pstmt8 from "call ? := f6( ?, ? )";
open rs8 with pstmt8 using x, y;

制限

EGL でストアード・プロシージャーを使用する場合は、以下の制限事項が適用されます。


フィードバック