Từ tài liệu cho định nghĩa của into_clause
: câu lệnh SELECT INTO truy xuất một hoặc nhiều cột từ một hàng và lưu trữ chúng trong một hoặc nhiều biến vô hướng hoặc một biến bản ghi
Sau đó, câu lệnh SELECT hiện tại nên được thay thế đối với các trường hợp trả về nhiều hơn một hàng. Các truy vấn sau có thể là các lựa chọn thay thế cho câu lệnh SQL Select hiện tại của bạn
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;
Nếu phiên bản DB là 12+, thì hãy sử dụng
SELECT reserve_id
INTO resid
FROM reservation
WHERE Cust_name = cname
AND Hotel_id = hotelID
AND reserve_date = resdate
FETCH NEXT 1 ROW ONLY;
không có truy vấn con để chỉ trả về một hàng, coi như bạn chỉ nhận được các bản sao cho các cột đó mà không có quy tắc sắp xếp dữ liệu. Thông qua việc sử dụng các truy vấn này, không cần xử lý no_data_found
hoặc too_many_rows
ngoại lệ.
Cập nhật: Nếu mục đích của bạn là trả về tất cả các hàng thậm chí có nhiều hàng cùng một lúc, thì bạn có thể sử dụng SYS_REFCURSOR
chẳng hạn như
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;
/
và gọi theo cách sao cho
VAR v_rc REFCURSOR
EXEC :v_rc := findres('Avoras',111,date'2020-12-06');
PRINT v_rc
từ bảng điều khiển của nhà phát triển SQL.