強く型付けされた参照カーソルを使用した手順は次のとおりです。
SQL> create or replace procedure p1 is
2 type dept_rc is ref cursor return dept%rowtype;
3 my_ref_cursor dept_rc;
4 begin
5 open my_ref_cursor for
6 select * from dept;
7 end;
8 /
Procedure created.
SQL>
EMPレコードの署名がDEPTテーブルの署名と一致しないため、この次のステートメントは失敗します。
SQL> create or replace procedure p1 is
2 type dept_rc is ref cursor return dept%rowtype;
3 my_ref_cursor dept_rc;
4 begin
5 open my_ref_cursor for
6 select * from emp;
7 end;
8 /
Warning: Procedure created with compilation errors.
SQL> show error
Errors for PROCEDURE P1:
LINE/COL ERROR
-------- -----------------------------------------------------------------
5/5 PL/SQL: SQL Statement ignored
6/9 PLS-00382: expression is of wrong type
SQL>
しかし、DEPTテーブルに一致するように予測を変更すると、再び成功します。
SQL> create or replace procedure p1 is
2 type dept_rc is ref cursor return dept%rowtype;
3 my_ref_cursor dept_rc;
4 begin
5 open my_ref_cursor for
6 select deptno, ename, job from emp;
7 end;
8 /
Procedure created.
SQL>
では、なぜ動的SQLで強く型付けされたref-cursorを使用できないのでしょうか。
SQL> create or replace procedure p1 is
2 type dept_rc is ref cursor return dept%rowtype;
3 my_ref_cursor dept_rc;
4 begin
5 open my_ref_cursor for
6 'select * from dept';
7 end;
8 /
Warning: Procedure created with compilation errors.
SQL> show error
Errors for PROCEDURE P1:
LINE/COL ERROR
-------- -----------------------------------------------------------------
5/5 PL/SQL: Statement ignored
5/10 PLS-00455: cursor 'MY_REF_CURSOR' cannot be used in dynamic SQL
OPEN statement
SQL>
コンパイラは動的SQLステートメントの文字列を解析できないためです。したがって、クエリのプロジェクションの列の数とデータ型が参照カーソルのシグネチャと一致することを表明することはできません。したがって、refカーソル変数とクエリの間のコントラクトを検証できません。動的SQLステートメントがUSER_TAB_COLUMNSのクエリからアセンブルされる可能性があると考えると、これが許可されない理由を理解するのはさらに簡単です。