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

Oracle - Dalam pertanyaan CLAUSE saat menggunakan dengan banyak nilai, menjadikannya dinamis

Sayangnya, jika tipe koleksi Anda didefinisikan dalam PL/SQL (bukan SQL), Anda tidak dapat menggunakannya dalam SQL karena mesin SQL tidak tahu cara menanganinya.

Jika sebaliknya Anda mendefinisikan tipe koleksi dalam SQL, mis.

CREATE TYPE varchar_tbl
    IS TABLE OF varchar2(40);

Kemudian Anda dapat melakukan sesuatu seperti

SELECT col1
  FROM table1 t1
 WHERE t1.id IN (SELECT column_value
                   FROM TABLE( <<variable of type varchar2_tbl>> ) )

tergantung pada versi Oracle-- sintaks untuk menggunakan koleksi di SQL telah berkembang dari waktu ke waktu-- versi Oracle yang lebih lama memiliki sintaks yang lebih kompleks.

Anda dapat mengonversi larik asosiatif PL/SQL (VARCHAR_ARRAY_TYPE Anda) ke kumpulan tabel bersarang SQL di PL/SQL, tetapi itu memerlukan iterasi melalui larik asosiatif dan mengisi tabel bersarang, yang sedikit menyusahkan. Dengan asumsi bahwa VARCHAR_TBL kumpulan tabel bersarang telah dibuat

SQL> CREATE OR REPLACE TYPE varchar_tbl
         IS TABLE OF varchar2(40);

Anda dapat mengonversi dari array asosiatif ke tabel bersarang dan menggunakan tabel bersarang dalam pernyataan SQL seperti ini (menggunakan tabel SCOTT.EMP)

declare
  type varchar_array_type
    is table of varchar2(40)
       index by binary_integer;
  l_associative_array varchar_array_type;
  l_index             binary_integer;
  l_nested_table      varchar_tbl := new varchar_tbl();
  l_cnt               pls_integer;
begin
  l_associative_array( 1 ) := 'FORD';
  l_associative_array( 10 ) := 'JONES';
  l_associative_array( 100 ) := 'NOT A NAME';
  l_associative_array( 75 ) := 'SCOTT';
  l_index := l_associative_array.FIRST;
  while( l_index IS NOT NULL )
  loop
    l_nested_table.EXTEND;
    l_nested_table( l_nested_table.LAST ) :=
             l_associative_array( l_index );
    l_index := l_associative_array.NEXT( l_index );
  end loop;
  SELECT COUNT(*)
    INTO l_cnt
    FROM emp
   WHERE ename IN (SELECT column_value
                     FROM TABLE( l_nested_table ) );
  dbms_output.put_line( 'There are ' || l_cnt || ' employees with a matching name' );
end;

Karena mengonversi antar tipe koleksi sedikit merepotkan, bagaimanapun, Anda biasanya akan lebih baik hanya menggunakan koleksi tabel bersarang (dan meneruskannya ke prosedur tersimpan) kecuali ada alasan tertentu bahwa array asosiatif diperlukan.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Partisi Oracle berdasarkan ID dan subpartisi berdasarkan DATE dengan interval

  2. Bisakah seseorang menjelaskan apa yang sebenarnya dilakukan oleh pernyataan MERGE di Oracle?

  3. Bagaimana cara mengganti nilai sqlldr

  4. Oracle SQL :stempel waktu di mana klausa

  5. PLS-00201:pengenal UTIL_FILE harus dideklarasikan