sql >> Databáze >  >> RDS >> Oracle

PL/SQL přepsat zřetězený dotaz s klauzulí 'IN'

odhaduji, že jste předtím udělali nějaké kroky, abyste dostali ID vList do odděleného řetězce (neříkáte, jak byl vList naplněn). Proč nenechat jako jeden dotaz?

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

Přepínání kontextu při opakovaném spuštění může být bolestivé, ale pro mě je nejhorší, že slepě přijímáte vstup parametrů jako seznam čísel, i když to může být opravdu cokoliv. Mohlo by to být (nevinně) '1,2,X' a dostanete runtime chybu "neplatné číslo". Nebo hůř, může to být útok SQL injection. Obecně je to špatná praxe (dynamické sql má své místo), ale rozhodně NE to, jak jej používáte.

Zkuste něco takového:

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;

Pokud potřebujete něco složitějšího než seznam čísel, můžete vytvořit typ objektu.



  1. AUTO_INCREMENT a LAST_INSERT_ID

  2. jak porovnat dva řádky stejné tabulky mysql v php

  3. Jak auditovat odstranění v určité tabulce pomocí Oracle?

  4. TOAD považuje &String za proměnnou vazby