CURSOR式

CURSOR式は、ネストしたカーソルを戻します。

構文は次のとおりです。

CURSOR ( subquery )

CURSOR式は、副問合せではないSELECT文で使用するか(例7-35のように)、カーソル変数パラメータを受け入れるファンクションに渡すことができます(「パイプライン・テーブル・ファンクションへのCURSOR式の引渡し」を参照)。カーソル式は、暗黙カーソルとは併用できません。

関連項目:

制限などのCURSOR式の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

例7-35 CURSOR式

この例では、カーソル式を含む問合せで明示カーソルを宣言および定義しています。departments表の部門ごとに、ネストしたカーソルはその部門の各従業員の名前を戻します(employees表から取得します)。

DECLARE
  TYPE emp_cur_typ IS REF CURSOR;
 
  emp_cur    emp_cur_typ;
  dept_name  departments.department_name%TYPE;
  emp_name   employees.last_name%TYPE;
 
  CURSOR c1 IS
    SELECT department_name,
      CURSOR ( SELECT e.last_name
                FROM employees e
                WHERE e.department_id = d.department_id
                ORDER BY e.last_name
              ) employees
    FROM departments d
    WHERE department_name LIKE 'A%'
    ORDER BY department_name;
BEGIN
  OPEN c1;
  LOOP  -- Process each row of query result set
    FETCH c1 INTO dept_name, emp_cur;
    EXIT WHEN c1%NOTFOUND;
    DBMS_OUTPUT.PUT_LINE('Department: ' || dept_name);
 
    LOOP -- Process each row of subquery result set
      FETCH emp_cur INTO emp_name;
      EXIT WHEN emp_cur%NOTFOUND;
      DBMS_OUTPUT.PUT_LINE('-- Employee: ' || emp_name);
    END LOOP;
  END LOOP;
  CLOSE c1;
END;
/

結果:

Department: Accounting
-- Employee: Gietz
-- Employee: Higgins
Department: Administration
-- Employee: Whalen