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.

但是一般来说,将所有数据从 SQL VM 拉到 PL/SQL VM 中,然后将所有数据传回 SQL VM 以发出SELECT语句,通常是没有意义的。将数据保存在 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.

迭代集合中的元素会更有意义,它将所有内容保存在 PL/SQL 中,而不是SELECT从集合中迭代,后者将所有数据强制返回 SQL VM。

于 2012-08-19T19:43:56.177 回答