各種リレーショナル・データベースでは、ストアド・プロシージャで結果セット(1つ以上の行セット)を戻すことができます。
従来、データベースのストアド・プロシージャの動作は、高水準プログラミング言語のプロシージャと同じでした。引数の数は一定で、IN
、OUT
またはIN OUT
型を使用できました。プロシージャにn
引数が指定されている場合は、結果として最大n
個の値が戻されます。ただし、ストアド・プロシージャでSELECT * FROM emp
などの問合せを実行して結果を戻す必要がある場合があります。emp
表の列数は固定ですが、プロシージャの作成時には行数を指示する手段がありません。このため、このような問合せの結果を戻す従来のストアド・プロシージャを作成できませんでした。その結果、複数のリレーショナル・データベース・ベンダーがストアド・プロシージャから結果セットを戻す機能を追加していますが、戻す方法はリレーショナル・データベースごとに異なっています。
Oracleには、REF CURSOR
というデータ型が用意されています。ストアド・プロシージャでは、他のすべてのOracleデータ型と同様に、このデータ型をIN
またはOUT
引数として使用できます。Oracle Databaseでは、ストアド・プロシージャにはREF CURSOR
型の出力引数が必要です。次に、SQL文のカーソルをオープンし、その出力パラメータのそのカーソルにハンドルを置きます。これにより、コール元は他のカーソルの場合と同じ方法でREF CURSOR
から取得できます。
Oracle Databaseは、結果セットを戻す以外に多くの処理を行うことができます。REF CURSOR
データ型をPL/SQLルーチンに入力引数として渡し、クライアント・プログラムとPL/SQLルーチン間、または複数のPL/SQLルーチン間でやり取りできます。