ITPub博客

首页 > 应用开发 > IT综合 > 连续插值,用forall实现。

连续插值,用forall实现。

原创 IT综合 作者:lsl031 时间:2007-09-02 10:22:51 0 删除 编辑

最开始考虑用记录表实现,如下的过程。但调试时出现错误。

提示不能引用记录来实现。PL/SQL: ORA-22806: 不是对象或 REF

set serverout on
declare
i number;
type large_type_no is table number;
type large_type_desc is table varchar2(12);
type large_type_desc1 is table varchar2(12);
large_table large_type;
large_desc large_type_desc;
large_desc1 large_type_desc1;
start_time number(10);
stop_time number(10);
begin
start_time:=dbms_utility.get_time;
for i in 1..1000000 loop
large_table(i):=i+3000000;
large_desc(i):='very fat';
large_desc1(i):='tool';
end loop;
forall i in 1..large_table.count
insert into large1 values(large_table(i),large_desc(i),large_desc1(i));
stop_time:=dbms_utility.get_time;
dbms_output.put_line('总计时间:'|| to_char((start_time-stop_time)/100));
end;
/


SQL> @c: est.sql;
insert into large1 values(large_table(i).no,large_table(i).no_desc,large_table(i
).se_desc);
*
第 15 行出现错误:
ORA-06550: 第 15 行, 第 27 列:
PLS-00436: 实施限制: 不能引用记录的 BULK In-BIND 表的字段
ORA-06550: 第 15 行, 第 27 列:
PLS-00382: 表达式类型错误
ORA-06550: 第 15 行, 第 45 列:
PLS-00436: 实施限制: 不能引用记录的 BULK In-BIND 表的字段
ORA-06550: 第 15 行, 第 45 列:
PLS-00382: 表达式类型错误
ORA-06550: 第 15 行, 第 68 列:
PLS-00436: 实施限制: 不能引用记录的 BULK In-BIND 表的字段
ORA-06550: 第 15 行, 第 68 列:
PLS-00382: 表达式类型错误
ORA-06550: 第 15 行, 第 27 列:
PL/SQL: ORA-22806: 不是对象或 REF
ORA-06550: 第 15 行, 第 1 列:
PL/SQL: SQL Statement ignored

然后每个字段用了一个索引表来实现。

set serverout on
declare
i number;
type large_type_no is table of number index by binary_integer;
type large_type_desc is table of varchar2(12) index by binary_integer;
type large_type_desc1 is table of varchar2(12) index by binary_integer;
large_table large_type_no ;
large_desc large_type_desc;
large_desc1 large_type_desc1;

start_time number(10);
stop_time number(10);
begin

start_time:=dbms_utility.get_time;

for i in 1..1000000 loop
large_table(i):=i+3000000;
large_desc(i):='very fat';
large_desc1(i):='tool';
end loop;
forall i in 1..large_table.count
insert into large1 values(large_table(i),large_desc(i),large_desc1(i));

dbms_output.put_line(large_table.count);
stop_time:=dbms_utility.get_time;
dbms_output.put_line('总计时间:'|| to_char((start_time-stop_time)/100));
end;
/
SQL> @c: est2.sql;
1000000
总计时间:-33.11

PL/SQL 过程已成功完成。

用时33秒,插入100万条记录。

而不用批量插入时,以下脚本:

set serverout on
declare
i number;
start_time number(10);
stop_time number(10);
begin
start_time:=dbms_utility.get_time;
for i in 4000001..5000000 loop
insert into large1 values(i,'safsf','fdgfdgfdg');
end loop;
stop_time:=dbms_utility.get_time;

dbms_output.put_line('总计时间:'|| to_char((start_time-stop_time)/100));
end;
/

SQL> @c: est.sql;
总计时间:-152.03

PL/SQL 过程已成功完成。

100万用时152秒,是批量的5倍。当然排除掉因为数据增加而造成的写入成本。但效能提升还是很显著的。

注释:forall和bulk collect是对利用多维对象来一次性对数据进行sql操作,减少了pl/sql 和sql间的上下文切换而浪费的时间和资源。对记录的单条处理,放入了对对象的循环处理中,此时全部由pl/sql完成,不需要sql的接介入。

[@more@]

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/288166/viewspace-967574/,如需转载,请注明出处,否则将追究法律责任。

上一篇: scn号三秒递增。
请登录后发表评论 登录
全部评论

注册时间:2009-03-24

  • 博文量
    56
  • 访问量
    799141