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

en utilisant des valeurs séparées par des virgules dans la clause IN pour la colonne NUMBER

Avez-vous vraiment besoin de renvoyer une liste séparée par des virgules ? Il serait généralement préférable de déclarer un type de collection

CREATE TYPE num_table
    AS TABLE OF NUMBER;

Déclarez une fonction qui renvoie une instance de cette collection

CREATE OR REPLACE FUNCTION get_nums
  RETURN num_table
IS
  l_nums num_table := num_table();
BEGIN
  for i in 1 .. 10
  loop
    l_nums.extend;
    l_nums(i) := i*2;
  end loop;
END;

puis utilisez cette collection dans votre requête

SELECT *
  FROM users_table
 WHERE user_id IN (SELECT * FROM TABLE( l_nums ));

Il est également possible d'utiliser SQL dynamique (ce que @Sebas démontre). L'inconvénient, cependant, est que chaque appel à la procédure générera une nouvelle instruction SQL qui doit être analysée à nouveau avant d'être exécutée. Cela exerce également une pression sur le cache de la bibliothèque, ce qui peut amener Oracle à purger de nombreuses autres instructions SQL réutilisables, ce qui peut créer de nombreux autres problèmes de performances.