Z dokumentace pro definici into_clause
:příkaz SELECT INTO načte jeden nebo více sloupců z jednoho řádku a uloží je buď do jedné nebo více skalárních proměnných nebo do jedné proměnné záznamu
Pak by měl být aktuální příkaz SELECT nahrazen proti případům vracení více než jednoho řádku. Následující dotazy mohou být alternativami pro váš aktuální příkaz 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;
Pokud je verze DB 12+, použijte
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 poddotazu, aby se vrátil pouze jeden řádek, vezmeme-li v úvahu, že získáte pouze duplikáty pro tyto sloupce bez pravidel řazení dat. Díky použití těchto dotazů není třeba zpracovávat no_data_found
nebo too_many_rows
výjimky.
Aktualizace: Pokud je vaším cílem vrátit všechny řádky, i když jich je více než jeden, můžete použít SYS_REFCURSOR
jako například
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;
/
a zavolejte tak, aby
VAR v_rc REFCURSOR
EXEC :v_rc := findres('Avoras',111,date'2020-12-06');
PRINT v_rc
z konzole SQL Developer's.