2010-02-24 55 views
2

我有两个非常大的表,我需要处理这些表中的小结果集。但是,处理是在几个函数中完成的,函数必须进行一些连接才能以适当的方式格式化数据。PL/SQL - 将两个结果集缓存到集合中并将它们结合在一起?

我肯定需要以某种方式缓存初始结果集,以便它可以被函数重用。我想要做的是将第一个结果集放入一个集合中,将第二个结果集放入另一个集合中,然后通过SQL查询处理这些集合,就好像它们是真正的SQL表一样。

你能建议如何做到这一点吗?

回答

1

您需要创建一个模式级别的类型(不在一个包内)作为一个嵌套表。您可以填充它们,然后您可以使用“table()”语句将它们作为普通表使用。

这个link解释你需要什么。一个快速示例

create type foo as table of number;-- or a record type, data%rowtype, whatever 
... 
myfoo1 foo := foo (1,2,3); 
myfoo2 foo := foo(3,4,5) 

select column_value 
into bar 
from table(foo1) join table(foo2) using (column_value) 
5

听起来像是临时表工作:

CREATE GLOBAL TEMPORARY TABLE table_name (...) ON ... 

ON有两种选择,具有不同的影响:

  1. ON COMMIT DELETE ROWS指定临时表是具体的交易。数据在表内持续到交易结束时间。如果结束事务,数据库会截断表(删除所有行)。假设如果您发出提交或运行ddl,那么临时表中的数据将会丢失。这是默认选项。

  2. ON COMMIT PRESERVE ROWS指定临时表将是会话特定的。数据在表格内持续到会话结束时间。如果结束会话,数据库会截断表(删除所有行)。假设你在SQL * Plus中键入exit,那么临时表中的数据将会丢失。

参考:

...但它可能是你并不需要使用临时表。派生表/内联视图/子查询(可能是流水线)可能可以做你想做的事情,但是信息很模糊,所以我不能推荐一种特定的方法。

3

如果您的集合是使用SQL类型声明的,则可以在具有TABLE()函数的SQL语句中使用它们。在Oracle 10g中,我们可以使用MULTISET UNION运算符合并集合。以下代码显示了这两种技术的示例...

SQL> declare 
    2  v1 sys.dbms_debug_vc2coll; 
    3  v2 sys.dbms_debug_vc2coll; 
    4  v3 sys.dbms_debug_vc2coll := sys.dbms_debug_vc2coll(); 
    5 begin 
    6  select ename 
    7  bulk collect into v1 
    8  from emp; 
    9  select dname 
10  bulk collect into v2 
11  from dept; 
12 
13  -- manipulate connects using SQL 
14 
15  for r in (select * from table(v1) 
16     intersect 
17     select * from table(v2) 
18    ) 
19  loop 
20   dbms_output.put_line('Employee '|| r.column_value ||' has same name as a department'); 
21  end loop; 
22 
23  -- combine two collections into one 
24 
25  dbms_output.put_line('V3 has '|| v3.count() ||' elements'); 
26  v3 := v1 multiset union v2; 
27  dbms_output.put_line('V3 now has '|| v3.count() ||' elements'); 
28 end; 
29/
Employee SALES has same name as a department 
V3 has 0 elements 
V3 now has 23 elements 

PL/SQL procedure successfully completed. 

SQL> 

还有其他一些方法可供您使用。通常最好使用SQL而不是PL/SQL,所以OMG Ponies对临时表的建议可能是合适的。这实际上取决于您的处理需求的确切细节。

相关问题