Dari dokumentasi untuk definisi into_clause
:pernyataan SELECT INTO mengambil satu atau lebih kolom dari satu baris dan menyimpannya dalam satu atau lebih variabel skalar atau satu variabel record
Maka pernyataan SELECT saat ini harus diganti dengan kasus pengembalian lebih dari satu baris. Kueri berikut mungkin menjadi alternatif untuk pernyataan SQL Select Anda saat ini
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;
Jika versi DB adalah 12+, maka gunakan
SELECT reserve_id
INTO resid
FROM reservation
WHERE Cust_name = cname
AND Hotel_id = hotelID
AND reserve_date = resdate
FETCH NEXT 1 ROW ONLY;
tanpa subquery untuk mengembalikan satu baris saja, mengingat Anda hanya mendapatkan duplikat untuk kolom tersebut tanpa aturan pengurutan untuk data. Melalui penggunaan kueri ini, tidak perlu menangani no_data_found
atau too_many_rows
pengecualian.
Pembaruan : Jika tujuan Anda adalah mengembalikan semua baris meskipun ada lebih dari satu baris sekaligus, maka Anda dapat menggunakan SYS_REFCURSOR
seperti
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;
/
dan panggil sedemikian rupa sehingga
VAR v_rc REFCURSOR
EXEC :v_rc := findres('Avoras',111,date'2020-12-06');
PRINT v_rc
dari konsol Pengembang SQL.