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

Como retornar um conjunto de resultados/cursor de um bloco anônimo Oracle PL/SQL que executa SQL dinâmico?


Você pode escrever uma função PL/SQL para retornar esse cursor (ou pode colocar essa função em um pacote se tiver mais código relacionado a isso):
CREATE OR REPLACE FUNCTION get_allitems
  RETURN SYS_REFCURSOR
AS
  my_cursor SYS_REFCURSOR;
BEGIN
  OPEN my_cursor FOR SELECT * FROM allitems;
  RETURN my_cursor;
END get_allitems;

Isso retornará o cursor.

Certifique-se de não colocar seu SELECT -Coloque entre aspas em PL/SQL quando possível. Colocá-lo em strings significa que ele não pode ser verificado em tempo de compilação e que deve ser analisado sempre que você o usar.

Se você realmente precisa usar SQL dinâmico, pode colocar sua consulta entre aspas simples:
  OPEN my_cursor FOR 'SELECT * FROM allitems';

Essa string deve ser analisada sempre que a função for chamada, o que geralmente será mais lento e ocultará erros em sua consulta até o tempo de execução.

Certifique-se de usar variáveis ​​de ligação sempre que possível para evitar análises difíceis:
  OPEN my_cursor FOR 'SELECT * FROM allitems WHERE id = :id' USING my_id;