匿名ブロックは何も返すことができません。ブロック内で、コレクションタイプや参照カーソルなどのバインド変数に値を割り当てることができます。ただし、コレクションは、ブロックの外部で定義および宣言する必要があります。つまり、PL / SQLで定義されているものではなく、プレーンSQLで使用できるタイプである必要があります。現時点では、ブロック内で定義されているPL / SQL型と、ブロック内で宣言されている変数も使用しているため、クライアントのスコープ外であり、外部でも有効な型ではありません。 。 (初期化する必要もありませんが、それは小さな問題です)。
実際にどのように消費されるかに応じて、1つのオプションは参照カーソルを使用することです。これは、SQL*PlusまたはSQLDeveloperを使用してvariable
を使用して宣言および表示できます。 およびprint
コマンド。例:
variable rc sys_refcursor
begin
open :rc for ( select ... /* your cursor statement */ );
end;
/
print rc
クライアントアプリケーションから同様のことを行うことができます。参照カーソルまたは参照カーソルであるoutパラメータを持つプロシージャを返す関数があり、それをアプリケーションからバインドします。次に、結果セットとしてrefカーソルを繰り返し処理します。ただし、詳細はアプリケーションが使用している言語によって異なります。
もう1つのオプションは、テーブルタイプを返すパイプライン関数を使用することです。これもSQLレベルで定義されています(create type
を使用)。 )PL/SQLにはありません-一度に返されるコレクションよりも少ないリソースを消費する可能性があります。
しかし、なぜあなたがこれをしているのか疑問に思う必要があります。 「後のバッチを掘り下げるにはかなり時間がかかる」とおっしゃいましたが、これはクエリでページングメカニズムを使用し、行番号を生成してから、その中の100の範囲を選択しているようです。クライアント/アプリケーションがすべての行を取得したい場合は、単一のクエリを実行する方が簡単ですが、フェッチ 結果セットをバッチで。
残念ながら、アプリケーションに関する情報がなければ、これは単なる憶測です...