Berikut adalah prosedur dengan kursor ref yang diketik dengan kuat:
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>
Pernyataan berikutnya gagal karena tanda tangan catatan EMP tidak cocok dengan tanda tangan tabel 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>
Tetapi jika kita mengubah proyeksi agar sesuai dengan tabel DEPT maka kita berhasil lagi:
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>
Jadi, mengapa kita tidak bisa menggunakan kursor ref yang diketik dengan kuat dengan SQL dinamis?
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>
Karena kompiler tidak dapat mengurai string dalam pernyataan SQL dinamis. Jadi tidak dapat menyatakan bahwa kolom dalam proyeksi kueri cocok dengan jumlah dan tipe data tanda tangan kursor ref. Akibatnya tidak dapat memvalidasi kontrak antara variabel kursor ref dan kueri. Bahkan lebih mudah untuk memahami mengapa hal ini tidak dapat diizinkan ketika kami menganggap bahwa pernyataan SQL dinamis dapat dikumpulkan dari kueri di USER_TAB_COLUMNS.