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

Bagaimana cara menggunakan parameter dalam klausa 'nilai di mana di ...'?

Menggunakan SQL dinamis adalah pendekatan paling sederhana dari sudut pandang pengkodean. Masalah dengan SQL dinamis, bagaimanapun, adalah Anda harus mem-parsing setiap versi kueri yang berbeda yang tidak hanya berpotensi membebani CPU Anda tetapi juga berpotensi membanjiri kumpulan bersama Anda dengan banyak pernyataan SQL yang tidak dapat dibagikan, mendorong pernyataan out yang ingin Anda tembolok, menyebabkan lebih banyak parsing yang sulit dan kesalahan fragmentasi kumpulan bersama. Jika Anda menjalankan ini sekali sehari, itu mungkin bukan masalah utama. Jika ratusan orang mengeksekusinya ribuan kali sehari, itu mungkin menjadi perhatian utama.

Contoh pendekatan SQL dinamis

SQL> ed
Wrote file afiedt.buf

  1  declare
  2    l_deptnos  varchar2(100) := '10,20';
  3    l_rc       sys_refcursor;
  4    l_dept_rec dept%rowtype;
  5  begin
  6    open l_rc for 'select * from dept where deptno in (' || l_deptnos || ')';
  7    loop
  8      fetch l_rc into l_dept_rec;
  9      exit when l_rc%notfound;
 10      dbms_output.put_line( l_dept_rec.dname );
 11    end loop;
 12    close l_rc;
 13* end;
SQL> /
ACCOUNTING
RESEARCH

PL/SQL procedure successfully completed.

Sebagai alternatif, Anda dapat menggunakan koleksi. Ini memiliki keuntungan menghasilkan satu kursor yang dapat dibagikan sehingga Anda tidak perlu khawatir tentang penguraian yang sulit atau membanjiri kumpulan bersama. Tapi itu mungkin membutuhkan sedikit lebih banyak kode. Cara paling sederhana untuk menangani koleksi

SQL> ed
Wrote file afiedt.buf

  1  declare
  2    l_deptnos  tbl_deptnos := tbl_deptnos(10,20);
  3  begin
  4    for i in (select *
  5                from dept
  6               where deptno in (select column_value
  7                                  from table(l_deptnos)))
  8    loop
  9      dbms_output.put_line( i.dname );
 10    end loop;
 11* end;
SQL> /
ACCOUNTING
RESEARCH

PL/SQL procedure successfully completed.

Sebaliknya, jika Anda benar-benar harus memulai dengan daftar nilai yang dipisahkan koma, maka Anda harus mengurai string tersebut ke dalam koleksi sebelum Anda dapat menggunakannya. Ada berbagai cara untuk mengurai string yang dibatasi-- favorit pribadi saya adalah menggunakan ekspresi reguler dalam kueri hierarkis tetapi Anda tentu saja dapat menulis pendekatan prosedural juga

SQL> ed
Wrote file afiedt.buf

  1  declare
  2    l_deptnos     tbl_deptnos;
  3    l_deptno_str  varchar2(100) := '10,20';
  4  begin
  5    select regexp_substr(l_deptno_str, '[^,]+', 1, LEVEL)
  6      bulk collect into l_deptnos
  7      from dual
  8   connect by level <= length(replace (l_deptno_str, ',', NULL));
  9    for i in (select *
 10                from dept
 11               where deptno in (select column_value
 12                                  from table(l_deptnos)))
 13    loop
 14      dbms_output.put_line( i.dname );
 15    end loop;
 16* end;
 17  /
ACCOUNTING
RESEARCH

PL/SQL procedure successfully completed.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SUM Bersyarat di Oracle

  2. Fungsi ROUND(angka) di Oracle

  3. Bergabunglah dengan Forum Tanya Jawab untuk Pengembang

  4. XMLtable dengan Oracle 11g

  5. Cara Membuat Laporan PDF Menggunakan PL/SQL