Oracle
 sql >> Baza danych >  >> RDS >> Oracle

PL/SQL przepisz skonkatenowane zapytanie z klauzulą ​​„IN”

domyślam się, że wykonałeś kilka kroków wcześniej, aby uzyskać identyfikator vList w rozdzielanym ciągu (nie mówisz, w jaki sposób vList został wypełniony). Dlaczego nie zachować jako jednego zapytania?

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

Przełączanie kontekstu przy wielokrotnym uruchamianiu może być bolesne, ale dla mnie najgorsze jest to, że ślepo akceptujesz wprowadzanie parametrów jako listę liczb, podczas gdy może to być cokolwiek naprawdę. Może (niewinnie) być „1,2,X”, a otrzymasz błąd w czasie wykonywania „nieprawidłowy numer”. Albo gorzej, może to być atak typu SQL injection. Ogólnie jest to zła praktyka (dynamiczny sql ma swoje miejsce), ale na pewno NIE sposób, w jaki go używasz.

Wypróbuj coś takiego:

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;

Możesz utworzyć typ obiektu, jeśli potrzebujesz czegoś bardziej skomplikowanego niż lista liczb.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak znaleźć parametry w zapytaniu Oracle otrzymanym od v$sql?

  2. Jakie jest wysokiej jakości środowisko programistyczne do pisania Oracle SQL?

  3. Java — policz dokładnie 60 znaków z ciągu znaków z kombinacją znaków UTF-8 i innych niż UTF-8

  4. SQL aktualizuje pensje pracowników o średnią pensję ich działu

  5. Podziel String z nową linią i dodaj tablicę w PL sql Oracle