この項では、カーソル変数の概要を簡単に説明します。詳細は、使用ホスト言語の補足資料および『Oracle Database PL/SQL言語リファレンス』を参照してください。
Pro*COBOLおよびPro*FORTRANプリコンパイラで静的埋込みSQLを使用すると、カーソル変数を宣言できます。カーソル変数は、カーソルと同じように、複数行の問合せのアクティブ・セットの中のカレント行を指します。カーソルとカーソル変数との違いは、定数と変数との違いと同じです。カーソルは静的で、カーソル変数は特定の問合せに結び付けられていないため、動的です。カーソル変数は、型の互換性のある任意の問合せに対してオープンできます。
また、カーソル変数に新しい値を割り当て、サブプログラム(Oracleデータベースに格納されているサブプログラムなど)にパラメータとして渡せます。これにより、データ検索を簡単に集中化できます。
まず、カーソル変数を宣言します。カーソル変数を宣言した後、次の4つの文を使用してカーソル変数を制御します。
ALLOCATE
OPEN ... FOR
FETCH
CLOSE
カーソル変数を宣言して、メモリーを割り当てたら、そのカーソル変数を入力ホスト変数(バインド変数)としてPL/SQLに渡します。サーバー側でOPEN、FORを使用して複数行の問合せのためにカーソル変数をオープンし、クライアント側ではその変数からFETCH
を行い、サーバー側かクライアント側のいずれかでCLOSE
します。
OPEN ... FOR
文を使用して、カーソル変数を複数行問合せに関連付け、問合せを実行し、アクティブ・セットを特定します。構文は次のとおりです。
EXEC SQL OPEN <cursor_variable> FOR <select_statement>;
SELECT
文では、入力ホスト変数およびPL/SQL変数、パラメータ、ファンクションを参照できますが、FOR UPDATE
には使用できません。次の例では、emp_cvという名前のカーソル変数をオープンします。
EXEC SQL OPEN emp_cv FOR SELECT * FROM EMP;
カーソル変数はサーバー側でオープンする必要があります。カーソル変数を入力ホスト変数として無名のPL/SQLブロックに渡すことでオープンします。実行時に、そのブロックはOracleサーバーに送られ、実行されます。次の例では、カーソル変数を宣言し、初期化してから、PL/SQLブロックに渡し、そこでカーソル変数がオープンされます。
EXEC SQL BEGIN DECLARE SECTION; ... -- declare cursor variable emp_cur SQL_CURSOR; EXEC SQL END DECLARE SECTION; -- initialize cursor variable EXEC SQL ALLOCATE :emp_cur; EXEC SQL EXECUTE -- pass cursor variable to PL/SQL block BEGIN -- open cursor variable OPEN :emp_cur FOR SELECT * FROM EMP; END; END-EXEC;
一般に、カーソル変数を仮パラメータの1つとして宣言するストアド・プロシージャをコールすることで、カーソル変数をPL/SQLに渡します。たとえば、次のパッケージ・プロシージャは、emp_cvという名前のカーソル変数をオープンします。
CREATE PACKAGE emp_data AS -- define REF CURSOR type TYPE EmpCurTyp IS REF CURSOR RETURN emp%ROWTYPE; -- declare formal paramter of that type PROCEDURE open_emp_cv (emp_cv IN OUT EmpCurTyp); END emp_data; CREATE PACKAGE BODY emp_data AS PROCEDURE open_emp_cv (emp_cv IN OUT EmpCurTyp) IS BEGIN -- open cursor variable OPEN emp_cv FOR SELECT * FROM emp; END open_emp_cv; END emp_data;
このパッケージ・プロシージャは、次のように、どのアプリケーションからでもコールできます。
EXEC SQL EXECUTE BEGIN emp_data.open_emp_cv(:emp_cur); END; END-EXEC;
複数行問合せのためにカーソル変数をオープンした後、FETCH
文を使用して、アクティブ・セットから行を1行ずつ取得します。構文は次のとおりです。
EXEC SQL FETCH cursor_variable_name INTO {record_name | variable_name[, variable_name, ...]};
カーソル変数によって戻される各列値は、データ型に互換性がある場合には、INTO
句で対応するフィールドまたは変数に割り当てられます。
FETCH
文は、クライアント側で実行する必要があります。次の例では、行をフェッチして、emp_recという名前のホスト・レコードに入れます。
-- exit loop when done fetching EXEC SQL WHENEVER NOT FOUND DO no_more; LOOP -- fetch row into record EXEC SQL FETCH :emp_cur INTO :emp_rec; -- process the data ENDLOOP;