sql >> Database teknologi >  >> RDS >> Oracle

Oracle - I CLAUSE-spørgsmål ved brug med flere værdier, hvilket gør det dynamisk

Desværre, hvis din samlingstype er defineret i PL/SQL (i stedet for SQL), kan du ikke bruge den i SQL, fordi SQL-motoren ikke ved, hvordan den skal håndteres.

Hvis du i stedet definerede samlingstypen i SQL, dvs.

CREATE TYPE varchar_tbl
    IS TABLE OF varchar2(40);

Så kan du gøre sådan noget som

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

afhængigt af Oracle-versionen - syntaksen for brug af samlinger i SQL har udviklet sig over tid - havde ældre versioner af Oracle mere kompleks syntaks.

Du kan konvertere et PL/SQL-associativt array (din VARCHAR_ARRAY_TYPE) til en SQL-indlejret tabelsamling i PL/SQL, men det kræver iteration gennem det associative array og udfyldning af den indlejrede tabel, hvilket er lidt af en smerte. Forudsat at VARCHAR_TBL indlejret tabelsamling er allerede blevet oprettet

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

du kan konvertere fra det associative array til den indlejrede tabel og bruge den indlejrede tabel i en SQL-sætning som denne (ved hjælp af SCOTT.EMP-tabellen)

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;

Fordi det dog er lidt besværligt at konvertere mellem samlingstyper, ville du generelt være bedre stillet ved blot at bruge den indlejrede tabelsamling (og videregive den til den lagrede procedure), medmindre der er en særlig grund til, at det associative array er nødvendigt.




  1. PHP - PDO hente resultater med kolonne som indeks og kolonne som værdi

  2. Kommasepareret værdi og jokertegn i mysql

  3. VB6 ADODB.Recordset RecordCount-egenskaben returnerer altid -1

  4. Automatisk udvidelse af en Python-liste med formateret output