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
の使用方法について、次に例を示します。例では、まず、サンプル・スキーマOE
にREF
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