À partir de la documentation pour la définition de into_clause
:l'instruction SELECT INTO récupère une ou plusieurs colonnes d'une seule ligne et les stocke dans une ou plusieurs variables scalaires ou une variable d'enregistrement
Ensuite, l'instruction SELECT actuelle doit être remplacée par les cas de renvoi de plusieurs lignes. Les requêtes suivantes peuvent être des alternatives pour votre instruction SQL Select actuelle
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;
Si la version DB est 12+, alors utilisez
SELECT reserve_id
INTO resid
FROM reservation
WHERE Cust_name = cname
AND Hotel_id = hotelID
AND reserve_date = resdate
FETCH NEXT 1 ROW ONLY;
sans sous-requête afin de ne renvoyer qu'une seule ligne, étant donné que vous n'obtenez que des doublons pour ces colonnes sans règles de classement pour les données. Grâce à l'utilisation de ces requêtes, pas besoin de gérer no_data_found
ou too_many_rows
exception.
Mise à jour : Si votre objectif est de renvoyer toutes les lignes même s'il y en a plusieurs à la fois, vous pouvez utiliser SYS_REFCURSOR
comme
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;
/
et appeler de telle manière que
VAR v_rc REFCURSOR
EXEC :v_rc := findres('Avoras',111,date'2020-12-06');
PRINT v_rc
depuis la console du développeur SQL.