Fra dokumentationen til definition af into_clause
:SELECT INTO-sætningen henter en eller flere kolonner fra en enkelt række og gemmer dem i enten en eller flere skalarvariabler eller en postvariabel
Så skal den aktuelle SELECT-sætning erstattes af tilfælde af returnering af mere end én række. Følgende forespørgsler kan være alternativer til din nuværende SQL Select-sætning
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;
Hvis DB-versionen er 12+, så brug
SELECT reserve_id
INTO resid
FROM reservation
WHERE Cust_name = cname
AND Hotel_id = hotelID
AND reserve_date = resdate
FETCH NEXT 1 ROW ONLY;
uden en underforespørgsel for kun at returnere én række, i betragtning af at du kun får dubletter for de kolonner uden bestillingsregler for dataene. Ved brug af disse forespørgsler behøver du ikke at håndtere no_data_found
eller too_many_rows
undtagelser.
Opdatering: Hvis dit mål er at returnere alle rækkerne, selvom der er mere end én række på én gang, så kan du bruge SYS_REFCURSOR
såsom
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;
/
og ring på en sådan måde, at
VAR v_rc REFCURSOR
EXEC :v_rc := findres('Avoras',111,date'2020-12-06');
PRINT v_rc
fra SQL-udviklerkonsollen.