Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Zwrócono mój kursor w mojej funkcji Oracle PL/SLQ, ale nie wszystkie wiersze są zwracane. Czy możesz zwrócić tylko 1 wiersz w funkcji Oracle pl/sql?

Z dokumentacji do definicji into_clause :instrukcja SELECT INTO pobiera jedną lub więcej kolumn z jednego wiersza i przechowuje je w jednej lub kilku zmiennych skalarnych lub w jednej zmiennej rekordu

Następnie bieżąca instrukcja SELECT powinna zostać zastąpiona przypadkami zwracania więcej niż jednego wiersza. Poniższe zapytania mogą być alternatywami dla aktualnej instrukcji 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;

Jeśli wersja DB to 12+, użyj

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

bez podzapytania w celu zwrócenia tylko jednego wiersza, biorąc pod uwagę, że otrzymujesz tylko duplikaty dla tych kolumn bez reguł porządkowania danych. Dzięki użyciu tych zapytań nie ma potrzeby obsługi no_data_found lub too_many_rows wyjątki.

Aktualizacja: Jeśli Twoim celem jest zwrócenie wszystkich wierszy, nawet jeśli jest więcej niż jeden wiersz na raz, możesz użyć SYS_REFCURSOR takich jak

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;
/

i zadzwoń w taki sposób, aby

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

z konsoli SQL Developer.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ropucha dla Oracle..Jak wykonać wiele instrukcji?

  2. Podziel tekst kolumny na wiersze (wyodrębnij separator w nawiasie) ORACLE SQL

  3. @Temporal(TemporalType.DATE) z Oracle 12

  4. Formatowanie kolumny daty w javaFX TableView dla danych pobranych z bazy danych Oracle

  5. Wstawianie i aktualizacja w oparciu o rekordy w Oracle