您的位置:首页 > 数据库 > Oracle

Oracle中的Bulk Collect

2010-11-24 16:15 148 查看
bulk collect的作用
将查询出来的多条记录以集合的方式打包。
举例:
创建表

create table bc (
a number,
b varchar2(10)
);
插入内容如下

insert into bc_3 values (1, 1);
insert into bc_3 values (2, 1);
insert into bc_3 values (3, 1);

insert into bc_3 values (4, 2);
insert into bc_3 values (5, 2);
insert into bc_3 values (6, 2);
insert into bc_3 values (7, 2);

insert into bc_3 values (8, 3);
insert into bc_3 values (9, 3);
匿名块

declare
type numbers is table of number index by binary_integer;
n numbers;
begin
select a bulk collect into n from bc_3 where b=1;

for i in 1 .. n.count loop
dbms_output.put_line(n(i));
end loop;

end;

这里将b=1的所有记录的a值打包后一起放进numbers类型的b中。
这里numbers类型的元素是Oracle基本类型number。所以可以直接将多条记录打包放进去,如果numbers类型的元素是Object类型呢,这种情况的示例代码如下

有Object类型声明如下:
create or replace type varchar_number as object(
a number,
i number
)
---------------------------------------------------------------------
匿名块中的table类型t_varchar_number,其元素是varchar_number类型的object
declare
type t_varchar_number is table of varchar_number index by binary_integer;
n t_varchar_number;
begin
select varchar_number(a,b) bulk collect into n from bc_3 where b=1;
for i in 1 .. n.count loop
dbms_output.put_line(n(i).a);
end loop;
end;

说明:按照java中的话来说相当于在打包前,先用object类型的构造方法将其打包成对象,然后在打包。
bulk collect into会将对象之前的数据给覆盖
示例:

create table bc_3 (
a number,
b number
);

insert into bc_3 values (1, 1);
insert into bc_3 values (2, 1);
insert into bc_3 values (3, 1);

insert into bc_3 values (4, 2);
insert into bc_3 values (5, 2);
insert into bc_3 values (6, 2);
insert into bc_3 values (7, 2);

insert into bc_3 values (8, 3);
insert into bc_3 values (9, 3);

declare
type numbers is table of number;
n numbers;
begin
select a bulk collect into n from bc_3 where b=1;
select a bulk collect into n from bc_3 where b=3;

for i in 1 .. n.count loop
dbms_output.put_line(n(i));
end loop;
end;

匿名块执行的结果是:8,9
因为“select a bulk collect into n from bc_3 where b=3;
”的结果“8,9”会将先执行“select a bulk collect into n from bc_3 where b=1;
”的结果“1,2,3”覆盖。

如果想累计的话,就得把bulk去掉,或者把bulk collect去掉。也就是说collect into 和into效果是一样的,都会累计,不会覆盖。
本文出自 “linux要从娃娃抓起” 博客,请务必保留此出处http://wanqiufeng.blog.51cto.com/409430/431486
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: