Z dokumentacji do definicji into_clause
:instrukcja SELECT INTO pobiera jedną lub więcej kolumn z jednego wiersza i przechowuje je w jednej lub kilku zmiennych skalarnych lub w jednej zmiennej rekordu
Następnie bieżąca instrukcja SELECT powinna zostać zastąpiona przypadkami zwracania więcej niż jednego wiersza. Poniższe zapytania mogą być alternatywami dla aktualnej instrukcji SQL Select
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;
Jeśli wersja DB to 12+, użyj
SELECT reserve_id
INTO resid
FROM reservation
WHERE Cust_name = cname
AND Hotel_id = hotelID
AND reserve_date = resdate
FETCH NEXT 1 ROW ONLY;
bez podzapytania w celu zwrócenia tylko jednego wiersza, biorąc pod uwagę, że otrzymujesz tylko duplikaty dla tych kolumn bez reguł porządkowania danych. Dzięki użyciu tych zapytań nie ma potrzeby obsługi no_data_found
lub too_many_rows
wyjątki.
Aktualizacja: Jeśli Twoim celem jest zwrócenie wszystkich wierszy, nawet jeśli jest więcej niż jeden wiersz na raz, możesz użyć SYS_REFCURSOR
takich jak
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;
/
i zadzwoń w taki sposób, aby
VAR v_rc REFCURSOR
EXEC :v_rc := findres('Avoras',111,date'2020-12-06');
PRINT v_rc
z konsoli SQL Developer.