Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

PL/SQL menulis ulang kueri gabungan dengan klausa 'IN'

tebakan saya adalah Anda mengambil beberapa langkah sebelumnya untuk memasukkan id vList ke dalam string yang dibatasi (Anda tidak mengatakan bagaimana vList diisi). Mengapa tidak disimpan sebagai satu kueri?

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

Pergantian konteks ketika dijalankan berkali-kali bisa menyakitkan, tetapi bagi saya bagian terburuknya adalah Anda secara membabi buta menerima input parameter menjadi daftar angka, padahal itu bisa berupa apa saja. Itu bisa (tidak bersalah) menjadi '1,2,X', dan Anda akan mendapatkan kesalahan runtime "nomor tidak valid". Atau lebih buruk, itu bisa menjadi serangan injeksi SQL. Praktik buruknya secara umum (sql dinamis memang memiliki tempatnya), tetapi jelas BUKAN bagaimana Anda menggunakannya.

Coba sesuatu seperti ini:

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;

Anda dapat membuat tipe objek jika Anda membutuhkan sesuatu yang lebih rumit daripada daftar angka.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Nilai Daftar Sisipan MyBatis

  2. Oracle Forms 6i lumpuh dengan 0xC0000005 di awal setelah menginstal patch 19

  3. Dapatkan daftar argumen dengan nilai default

  4. ORA-00942:tabel atau tampilan tidak ada ... dapatkah saya mendapatkan detail lebih lanjut?

  5. Memasukkan string dengan tanda kutip ganda ke dalam tabel