Niestety, jeśli typ twojej kolekcji jest zdefiniowany w PL/SQL (a nie w SQL), nie możesz go używać w SQL, ponieważ silnik SQL nie wie, jak go obsłużyć.
Jeśli zamiast tego zdefiniowałeś typ kolekcji w SQL, tj.
CREATE TYPE varchar_tbl
IS TABLE OF varchar2(40);
Następnie możesz zrobić coś takiego
SELECT col1
FROM table1 t1
WHERE t1.id IN (SELECT column_value
FROM TABLE( <<variable of type varchar2_tbl>> ) )
w zależności od wersji Oracle - składnia do używania kolekcji w SQL ewoluowała z biegiem czasu - starsze wersje Oracle miały bardziej złożoną składnię.
Możesz przekonwertować tablicę asocjacyjną PL/SQL (Twój VARCHAR_ARRAY_TYPE) na zagnieżdżoną kolekcję tabel SQL w PL/SQL, ale wymaga to iteracji przez tablicę asocjacyjną i wypełnienia zagnieżdżonej tabeli, co jest trochę uciążliwe. Zakładając, że VARCHAR_TBL
zagnieżdżona kolekcja tabel została już utworzona
SQL> CREATE OR REPLACE TYPE varchar_tbl
IS TABLE OF varchar2(40);
możesz dokonać konwersji z tablicy asocjacyjnej do tabeli zagnieżdżonej i użyć tabeli zagnieżdżonej w takiej instrukcji SQL (używając tabeli 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;
Ponieważ konwersja między typami kolekcji jest trochę uciążliwa, zazwyczaj lepiej byłoby po prostu użyć zagnieżdżonej kolekcji tabel (i przekazać ją do procedury składowanej), chyba że istnieje konkretny powód, dla którego tablica asocjacyjna jest potrzebna.