Thật không may, nếu loại bộ sưu tập của bạn được xác định trong PL / SQL (chứ không phải SQL), bạn không thể sử dụng nó trong SQL vì công cụ SQL không biết cách xử lý nó.
Nếu thay vào đó, bạn đã xác định loại tập hợp trong SQL, tức là
CREATE TYPE varchar_tbl
IS TABLE OF varchar2(40);
Sau đó, bạn có thể làm điều gì đó như
SELECT col1
FROM table1 t1
WHERE t1.id IN (SELECT column_value
FROM TABLE( <<variable of type varchar2_tbl>> ) )
tùy thuộc vào phiên bản Oracle - cú pháp để sử dụng bộ sưu tập trong SQL đã phát triển theo thời gian - các phiên bản cũ của Oracle có cú pháp phức tạp hơn.
Bạn có thể chuyển đổi một mảng liên kết PL / SQL (VARCHAR_ARRAY_TYPE của bạn) thành một tập hợp bảng lồng nhau SQL trong PL / SQL, nhưng điều đó yêu cầu lặp qua mảng kết hợp và điền vào bảng lồng nhau, điều này hơi khó. Giả sử rằng VARCHAR_TBL
bộ sưu tập bảng lồng nhau đã được tạo sẵn
SQL> CREATE OR REPLACE TYPE varchar_tbl
IS TABLE OF varchar2(40);
bạn có thể chuyển đổi từ mảng kết hợp sang bảng lồng nhau và sử dụng bảng lồng nhau trong một câu lệnh SQL như thế này (sử dụng bảng 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;
Tuy nhiên, vì việc chuyển đổi giữa các kiểu tập hợp là một chút khó khăn, nói chung tốt hơn là bạn chỉ nên sử dụng tập hợp bảng lồng nhau (và chuyển nó vào thủ tục được lưu trữ) trừ khi có một lý do cụ thể nào đó mà mảng liên kết là cần thiết.