Oracle
 sql >> Datenbank >  >> RDS >> Oracle

PL/SQL schreibt verkettete Abfragen mit 'IN'-Klausel um

Ich vermute, dass Sie zuvor einige Schritte unternommen haben, um vList-IDs in eine Zeichenfolge mit Trennzeichen zu bringen (Sie sagen nicht, wie vList gefüllt wurde). Warum nicht bei einer Abfrage bleiben?

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

Der Kontextwechsel kann schmerzhaft sein, wenn er viele Male ausgeführt wird, aber für mich ist das Schlimmste, dass Sie die Parametereingabe blind als eine Liste von Zahlen akzeptieren, obwohl es wirklich alles sein könnte. Es könnte (unschuldig) '1,2,X' sein, und Sie erhalten einen Laufzeitfehler "ungültige Nummer". Oder schlimmer noch, es könnte sich um einen SQL-Injection-Angriff handeln. Seine schlechte Praxis im Allgemeinen (dynamisches SQL hat seinen Platz), aber definitiv NICHT, wie Sie es verwenden.

Probieren Sie so etwas aus:

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;

Sie können einen Objekttyp erstellen, wenn Sie etwas Komplizierteres als eine Zahlenliste benötigen.