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

PL/SQL reescreve consulta concatenada com cláusula 'IN'


meu palpite é que você executou algumas etapas anteriormente para obter os ids de vList em uma string delimitada (você não diz como vList foi preenchido). Por que não manter como uma consulta?
begin
...
select name
bulk collect into tNames
from t_user
where id in (select id from some_table where ...);
...

A troca de contexto quando executada muitas vezes pode ser dolorosa, mas para mim a pior parte é que você está aceitando cegamente a entrada de parâmetros como uma lista de números, quando poderia ser qualquer coisa realmente. Pode (inocentemente) ser '1,2,X', e você receberá um erro de tempo de execução "número inválido". Ou pior, pode ser um ataque de injeção de SQL. É uma prática ruim em geral (o sql dinâmico tem seu lugar), mas definitivamente NÃO é como você o está usando.

Tente algo assim:
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;

Você pode criar um tipo de objeto se precisar de algo mais complicado do que uma lista de números.