Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Mein Cursor wurde in meiner Orakel-PL/SLQ-Funktion zurückgegeben, aber nicht alle Zeilen werden zurückgegeben. Können Sie nur 1 Zeile in einer Oracle pl/sql-Funktion zurückgeben?

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.