Aus der Dokumentation zur Definition von into_clause
:die Anweisung SELECT INTO ruft eine oder mehrere Spalten aus einer einzelnen Zeile ab und speichert sie entweder in einer oder mehreren Skalarvariablen oder einer Datensatzvariablen
Dann sollte die aktuelle SELECT-Anweisung gegen die Fälle ersetzt werden, in denen mehr als eine Zeile zurückgegeben wird. Die folgenden Abfragen könnten Alternativen für Ihre aktuelle SQL Select-Anweisung sein
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;
Wenn die DB-Version 12+ ist, verwenden Sie
SELECT reserve_id
INTO resid
FROM reservation
WHERE Cust_name = cname
AND Hotel_id = hotelID
AND reserve_date = resdate
FETCH NEXT 1 ROW ONLY;
ohne Unterabfrage, um nur eine Zeile zurückzugeben, wenn man bedenkt, dass Sie nur Duplikate für diese Spalten ohne Sortierregeln für die Daten erhalten. Durch die Verwendung dieser Abfragen muss no_data_found
nicht verarbeitet werden oder too_many_rows
Ausnahmen.
Aktualisieren : Wenn Sie alle Zeilen zurückgeben möchten, auch wenn mehr als eine Zeile gleichzeitig vorhanden ist, können Sie SYS_REFCURSOR
verwenden wie
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;
/
und so aufrufen, dass
VAR v_rc REFCURSOR
EXEC :v_rc := findres('Avoras',111,date'2020-12-06');
PRINT v_rc
aus der SQL-Entwicklerkonsole.