Oracle
 sql >> Base de données >  >> RDS >> Oracle

Renvoyé mon curseur dans ma fonction oracle PL/SLQ mais toutes les lignes ne sont pas renvoyées. Pouvez-vous uniquement renvoyer 1 ligne dans une fonction Oracle pl/sql ?

À partir de la documentation pour la définition de into_clause  :l'instruction SELECT INTO récupère une ou plusieurs colonnes d'une seule ligne et les stocke dans une ou plusieurs variables scalaires ou une variable d'enregistrement

Ensuite, l'instruction SELECT actuelle doit être remplacée par les cas de renvoi de plusieurs lignes. Les requêtes suivantes peuvent être des alternatives pour votre instruction SQL Select actuelle

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;

Si la version DB est 12+, alors utilisez

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

sans sous-requête afin de ne renvoyer qu'une seule ligne, étant donné que vous n'obtenez que des doublons pour ces colonnes sans règles de classement pour les données. Grâce à l'utilisation de ces requêtes, pas besoin de gérer no_data_found ou too_many_rows exception.

Mise à jour : Si votre objectif est de renvoyer toutes les lignes même s'il y en a plusieurs à la fois, vous pouvez utiliser SYS_REFCURSOR comme

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

et appeler de telle manière que

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

depuis la console du développeur SQL.