Da documentação para definição de
into_clause
:a instrução SELECT INTO recupera uma ou mais colunas de uma única linha e as armazena em uma ou mais variáveis escalares ou em uma variável de registro Em seguida, a instrução SELECT atual deve ser substituída nos casos de retorno de mais de uma linha. As seguintes consultas podem ser alternativas para sua instrução SQL Select atual
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 a versão do banco de dados for 12+, use
SELECT reserve_id
INTO resid
FROM reservation
WHERE Cust_name = cname
AND Hotel_id = hotelID
AND reserve_date = resdate
FETCH NEXT 1 ROW ONLY;
sem uma subconsulta para retornar apenas uma linha, considerando que você obtém apenas duplicatas para aquelas colunas sem regras de ordenação para os dados. Com o uso dessas consultas, não há necessidade de lidar com
no_data_found
ou too_many_rows
exceções. Atualizar: Se seu objetivo é retornar todas as linhas, mesmo que haja mais de uma linha ao mesmo tempo, você pode usar
SYS_REFCURSOR
tal como 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 chamar de tal forma que
VAR v_rc REFCURSOR
EXEC :v_rc := findres('Avoras',111,date'2020-12-06');
PRINT v_rc
no console do SQL Developer.