Oracle
 sql >> база данни >  >> RDS >> Oracle

PL/SQL пренаписва конкатенирана заявка с клауза „IN“.

Предполагам, че сте предприели някои стъпки по-рано, за да получите id на vList в ограничен низ (не казвате как е бил попълнен vList). Защо не запазите като една заявка?

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

Превключването на контекст, когато се изпълнява много пъти, може да бъде болезнено, но за мен най-лошата част е, че сляпо приемате въвеждането на параметри като списък с числа, когато може да е всичко наистина. Може (невинно) да е „1,2,X“ и ще получите грешка по време на изпълнение „невалиден номер“. Или още по-лошо, може да е атака чрез SQL инжектиране. Като цяло това е лоша практика (динамичният sql има своето място), но определено НЕ как го използвате.

Опитайте нещо подобно:

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;

Можете да създадете тип обект, ако имате нужда от нещо по-сложно от списък с числа.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ТИП Промяна на дефиниция в Oracle 21c

  2. Как да потвърдите датата ГГГГММДД, дадена като параметър PL/SQL

  3. Как да изброя активни/отворени връзки в Oracle?

  4. Заявката на Oracle е бавна (или неуспешна) от приложението .NET, но е бърза от SQL Developer

  5. Грешка 404 не е намерена с EM 12c