1

次のようなOracleオブジェクトタイプを作成しました。

CREATE OR REPLACE TYPE DFBOWNER."RPT_WIRE_IMPORT_ROWTYPE" AS OBJECT

(
REC_VALUE_DATE   DATE
)
/

そして、このタイプに基づくコレクション:

CREATE OR REPLACE TYPE DFBOWNER."RPT_WIRE_IMPORT_TABLETYPE" IS TABLE OF RPT_WIRE_IMPORT_RowType;
/

ここで、Oracle Bulk Collectを使用してコレクションにデータを入力し、プロシージャ内の構文に組み込みます。だから今、私はコレクションが実際に移入されたかどうかをテストしたいのですが、それを行う方法がわかりません。私はそれを調べてみました:

http://docs.oracle.com/cd/B28359_01/appdev.111/b28371/adobjcol.htm#autoId17しかし、必要なものが見つかりません。

別の質問もあります。プロシージャがデータをコレクションに一括収集する場合、コレクション内のデータはテーブルのように永続的になりますか?それとも、それは半永久的ですか...つまり、一時的なテーブルのように、セッションの間だけ生きます。

4

1 に答える 1

1

私はあなたが方法を探していると思います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にすべてを保持するコレクション内の要素を反復処理する方がはるかに理にかなっています。

于 2012-08-19T19:43:56.177 に答える