私はあなたが方法を探していると思いますCOUNT
、すなわち
DECLARE
l_local_collection dbfowner.rpt_wire_import_tabletype;
BEGIN
SELECT sysdate + level
BULK COLLECT INTO l_local_collection
FROM dual
CONNECT BY level <= 10;
dbms_output.put_line( 'l_local_collection contains ' ||
l_local_collection.count ||
' elements.' );
END;
他のローカル変数と同様l_local_collection
に、それが宣言されているブロックのスコープを持ちます。データはセッションのPGAに保存されます。コレクション内のデータは永続的ではありません。
ローカルコレクションから選択できます
SQL> create type some_object as object (
2 rec_value_date date
3 );
4 /
Type created.
SQL> create type some_coll
2 as table of some_object;
3 /
Type created.
SQL> ed
Wrote file afiedt.buf
1 declare
2 l_local_collection some_coll;
3 begin
4 select some_object( sysdate + numtodsinterval( level, 'day' ) )
5 bulk collect into l_local_collection
6 from dual
7 connect by level <= 10;
8 for x in (select * from table( l_local_collection ))
9 loop
10 dbms_output.put_line( x.rec_value_date );
11 end loop;
12* end;
SQL> /
20-AUG-12
21-AUG-12
22-AUG-12
23-AUG-12
24-AUG-12
25-AUG-12
26-AUG-12
27-AUG-12
28-AUG-12
29-AUG-12
PL/SQL procedure successfully completed.
SELECT
ただし、ステートメントを発行するために、SQLVMからPL/ SQL VMにすべてのデータをプルしてから、すべてのデータをSQLVMに戻すという作業を行うことは一般的に意味がありません。一般に、データをSQLに保持するか、データを返すパイプラインテーブル関数を定義する方が理にかなっています。
コレクション内の要素を繰り返し処理したいだけの場合
SQL> ed
Wrote file afiedt.buf
1 declare
2 l_local_collection some_coll;
3 begin
4 select some_object( sysdate + numtodsinterval( level, 'day' ) )
5 bulk collect into l_local_collection
6 from dual
7 connect by level <= 10;
8 for i in 1 .. l_local_collection.count
9 loop
10 dbms_output.put_line( l_local_collection(i).rec_value_date );
11 end loop;
12* end;
SQL> /
20-AUG-12
21-AUG-12
22-AUG-12
23-AUG-12
24-AUG-12
25-AUG-12
26-AUG-12
27-AUG-12
28-AUG-12
29-AUG-12
PL/SQL procedure successfully completed.
SELECT
すべてのデータをSQLVMに強制的に戻すコレクションからよりも、PL/SQLにすべてを保持するコレクション内の要素を反復処理する方がはるかに理にかなっています。