Dalla documentazione per la definizione di into_clause
:l'istruzione SELECT INTO recupera una o più colonne da una singola riga e le memorizza in una o più variabili scalari o in una variabile record
Quindi l'istruzione SELECT corrente dovrebbe essere sostituita nei casi di restituzione di più righe. Le seguenti query potrebbero essere alternative per l'attuale istruzione 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;
Se la versione DB è 12+, usa
SELECT reserve_id
INTO resid
FROM reservation
WHERE Cust_name = cname
AND Hotel_id = hotelID
AND reserve_date = resdate
FETCH NEXT 1 ROW ONLY;
senza una sottoquery per restituire una sola riga, considerando che ottieni solo duplicati per quelle colonne senza regole di ordinamento per i dati. Attraverso l'uso di queste query, non è necessario gestire no_data_found
o too_many_rows
eccezioni.
Aggiornamento : Se il tuo obiettivo è restituire tutte le righe anche se ci sono più righe contemporaneamente, puoi utilizzare SYS_REFCURSOR
come
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;
/
e chiama in modo tale che
VAR v_rc REFCURSOR
EXEC :v_rc := findres('Avoras',111,date'2020-12-06');
PRINT v_rc
dalla console dello sviluppatore SQL.