आप SYS_REFCURSOR
का उपयोग कर सकते हैं मानक आंतरिक डेटा प्रकारों जैसे VARCHAR2
. के बजाय जैसा कि आपके मामले में एकाधिक पंक्तियों को वापस करने में सक्षम होने के लिए है। INTO क्लॉज के साथ एक सेलेक्ट स्टेटमेंट कई पंक्तियों को वापस नहीं कर सकता है, और वर्तमान त्रुटि संदेश (ORA-01422
) चोट पहुँचाता है।
इस प्रकार, एक संग्रहित फ़ंक्शन बनाएं जिसमें SYS_REFCURSOR
. हो पहला :
SQL> CREATE OR REPLACE FUNCTION GET_CONSTRAINT_COLUMNS(iTableName IN VARCHAR2,
iConstraintName IN VARCHAR2)
RETURN SYS_REFCURSOR AS
wkeys SYS_REFCURSOR;
v_sql VARCHAR2(32767);
BEGIN
v_sql := 'SELECT column_name
FROM user_cons_columns
WHERE constraint_name = :ic
AND table_name = :it';
OPEN wkeys FOR v_sql USING iconstraintname, iTableName;
RETURN wkeys;
END;
/
और फिर SQL डेवलपर के कंसोल से इस रूप में कॉल करें
SQL> DECLARE
wConsumable SYS_REFCURSOR;
BEGIN
:wConsumable := GET_CONSTRAINT_COLUMNS('PRODUCTS', 'PRODUCTSPK');
END;
/
SQL> PRINT wConsumable ;
- पहला SQL(
CURSOR Extract_KEY
के लिए तैयार) ) बेमानी है; - दो के बीच कोई अंतर नहीं है
SELECT
LOOP
. के भीतर बयान ,बीटीडब्ल्यूLOOP
इस वर्तमान मामले का उपयोग करने की आवश्यकता नहीं है; - कमांड
PRINT
DBMS_OUTPUT.PUT_LINE
. के बजाय इस्तेमाल किया जा सकता हैSYS_REFCURSOR
. का परिणाम लौटाने के लिए ।