जिस तरह से आप आरईएफ कर्सर का उपयोग कर रहे हैं वह असामान्य है। यह उनका उपयोग करने का मानक तरीका होगा:
SQL> CREATE OR REPLACE PACKAGE BODY MYPACK_PKG AS
2 PROCEDURE MY_PROC(r_cursor OUT MY_REF_CURSOR) AS
3 BEGIN
4 OPEN r_cursor FOR SELECT e.empno,e.ENAME,null FROM scott.emp e;
5 END MY_PROC;
6 END MYPACK_PKG;
7 /
Corps de package crÚÚ.
SQL> VARIABLE r REFCURSOR
SQL> BEGIN
2 MYPACK_PKG.MY_PROC(:r);
3 END;
4 /
ProcÚdure PL/SQL terminÚe avec succÞs.
SQL> PRINT :r
EMPNO ENAME N
---------- ---------- -
7369 SMITH
7499 ALLEN
7521 WARD
7566 JONES
7654 MARTIN
[...]
14 ligne(s) sÚlectionnÚe(s).
मुझे यकीन नहीं है कि आप यहां क्या हासिल करने की कोशिश कर रहे हैं, आप प्रक्रिया के अंदर रेफ कर्सर ला रहे हैं और फिर एक और रेफ कर्सर लौटा रहे हैं जिसमें समान डेटा होगा। मुझे नहीं लगता कि प्रक्रिया में कर्सर लाना बिल्कुल भी आवश्यक है। कॉलिंग ऐप को फ़ेचिंग करने दें (यहाँ फ़ेचिंग print
द्वारा किया जाता है )।
अपडेट:आपको अनुपयोगी त्रुटि संदेश क्यों मिल रहा है?
आप गतिशील रूप से खोले गए कर्सर का उपयोग कर रहे हैं और मुझे लगता है कि यह कारण है कि आपको अनुपयोगी त्रुटि संदेश मिल रहा है। यदि हम निश्चित SQL का उपयोग करते हैं तो त्रुटि संदेश अलग है:
SQL> CREATE OR REPLACE PACKAGE BODY MYPACK_PKG AS
2 PROCEDURE MY_PROC(r_cursor OUT MY_REF_CURSOR) AS
3 TYPE type_rec IS RECORD (qn number,
4 firstname VARCHAR2(30),
5 lastname VARCHAR2(30));
6 lt_record type_rec; /* Record type */
7 lt_object r_type; /* SQL Object type */
8 BEGIN
9 OPEN r_cursor FOR SELECT e.empno,e.ENAME,null FROM scott.emp e;
10 FETCH r_cursor INTO lt_record; /* This will work */
11 FETCH r_cursor INTO lt_object; /* This won't work in 10.2 */
12 END MY_PROC;
13 END MYPACK_PKG;
14 /
Package body created
SQL> VARIABLE r REFCURSOR
SQL> BEGIN
2 MYPACK_PKG.MY_PROC(:r);
3 END;
4 /
BEGIN
*
ERREUR Ó la ligne 1 :
ORA-06504: PL/SQL: Return types of Result Set variables or query do not match
ORA-06512: at "APPS.MYPACK_PKG", line 11
ORA-06512: at line 2
मैंने रेखांकित किया है कि वर्तमान में 10.2 में आप एक कर्सर को PLSQL रिकॉर्ड में ला सकते हैं लेकिन नहीं SQL ऑब्जेक्ट में।
अपडेट:PLS-00306
के बारे में :गलत संख्या या तर्कों के प्रकार
l_rarray एक नेस्टेड टेबल है, इसे इनिशियलाइज़ करने और फिर तत्वों को स्टोर करने में सक्षम होने के लिए विस्तारित करने की आवश्यकता है। उदाहरण के लिए:
SQL> CREATE OR REPLACE PACKAGE BODY MYPACK_PKG AS
2 PROCEDURE MY_PROC(r_cursor OUT MY_REF_CURSOR) AS
3 lr_array tr_type := tr_type(); /* SQL Array */
4 BEGIN
5 FOR cc IN (SELECT e.empno, e.ENAME, NULL lastname
6 FROM scott.emp e) LOOP
7 lr_array.extend;
8 lr_array(lr_array.count) := r_type(cc.empno,
9 cc.ename,
10 cc.lastname);
11 /* Here you can do additional procedural work on lr_array */
12 END LOOP;
13 /* then return the result set */
14 OPEN r_cursor FOR SELECT * FROM TABLE (lr_array);
15 END MY_PROC;
16 END MYPACK_PKG;
17 /
Corps de package crÚÚ.
SQL> print r
SQN FIRSTNAME LASTNAME
---------- ------------------------------ -----------
7369 SMITH
7499 ALLEN
7521 WARD
[...]
14 ligne(s) sÚlectionnÚe(s).
आगे पढ़ने के लिए आप के दस्तावेज़ ब्राउज़ कर सकते हैं। PL/SQL संग्रह और रिकॉर्ड .