जब आप इस प्रक्रिया को निष्पादित करते हैं या इसे SQLPLUS में चलाते हैं तो क्या आपको कोई त्रुटि दिखाई देती है? क्या आप अपना sqlplus सत्र इस रूप में पोस्ट कर सकते हैं?
PRINT एक sqlplus विशिष्ट कमांड है और इसे प्रक्रियात्मक ब्लॉक के अंदर नहीं कहा जा सकता है। यदि आपको किसी प्रक्रिया के भीतर किसी रिफ़कर्सर के परिणामों को प्रिंट करने की आवश्यकता है, तो आपको उससे प्राप्त करना होगा और प्रत्येक रिकॉर्ड को उस प्रारूप में प्रिंट करना होगा जिसकी आपको आवश्यकता है।
SQL> create or replace procedure test_REFCURSOR (
2 i_number in number,
3 o_cursor out sys_refcursor)
4 as
5 begin
6 open o_cursor for
7 'select empno, ename from emp
8 where rownum < ' || i_number ;
9 end;
10 /
Procedure created.
SQL> variable rc refcursor;
SQL> exec test_refcursor(5, :rc);
PL/SQL procedure successfully completed.
SQL> print rc;
EMPNO ENAME
---------- ----------
7369 SMITH
7499 ALLEN
7521 WARD
7566 JONES
आपको अलग-अलग चर नाम रखने के लिए अपनी प्रक्रिया (या) प्रक्रिया कॉल को भी बदलना चाहिए। सामान्य तौर पर, मैं "i_" के साथ सभी इनपुट चर और "o_" के साथ सभी आउटपुट चर को उपसर्ग करता हूं। इस तरह, आपकी प्रक्रिया घोषणा इस तरह दिखेगी..
CREATE OR REPLACE PROCEDURE IFSINFO.SHORTAGE_SHEET (i_Site IN VARCHAR2,
i_Buyer IN VARCHAR2,
i_Supplier IN VARCHAR2,
o_Cursor OUT SYS_REFCURSOR) AS ....
और प्रक्रिया कॉल होगी..
IFSINFO.SHORTAGE_SHEET( i_site => vsite,
i_buyer => vbuyer,
i_supplier => vsupplier,
o_cursor => vcursor);
आपको इन चरों के लिए शुरुआत में ":" का उपयोग करने की आवश्यकता नहीं है क्योंकि वे मेजबान पर्यावरण चर नहीं हैं (यह SQLPLUS का उपयोग करके आपके दूसरे निष्पादन का मामला है जहां आप प्रक्रिया कॉल के अंदर sqlplus चर "rc" का उपयोग करते हैं)