यहाँ एक दृढ़ता से टाइप किए गए रेफरी कर्सर के साथ एक प्रक्रिया है:
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>
लेकिन अगर हम डीईपीटी तालिका से मिलान करने के लिए प्रक्षेपण बदलते हैं तो हमें फिर से सफलता मिलती है:
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> 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 स्टेटमेंट में स्ट्रिंग को पार्स नहीं कर सकता है। इसलिए यह दावा नहीं कर सकता कि क्वेरी के प्रोजेक्शन में कॉलम संख्या में मेल खाते हैं और रेफ कर्सर के हस्ताक्षर को डेटाटाइप करते हैं। नतीजतन यह रेफरी कर्सर चर और क्वेरी के बीच अनुबंध को मान्य नहीं कर सकता है। यह समझना और भी आसान है कि इसकी अनुमति क्यों नहीं दी जा सकती जब हम मानते हैं कि USER_TAB_COLUMNS पर एक क्वेरी से डायनेमिक SQL स्टेटमेंट को इकट्ठा किया जा सकता है।