CURSOR式

CURSOR式は、ネストしたカーソルを戻します。この式の書式は、PL/SQLのREF CURSORと同じで、REF CURSOR引数としてファンクションに渡すことができます。

カーソル式が評価されるときに、ネステッド・カーソルは暗黙的にオープンされます。たとえば、カーソル式がSELECT構文のリストにある場合、問合せによってフェッチされた各行に対して、ネステッド・カーソルがオープンされます。ネステッド・カーソルは、次の場合にのみクローズされます。

  • ユーザーによって明示的にクローズされたとき

  • 親カーソルが再実行されたとき

  • 親カーソルがクローズされたとき

  • 親カーソルが取り消されたとき

  • 親カーソルの1つでのフェッチ時にエラーが発生したとき(クリーンアップの一部としてクローズされる)

CURSOR式の制限事項

CURSOR式には、次の制限事項があります。

  • 囲まれる文がSELECT文以外の文である場合、ネステッド・カーソルは、プロシージャのREF CURSOR引数としてのみ表示されます。

  • 囲まれる文がSELECT文である場合、ネステッド・カーソルは、問合せ指定の一番外側のSELECT構文のリスト、または別のネステッド・カーソルの一番外側のSELECT構文のリストに表示されます。

  • ネステッド・カーソルはビューに表示できません。

  • ネステッド・カーソルに対して、BIND操作およびEXECUTE操作は実行できません。

次の例は、問合せの選択リストでのCURSOR式の使用方法を示しています。

SELECT department_name, CURSOR(SELECT salary, commission_pct 
   FROM employees e
   WHERE e.department_id = d.department_id)
   FROM departments d
   ORDER BY department_name;

ファンクションの引数としてのCURSORの使用方法について、次に例を示します。例では、まず、サンプル・スキーマOEREF CURSOR引数を受け入れるファンクションを作成します。(イタリック体は、PL/SQLファンクションの本体です。)

CREATE FUNCTION f(cur SYS_REFCURSOR, mgr_hiredate DATE) 
   RETURN NUMBER IS
   emp_hiredate DATE;
   before number :=0;
   after number:=0;
begin
  loop
    fetch cur into emp_hiredate;
    exit when cur%NOTFOUND;
    if emp_hiredate > mgr_hiredate then
      after:=after+1;
    else
      before:=before+1;
    end if;
  end loop;
  close cur;
  if before > after then
    return 1;
  else
    return 0;
  end if;
end;
/

ファンクションには、カーソルおよび日付を指定できます。ファンクションは、カーソルが日付セットを戻す問合せであることを想定します。次の問合せでは、ファンクションを使用して、サンプル表employeesから、ほとんどの従業員がマネージャよりも前に雇用されているマネージャを検索します。

SELECT e1.last_name FROM employees e1
   WHERE f(
   CURSOR(SELECT e2.hire_date FROM employees e2
   WHERE e1.employee_id = e2.manager_id),
   e1.hire_date) = 1
   ORDER BY last_name;
 
LAST_NAME
-------------------------
Cambrault
Higgins
Hunold
Kochhar
Mourgos
Zlotkey