ヘッダーをスキップ
Oracle Database PL/SQL言語リファレンス
11g リリース1(11.1)
E05670-03
  目次
目次
索引
索引

戻る
戻る
 
次へ
次へ
 

カーソル変数宣言

カーソル変数は、複数行の問合せの実行時にデータベースによって処理情報が格納される名前の付けられていない作業領域を指します。 作業領域を指すこのポインタを使用して、その情報にアクセスし、問合せの行を個別に処理できます。

カーソル変数は、CやPascalのポインタに類似しており、項目のかわりに項目のアドレスを保持します。

カーソル変数を作成するには、REF CURSOR型を定義してから、その型のカーソル変数を宣言します。 カーソル変数を宣言すると、項目ではなくポインタが作成されます。

構文

ref_cursor_type_definition ::=

ref_cursor_type_definition
ref_cursor_type_definition.gifの説明

cursor_variable_declaration ::=

cursor_variable_declaration
ref_cursor_var_decl.gifの説明

キーワードとパラメータの説明

cursor_name

現行の有効範囲の中で、事前に宣言されている明示カーソルを識別します。

cursor_variable_name

現行の有効範囲の中で事前に宣言されているPL/SQLカーソル変数を識別します。

db_table_name

宣言がPL/SQLコンパイラによって処理されるときにアクセスできる必要があるデータベースの表またはビューを識別します。

record_name

現行の有効範囲の中で事前に宣言されているユーザー定義のレコードを識別します。

record_type_name

データ型指定子RECORDを使用して定義されたユーザー定義のレコード型を識別します。

REF CURSOR

カーソル変数のデータ型はすべてREF CURSORです。

RETURN

カーソル変数の戻り値のデータ型を指定します。 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-FORFETCHおよび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通りの方法があります。

問合せ作業領域は、それを指すカーソル変数が存在するかぎりアクセスできます。 したがって、カーソル変数の値は、1つの有効範囲から別の有効範囲へ自由に渡すことができます。 たとえば、Pro*Cプログラムに組み込まれたPL/SQLブロックにホスト・カーソル変数を渡す場合、カーソル変数が指す作業領域は、そのブロックの終了後もアクセス可能な状態のままです。

関連トピック