sql >> Database >  >> RDS >> Oracle

PL/SQL aaneengeschakelde query herschrijven met 'IN'-clausule

mijn gok is dat je eerder enkele stappen hebt ondernomen om vList-ID's in een gescheiden tekenreeks te krijgen (je zegt niet hoe vList werd ingevuld). Waarom niet als één query bewaren?

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

Het wisselen van context wanneer het vaak wordt uitgevoerd, kan pijnlijk zijn, maar voor mij is het ergste dat je blindelings parameterinvoer accepteert als een lijst met getallen, terwijl het echt van alles kan zijn. Het kan (onschuldig) '1,2,X' zijn en je krijgt een runtime-fout "ongeldig nummer". Of erger nog, het kan een SQL-injectie-aanval zijn. Het is in het algemeen een slechte gewoonte (dynamische sql heeft zijn plaats), maar zeker NIET hoe je het gebruikt.

Probeer zoiets als dit:

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;

U kunt een objecttype maken als u iets ingewikkelders nodig heeft dan een lijst met getallen.



  1. Hoe een .sql-bestand exporteren en importeren vanaf de opdrachtregel met opties?

  2. Ontbrekende indexen in MS SQL of optimalisatie in een mum van tijd

  3. Jasper Report:kan geen waarde krijgen voor veld 'x' van klasse 'org.postgresql.util.PGmoney'

  4. waarom haalt dit geen gegevens van 7 dagen terug?