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.