Oracle
 sql >> Database >  >> RDS >> Oracle

Restituito il mio cursore nella mia funzione Oracle PL/SLQ ma non tutte le righe vengono restituite. Puoi restituire solo 1 riga in una funzione Oracle pl/sql?

Dalla documentazione per la definizione di into_clause :l'istruzione SELECT INTO recupera una o più colonne da una singola riga e le memorizza in una o più variabili scalari o in una variabile record

Quindi l'istruzione SELECT corrente dovrebbe essere sostituita nei casi di restituzione di più righe. Le seguenti query potrebbero essere alternative per l'attuale istruzione SQL Select

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 la versione DB è 12+, usa

SELECT reserve_id
  INTO resid
  FROM reservation
 WHERE Cust_name = cname
   AND Hotel_id = hotelID
   AND reserve_date = resdate
 FETCH NEXT 1 ROW ONLY; 

senza una sottoquery per restituire una sola riga, considerando che ottieni solo duplicati per quelle colonne senza regole di ordinamento per i dati. Attraverso l'uso di queste query, non è necessario gestire no_data_found o too_many_rows eccezioni.

Aggiornamento : Se il tuo obiettivo è restituire tutte le righe anche se ci sono più righe contemporaneamente, puoi utilizzare SYS_REFCURSOR come

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 chiama in modo tale che

VAR   v_rc REFCURSOR
EXEC :v_rc := findres('Avoras',111,date'2020-12-06');
PRINT v_rc

dalla console dello sviluppatore SQL.