Hier is een procedure met een sterk getypte 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 /
Procedure created.
SQL>
Deze volgende instructie mislukt omdat de handtekening van het EMP-record niet overeenkomt met die van de DEPT-tabel.
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>
Maar als we de projectie veranderen om overeen te komen met de DEPT-tabel, hebben we weer succes:
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>
Dus waarom kunnen we geen sterk getypeerde ref-cursor gebruiken met dynamische SQL?
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>
Omdat de compiler de tekenreeks in de dynamische SQL-instructie niet kan ontleden. Het kan dus niet beweren dat de kolommen in de projectie van de query qua aantal en datatype overeenkomen met de handtekening van de ref-cursor. Bijgevolg kan het het contract tussen de variabele ref cursor en de query niet valideren. Het is nog gemakkelijker te begrijpen waarom dit niet kan worden toegestaan als we bedenken dat de dynamische SQL-instructie zou kunnen worden samengesteld uit een query op USER_TAB_COLUMNS.