web-dev-qa-db-ja.com

Oracleでsys_refcursorをいつどのように使用するか

誰かがsys_refcursorをいつどのように使用する必要があるかについて簡単な説明を教えてもらえますか?

9

カーソルは、クエリの結果セットへのポインタです。 sys_refcursorを返すことで、クライアントは必要に応じてクエリから行をフェッチすることができます。ステートフルアプリケーションでは、これを使用して結果をページングできます。

カーソルは、フェッチする行の数と停止するタイミングをクライアントに完全に委ねるため、配列を返すPL/SQL関数を作成するよりも柔軟性があります。とは言っても、この追加の柔軟性が役立つケースはあまり見当たりません。

sys_refcursorは弱い型指定であるため、異なるfrom句やwhere句だけでなく、列の数や型も異なるクエリへのポインタを返すことができることに注意してください。または、結果セットの列が固定されている厳密に型指定されたカーソルを使用できます。

これにより、次のように、さまざまなクエリを返す関数を作成できます。

create function get_data ( type varchar2 ) return sys_refcursor as
  ret_cur sys_refcursor;
begin

  if type = 'EMP' then
    open ret_cur for select * from emp;
  elsif type = 'DEPT' then
    open ret_cur for select * from dept;
  end if;

  return ret_cur;
end;

ただし、sys_refcursorを使用して上記のような一般的な「クエリを開く」関数を作成している場合は、おそらく何か問題があります!

9
Chris Saxon

可能性の例としては、後ろにpl/sqlがあるため、行を表すオブジェクトを定義し、それらのオブジェクトのpl/sqlテーブルを定義できます。

create type T_MY_TABLE as table of t_my_object;

で終わる

OPEN p_recordset FOR select * from table( v_my_table );

したがって、データベーステーブルでmongoを構築するのではなく、多くの場合、密集した、または暗号化された直接クエリを作成するのではなく、内部テーブルを作成して、pl/sqlの全機能を使ってデータを設定できます。そして、結果セットを収集するクライアントは賢明ではありません。また、内部テーブルの定義を変更する方が、データベーステーブルを変更するよりも管理視点から簡単です。

また、Jasperのようなレポートジェネレーターを使用する場合は、SQLをレポートからデータベースにプッシュし、プロシージャを呼び出してレコードセットを取得し、レポート側をフォーマットに集中させることができます。

1
J Bliss