カーソル変数は、複数行の問合せの実行時にデータベースによって処理情報が格納される名前の付けられていない作業領域を指します。 作業領域を指すこのポインタを使用して、その情報にアクセスし、問合せの行を個別に処理できます。
カーソル変数は、CやPascalのポインタに類似しており、項目のかわりに項目のアドレスを保持します。
カーソル変数を作成するには、REF
CURSOR
型を定義してから、その型のカーソル変数を宣言します。 カーソル変数を宣言すると、項目ではなくポインタが作成されます。
構文
ref_cursor_type_definition ::=
cursor_variable_declaration ::=
キーワードとパラメータの説明
cursor_name
現行の有効範囲の中で、事前に宣言されている明示カーソルを識別します。
cursor_variable_name
現行の有効範囲の中で事前に宣言されているPL/SQLカーソル変数を識別します。
db_table_name
宣言がPL/SQLコンパイラによって処理されるときにアクセスできる必要があるデータベースの表またはビューを識別します。
record_name
現行の有効範囲の中で事前に宣言されているユーザー定義のレコードを識別します。
record_type_name
データ型指定子RECORD
を使用して定義されたユーザー定義のレコード型を識別します。
REF CURSOR
カーソル変数のデータ型はすべてREF
CURSOR
です。
カーソル変数の戻り値のデータ型を指定します。 RETURN
句で%ROWTYPE
属性を使用すると、データベース表の行や、カーソルまたは強い型指定のカーソル変数によって戻される行を表すレコード型を与えることができます。 また、%TYPE
属性を使用して、事前に宣言されたレコードのデータ型を与えることもできます。
%ROWTYPE
データベース表の中の行、またはカーソルや強い型指定のカーソル変数からフェッチされる行を表すレコード型を指定します。 レコードの中のフィールドと、それに対応する行の中の列は、同じ名前とデータ型を持ちます。
%TYPE
事前に宣言されているユーザー定義のレコードのデータ型を指定します。
type_name
REF
CURSOR
として定義されたユーザー定義のカーソル変数型を識別します。
使用上の注意
REF
CURSOR
型定義は、ブロック、サブプログラム、パッケージ仕様部またはパッケージ本体の宣言部(この場合はブロック、サブプログラムまたはパッケージに対してローカルになります)、あるいはCREATE TYPE文(この場合はスタンドアロン・ストアド型になります)のいずれかで使用できます。
カーソル変数宣言は、ブロック、サブプログラムまたはパッケージ本体の宣言部でのみ使用できます(パッケージ仕様部では使用できません)。
カーソル変数は、すべてのPL/SQLクライアントで使用します。 たとえば、OCIやPro*CプログラムなどのPL/SQLホスト環境の中でカーソル変数を宣言し、それをバインド引数としてPL/SQLに渡すことができます。 PL/SQLエンジンを備えたアプリケーション開発ツールでは、クライアント側でカーソル変数を完全に使用できます。
データベース・リンクによるリモート・プロシージャの起動によって、アプリケーションとデータベース・サーバーの間でカーソル変数をやり取りできます。 クライアント側にPL/SQLエンジンがあれば、どちらの側でもカーソル変数を使用できます。 たとえば、クライアント側でカーソル変数を宣言し、それをサーバー側でオープンしてフェッチした後で、クライアント側で引き続きフェッチすることができます。
カーソル変数は、PL/SQLのストアド・サブプログラムとクライアント・プログラムとの間で問合せの結果セットを渡すために使用します。 PL/SQLとクライアント・プログラムはどちらも結果セットを所有せず、結果セットが格納されている作業領域を指すポインタを共有しています。 たとえば、OCIプログラム、Oracle Formsアプリケーションおよびデータベースがすべて同じ作業領域を参照する場合があります。
REF
CURSOR
型には、強いものと弱いものがあります。 強いREF
CURSOR
型定義では戻り型を指定しますが、弱い型定義では戻り型を指定しません。 強いREF
CURSOR
型の方が、エラー発生の可能性は少なくなります。これは、PL/SQLの場合、強い型指定のカーソル変数は型互換性のある問合せにしか関連付けることができないためです。 弱いREF
CURSOR
型は、より柔軟です。弱い型指定のカーソル変数は、どの問合せにも関連付けることができます。
REF
CURSOR
型を一度定義すれば、その型のカーソル変数を宣言できます。 %TYPE
を使用すると、レコード変数のデータ型を与えることができます。 また、REF
CURSOR
型定義のRETURN
句では、%ROWTYPE
を使用して、強い型指定(弱い型指定ではなく)のカーソル変数によって戻される行を表すレコード型を指定できます。
現在のところ、カーソル変数にはいくつかの制限があります。 「カーソル変数の制限」を参照してください。
カーソル変数の制御には、OPEN-FOR
、FETCH
およびCLOSE
の3つの文を使用します。 まず、OPEN
-FOR
文でカーソル変数を複数行問合せ用にオープンします。 次に、FETCH
文で結果セットから行を取り出します。 すべての行が処理された後に、CLOSE
文でカーソル変数をクローズします。
その他のOPEN-FOR
文は、異なる複数の問合せ用に同じカーソル変数をオープンできます。 カーソル変数を再オープンする場合、その前にクローズする必要はありません。 別の問合せ用にカーソル変数を再オープンすると、前の問合せは失われます。
PL/SQLでは、カーソル変数の戻り型が、必ずFETCH
文のINTO
句と互換性を持ちます。 カーソル変数に関連付けられた問合せが戻す列の値に対して、INTO
句の中に、対応する、型互換性のあるフィールドまたは変数が存在している必要があります。 また、フィールドまたは変数の数は、列の値の数と一致する必要があります。 それ以外の場合はエラーになります。
代入に関係する両方のカーソル変数が強い型指定である場合は、両方が同じデータ型であることが必要です。 ただし、一方または両方のカーソル変数が弱い型指定である場合は、同じデータ型でなくてもかまいません。
カーソル変数を、そのカーソル変数からフェッチするか、またはそのカーソル変数をクローズするサブプログラムの仮パラメータとして宣言する場合は、IN
またはIN
OUT
モードを指定する必要があります。 サブプログラムがカーソル変数をオープンする場合は、IN
OUT
モードを指定する必要があります。
カーソル変数をパラメータとして渡す場合は注意が必要です。 実パラメータと仮パラメータの戻り型に互換性がないと、実行時にPL/SQLによってROWTYPE_MISMATCH
が呼び出されます。
カーソル属性%FOUND
、%NOTFOUND
、%ISOPEN
、%ROWCOUNT
をカーソル変数に適用できます。
問合せ作業領域を指していないカーソル変数に対してフェッチまたはクローズを実行するか、カーソルの属性を適用しようとすると、PL/SQLによって事前定義の例外INVALID_CURSOR
が呼び出されます。 カーソル変数(またはパラメータ)が問合せ作業領域を指すようにするには、次の2通りの方法があります。
OPEN
-FOR
文でカーソル変数を問合せ用にオープンします。
OPEN
文ですでにオープンされたホスト・カーソル変数またはPL/SQLカーソル変数の値を、カーソル変数に代入します。
問合せ作業領域は、それを指すカーソル変数が存在するかぎりアクセスできます。 したがって、カーソル変数の値は、1つの有効範囲から別の有効範囲へ自由に渡すことができます。 たとえば、Pro*Cプログラムに組み込まれたPL/SQLブロックにホスト・カーソル変数を渡す場合、カーソル変数が指す作業領域は、そのブロックの終了後もアクセス可能な状態のままです。
関連トピック