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

Requête concaténée de réécriture PL/SQL avec la clause 'IN'

je suppose que vous avez déjà pris certaines mesures pour obtenir les identifiants de vList dans une chaîne délimitée (vous ne dites pas comment vList a été peuplé). Pourquoi ne pas conserver une seule requête ?

begin
...
select name
bulk collect into tNames
from t_user
where id in (select id from some_table where ...);
...

Le changement de contexte lorsqu'il est exécuté plusieurs fois peut être pénible, mais pour moi, le pire est que vous acceptez aveuglément l'entrée de paramètre comme une liste de nombres, alors que cela pourrait être n'importe quoi. Cela pourrait (innocemment) être '1,2,X', et vous obtiendrez une erreur d'exécution "numéro invalide". Ou pire, il pourrait s'agir d'une attaque par injection SQL. C'est une mauvaise pratique en général (le sql dynamique a sa place), mais certainement PAS comment vous l'utilisez.

Essayez quelque chose comme ceci :

create or replace type t_num_tab as table of number;

create or replace procedure test_proc(i_list in t_num_tab) as
  type t_name_tab is table of varchar2(100);
  l_names t_name_tab;
begin
  -- get names
  select name
  bulk collect into l_names
  from user_table
  where id in (select * from table(i_list));

  -- do something with l_names
  dbms_output.put_line('Name count: ' || l_names.count);

end;

Vous pouvez créer un type d'objet si vous avez besoin de quelque chose de plus compliqué qu'une liste de nombres.