sql >> Databasteknik >  >> RDS >> Oracle

PL/SQL skriver om sammanfogad fråga med 'IN'-klausul

min gissning är att du tog några steg tidigare för att få vList-id:n till en avgränsad sträng (du säger inte hur vList fylldes i). Varför inte behålla som en fråga?

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

Kontextväxling när den körs många gånger kan vara smärtsamt, men för mig är det värsta att du blint accepterar parameterinmatning för att vara en lista med siffror, när det verkligen kan vara vad som helst. Det kan (oskyldigt) vara '1,2,X', och du får ett körtidsfel "ogiltigt nummer". Eller ännu värre, det kan vara en SQL-injektionsattack. Dess dåliga praxis i allmänhet (dynamic sql har sin plats), men definitivt INTE hur du använder den.

Prova något sånt här:

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 skapa en objekttyp om du behöver något mer komplicerat än en lista med siffror.



  1. Exempel på att konvertera "tid" till "datumtid" i SQL Server (T-SQL)

  2. MySQL ställer in aktuellt datum i ett DATETIME-fält vid infogning

  3. Fel:SQLSTATE[42000]:Syntaxfel eller åtkomstöverträdelse med cakePHP

  4. Linq-frågan fungerar inte som förväntat