sql >> Base de Datos >  >> RDS >> Oracle

PL/SQL reescribe la consulta concatenada con la cláusula 'IN'

Supongo que tomó algunos pasos anteriormente para obtener los ID de vList en una cadena delimitada (no dice cómo se llenó vList). ¿Por qué no mantener como una consulta?

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

El cambio de contexto cuando se ejecuta muchas veces puede ser doloroso, pero para mí la peor parte es que estás aceptando ciegamente que la entrada de parámetros sea una lista de números, cuando en realidad podría ser cualquier cosa. Podría (inocentemente) ser '1,2,X', y obtendrá un error de tiempo de ejecución "número no válido". O peor aún, podría ser un ataque de inyección SQL. Es una mala práctica en general (sql dinámico tiene su lugar), pero definitivamente NO es cómo lo estás usando.

Prueba algo como esto:

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;

Puede crear un tipo de objeto si necesita algo más complicado que una lista de números.