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

Comment renvoyer un jeu de résultats/curseur à partir d'un bloc anonyme Oracle PL/SQL qui exécute Dynamic SQL ?

Vous pouvez écrire une fonction PL/SQL pour renvoyer ce curseur (ou vous pouvez mettre cette fonction dans un package si vous avez plus de code lié à cela) :

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;

Cela renverra le curseur.

Assurez-vous de ne pas mettre votre SELECT -Chaîne entre guillemets en PL/SQL lorsque cela est possible. Le mettre dans des chaînes signifie qu'il ne peut pas être vérifié au moment de la compilation et qu'il doit être analysé chaque fois que vous l'utilisez.

Si vous avez vraiment besoin d'utiliser du SQL dynamique, vous pouvez mettre votre requête entre guillemets simples :

  OPEN my_cursor FOR 'SELECT * FROM allitems';

Cette chaîne doit être analysée chaque fois que la fonction est appelée, ce qui sera généralement plus lent et masquera les erreurs dans votre requête jusqu'à l'exécution.

Assurez-vous d'utiliser des variables de liaison dans la mesure du possible pour éviter les analyses difficiles :

  OPEN my_cursor FOR 'SELECT * FROM allitems WHERE id = :id' USING my_id;