sql >> Databáze >  >> RDS >> Oracle

Vrátil jsem můj kurzor ve funkci Oracle PL/SLQ, ale nevrací se všechny řádky. Můžete vrátit pouze 1 řádek ve funkci Oracle pl/sql?

Z dokumentace pro definici into_clause :příkaz SELECT INTO načte jeden nebo více sloupců z jednoho řádku a uloží je buď do jedné nebo více skalárních proměnných nebo do jedné proměnné záznamu

Pak by měl být aktuální příkaz SELECT nahrazen proti případům vracení více než jednoho řádku. Následující dotazy mohou být alternativami pro váš aktuální příkaz 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;

Pokud je verze DB 12+, použijte

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 poddotazu, aby se vrátil pouze jeden řádek, vezmeme-li v úvahu, že získáte pouze duplikáty pro tyto sloupce bez pravidel řazení dat. Díky použití těchto dotazů není třeba zpracovávat no_data_found nebo too_many_rows výjimky.

Aktualizace: Pokud je vaším cílem vrátit všechny řádky, i když jich je více než jeden, můžete použít SYS_REFCURSOR jako například

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

a zavolejte tak, aby

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

z konzole SQL Developer's.




  1. Jak dynamicky vybírat názvy sloupců v mySQL

  2. Dynamické vzorkování Killing Me ve 12c

  3. Jak funguje načítání dat ze serveru SQL Server do SqlDataReader?

  4. 2 způsoby, jak zkontrolovat, zda je na serveru SQL povolen přístup k datům (příklady T-SQL)