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

Returnerede min markør i min oracle PL/SLQ funktion, men ikke alle rækker returneres. Kan du kun returnere 1 række i en Oracle pl/sql-funktion?

Fra dokumentationen til definition af into_clause :SELECT INTO-sætningen henter en eller flere kolonner fra en enkelt række og gemmer dem i enten en eller flere skalarvariabler eller en postvariabel

Så skal den aktuelle SELECT-sætning erstattes af tilfælde af returnering af mere end én række. Følgende forespørgsler kan være alternativer til din nuværende SQL Select-sætning

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;

Hvis DB-versionen er 12+, så brug

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

uden en underforespørgsel for kun at returnere én række, i betragtning af at du kun får dubletter for de kolonner uden bestillingsregler for dataene. Ved brug af disse forespørgsler behøver du ikke at håndtere no_data_found eller too_many_rows undtagelser.

Opdatering: Hvis dit mål er at returnere alle rækkerne, selvom der er mere end én række på én gang, så kan du bruge SYS_REFCURSOR såsom

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

og ring på en sådan måde, at

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

fra SQL-udviklerkonsollen.




  1. Det gentagelige læseisolationsniveau

  2. SQL tutorial for begyndere

  3. Konverter fra UniqueIdentifier til BigInt og tilbage?

  4. mysql_insert_id med opdatering