into_clause
. की परिभाषा के लिए दस्तावेज़ीकरण से :सेलेक्ट इनटू स्टेटमेंट एक पंक्ति से एक या अधिक कॉलम प्राप्त करता है और उन्हें एक या अधिक स्केलर वेरिएबल या एक रिकॉर्ड वेरिएबल में स्टोर करता है
फिर एक से अधिक पंक्तियों को वापस करने के मामलों के विरुद्ध वर्तमान चयन कथन को प्रतिस्थापित किया जाना चाहिए। निम्नलिखित प्रश्न आपके वर्तमान SQL चयन कथन के विकल्प हो सकते हैं
SELECT reserve_id
INTO resid
FROM
( SELECT r.*,
ROW_NUMBER() OVER (ORDER BY 0) AS rn
FROM reservation
WHERE Cust_name = cname
AND Hotel_id = hotelID
AND reserve_date = resdate
)
WHERE rn = 1;
यदि DB संस्करण 12+ है, तो उपयोग करें
SELECT reserve_id
INTO resid
FROM reservation
WHERE Cust_name = cname
AND Hotel_id = hotelID
AND reserve_date = resdate
FETCH NEXT 1 ROW ONLY;
केवल एक पंक्ति को वापस करने के लिए एक सबक्वायरी के बिना, यह देखते हुए कि आप केवल उन कॉलम के लिए डुप्लिकेट प्राप्त करते हैं, जिसमें डेटा के लिए कोई ऑर्डरिंग नियम नहीं है। इन प्रश्नों के उपयोग के माध्यम से, no_data_found
को संभालने की कोई आवश्यकता नहीं है या too_many_rows
अपवाद।
अपडेट करें: यदि आपका उद्देश्य एक से अधिक पंक्तियाँ होने पर भी सभी पंक्तियों को वापस करना है, तो आप SYS_REFCURSOR
का उपयोग कर सकते हैं जैसे
CREATE OR REPLACE FUNCTION findres(cname reservation.cust_name%type,
hotelID reservation.hotel_id%type,
resdate reservation.reserve_date%type)
RETURN SYS_REFCURSOR IS
recordset SYS_REFCURSOR;
BEGIN
OPEN recordset FOR
SELECT reserve_id
FROM reservation
WHERE Cust_name = cname
AND Hotel_id = hotelID
AND reserve_date = resdate;
RETURN recordset;
END;
/
और इस तरह से कॉल करें कि
VAR v_rc REFCURSOR
EXEC :v_rc := findres('Avoras',111,date'2020-12-06');
PRINT v_rc
SQL डेवलपर के कंसोल से।