sql >> Database teknologi >  >> RDS >> Oracle

PL/SQL omskriv sammenkædet forespørgsel med 'IN'-klausul

mit gæt er, at du tidligere har taget nogle skridt for at få vList-id'er ind i en afgrænset streng (du siger ikke, hvordan vList blev udfyldt). Hvorfor ikke beholde som én forespørgsel?

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

Kontekstskift, når det køres mange gange, kan være smertefuldt, men for mig er det værste, at du blindt accepterer parameterinput som en liste over tal, når det virkelig kan være hvad som helst. Det kunne (uskyldigt) være '1,2,X', og du får en runtime-fejl "ugyldigt nummer". Eller værre, det kan være et SQL-injektionsangreb. Dens dårlige praksis generelt (dynamisk sql har sin plads), men bestemt IKKE hvordan du bruger det.

Prøv noget som dette:

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;

Du kan oprette en objekttype, hvis du har brug for noget mere kompliceret end en liste med tal.



  1. Mysql-forespørgsel med to tabeller php

  2. Hvordan sorterer man efter tidligere dato i databasen?

  3. 4 måder at finde rækker, der indeholder små bogstaver i Oracle

  4. CREATE-kommando nægtet for bruger, der har GIVET ALLE PRIVILEGIER