Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Retornou meu Cursor na minha função oracle PL/SLQ mas nem todas as linhas estão sendo retornadas. Você pode retornar apenas 1 linha em uma função Oracle pl/sql?


Da documentação para definição de into_clause :a instrução SELECT INTO recupera uma ou mais colunas de uma única linha e as armazena em uma ou mais variáveis ​​escalares ou em uma variável de registro

Em seguida, a instrução SELECT atual deve ser substituída nos casos de retorno de mais de uma linha. As seguintes consultas podem ser alternativas para sua instrução SQL Select atual
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 a versão do banco de dados for 12+, use
SELECT reserve_id
  INTO resid
  FROM reservation
 WHERE Cust_name = cname
   AND Hotel_id = hotelID
   AND reserve_date = resdate
 FETCH NEXT 1 ROW ONLY; 

sem uma subconsulta para retornar apenas uma linha, considerando que você obtém apenas duplicatas para aquelas colunas sem regras de ordenação para os dados. Com o uso dessas consultas, não há necessidade de lidar com no_data_found ou too_many_rows exceções.

Atualizar: Se seu objetivo é retornar todas as linhas, mesmo que haja mais de uma linha ao mesmo tempo, você pode usar SYS_REFCURSOR tal como
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 chamar de tal forma que
VAR   v_rc REFCURSOR
EXEC :v_rc := findres('Avoras',111,date'2020-12-06');
PRINT v_rc

no console do SQL Developer.