Her er en procedure med en stærkt indtastet ref-markør:
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>
Denne næste sætning mislykkes, fordi signaturen på EMP-posten ikke stemmer overens med DEPT-tabellen.
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>
Men hvis vi ændrer projektionen til at matche DEPT-tabellen, har vi succes igen:
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>
Så hvorfor kan vi ikke bruge en stærkt indtastet ref-cursor med dynamisk 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>
Fordi compileren ikke kan parse strengen i den dynamiske SQL-sætning. Så det kan ikke påstå, at kolonnerne i forespørgslens projektion matcher i antal og datatype signaturen af ref-markøren. Følgelig kan den ikke validere kontrakten mellem ref-markørvariablen og forespørgslen. Det er endnu nemmere at forstå, hvorfor dette ikke kan tillades, når vi tænker på, at den dynamiske SQL-sætning kunne samles ud fra en forespørgsel på USER_TAB_COLUMNS.