Uit de documentatie voor de definitie van into_clause
:de SELECT INTO-instructie haalt een of meer kolommen op uit een enkele rij en slaat ze op in een of meer scalaire variabelen of een recordvariabele
Dan moet de huidige SELECT-instructie worden vervangen tegen de gevallen waarin meer dan één rij wordt geretourneerd. De volgende query's kunnen alternatieven zijn voor uw huidige SQL Select-instructie
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;
Als de DB-versie 12+ is, gebruik dan
SELECT reserve_id
INTO resid
FROM reservation
WHERE Cust_name = cname
AND Hotel_id = hotelID
AND reserve_date = resdate
FETCH NEXT 1 ROW ONLY;
zonder een subquery om slechts één rij te retourneren, aangezien u alleen duplicaten krijgt voor die kolommen zonder bestelregels voor de gegevens. Door het gebruik van deze zoekopdrachten is het niet nodig om no_data_found
. te verwerken of too_many_rows
uitzonderingen.
Bijwerken: Als het je doel is om alle rijen terug te geven, zelfs als er meer dan één rij tegelijk is, dan kun je SYS_REFCURSOR
gebruiken zoals
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;
/
en bel op zo'n manier dat
VAR v_rc REFCURSOR
EXEC :v_rc := findres('Avoras',111,date'2020-12-06');
PRINT v_rc
van de SQL Developer's console.