Oracle 中的 FORALL 语句

用FORALL来增强DML的处理能力
     Oracle8i中语句:BULK COLLECT和FORALL。这两个语句在PL/SQL内部进行一种数组处理 
	(1)BULK COLLECT提供对数据的高速检索
	(2)FORALL可大大改进INSERT、UPDATE和DELETE操作的性能。
    Oracle数据库使用这些语句大大减少了PL/SQL与SQL语句执行引擎的环境切换次数,从而使其性能有了显著提高。
使用BULK COLLECT,你可以将多个行引入一个或多个集合中,而不是单独变量或记录中(一次循环获取多行)
而传统的  open 打开游标 fetch 游标只得到(一次循环获取一行)

这里只讲  FORALL 下次再讲 BULK COLLECT

当要在 Oracle 中之心批量 INSERT、UPDATE 和 DELETE 操作时,可以使用 FORALL 语句。


  
  
Sql代码   收藏代码
  1. create table tb1(  
  2.   id number(5),  
  3.   name varchar2(50)  
  4. );  
 

语法1演示:

 

Sql代码   收藏代码
  1. --批量插入演示  
  2. declare  
  3.   type tb_table_type is table of tb1%rowtype  
  4.     index by binary_integer;  
  5.   tb_table tb_table_type;  
  6. begin  
  7.   for i in 1..10 loop  
  8.     tb_table(i).id:=i;  
  9.     tb_table(i).name:='NAME'||i;  
  10.   end loop;  
  11.   forall i in 1..tb_table.count  
  12.     insert into tb1 values tb_table(i);  
  13. end;  
  14.   
  15.   
  16. --批量修改演示  
  17. declare  
  18.   type tb_table_type is table of tb1%rowtype  
  19.   index by binary_integer;  
  20.   tb_table tb_table_type;  
  21. begin  
  22.   for i in 1..10 loop  
  23.     tb_table(i).id:=i;  
  24.     tb_table(i).name:='NAMES'||i;  
  25.   end loop;  
  26.   forall i in 1..tb_table.count  
  27.     update tb1 t set row = tb_table(i) where t.id = tb_table(i).id;  
  28. end;  
  29.   
  30.   
  31. --批量删除演示  
  32. declare  
  33.   type tb_table_type is table of tb1%rowtype  
  34.   index by binary_integer;  
  35.   tb_table tb_table_type;  
  36. begin  
  37.   for i in 1..10 loop  
  38.     tb_table(i).id:=i;  
  39.     tb_table(i).name:='NAMES'||i;  
  40.   end loop;  
  41.   forall i in 1..tb_table.count  
  42.     delete tb1 where id = tb_table(i).id;  
  43. end;  
 

 

语法2演示:

 

Sql代码   收藏代码
  1. select * from tb1;  
  2. declare  
  3.   type demo_table_type is table of demo%rowtype  
  4.     index by binary_integer;  
  5.   demo_table demo_table_type;  
  6. begin  
  7.   for i in 1..10 loop  
  8.     demo_table(i).id:=i;  
  9.     demo_table(i).name:='NAME'||i;  
  10.   end loop;  
  11.   demo_table.delete(3);  
  12.   demo_table.delete(6);  
  13.   demo_table.delete(9);  
  14.   forall i in indices of demo_table  
  15.     insert into demo values demo_table(i);  
  16. end;  
  17.   
  18. select * from demo;  
  19. 1   1   NAME1  
  20. 2   2   NAME2  
  21. 3   4   NAME4  
  22. 4   5   NAME5  
  23. 5   7   NAME7  
  24. 6   8   NAME8  
  25. 7   10  NAME10  

 

语法3演示:

Sql代码   收藏代码
  1. declare  
  2.   type index_poniter_type is table of pls_integer;  
  3.   index_poniter index_poniter_type;  
  4.   type demo_table_type is table of demo%rowtype  
  5.     index by binary_integer;  
  6.   demo_table demo_table_type;  
  7. begin  
  8.   index_poniter:=index_poniter_type(1,3,5,7);  
  9.   for i in 1..10 loop  
  10.     demo_table(i).id:=i;  
  11.     demo_table(i).name:='NAME'||i;  
  12.   end loop;  
  13.   forall i in values of index_poniter  
  14.     insert into demo values demo_table(i);  
  15. end;  
  16.   
  17.   
  18. select * from demo;  
  19. 1   1   NAME1  
  20. 2   3   NAME3  
  21. 3   5   NAME5  
  22. 4   7   NAME7  

当要在 Oracle 中之心批量 INSERT、UPDATE 和 DELETE 操作时,可以使用 FORALL 语句。

 

语法:

 

Sql代码   收藏代码
  1. --语法1:  
  2. FORALL 下标变量(只能当作下标被引用) IN 下限..上限  
  3.   sql 语句;    --只允许一条 sql 语句  
  4.   
  5.   
  6. --语法2:  
  7. FORALL 下标变量 IN INDICES OF(跳过没有赋值的元素,例如被 DELETE 的元素,NULL 也算值) 集合  
  8.   [BETWEEN 下限 AND 上限]  
  9.   sql 语句;  
  10.   
  11.   
  12. --语法3:  
  13. FORALL 下标变量 IN VALUES OF 集合(把该集合中的值当作下标,且该集合值的类型只能是 PLS_INTEGER BINARY_INTEGER)  
  14.   sql 语句;  

 

 

 

Sql代码   收藏代码
  1. create table tb1(  
  2.   id number(5),  
  3.   name varchar2(50)  
  4. );  
 

语法1演示:

 

Sql代码   收藏代码
  1. --批量插入演示  
  2. declare  
  3.   type tb_table_type is table of tb1%rowtype  
  4.     index by binary_integer;  
  5.   tb_table tb_table_type;  
  6. begin  
  7.   for i in 1..10 loop  
  8.     tb_table(i).id:=i;  
  9.     tb_table(i).name:='NAME'||i;  
  10.   end loop;  
  11.   forall i in 1..tb_table.count  
  12.     insert into tb1 values tb_table(i);  
  13. end;  
  14.   
  15.   
  16. --批量修改演示  
  17. declare  
  18.   type tb_table_type is table of tb1%rowtype  
  19.   index by binary_integer;  
  20.   tb_table tb_table_type;  
  21. begin  
  22.   for i in 1..10 loop  
  23.     tb_table(i).id:=i;  
  24.     tb_table(i).name:='NAMES'||i;  
  25.   end loop;  
  26.   forall i in 1..tb_table.count  
  27.     update tb1 t set row = tb_table(i) where t.id = tb_table(i).id;  
  28. end;  
  29.   
  30.   
  31. --批量删除演示  
  32. declare  
  33.   type tb_table_type is table of tb1%rowtype  
  34.   index by binary_integer;  
  35.   tb_table tb_table_type;  
  36. begin  
  37.   for i in 1..10 loop  
  38.     tb_table(i).id:=i;  
  39.     tb_table(i).name:='NAMES'||i;  
  40.   end loop;  
  41.   forall i in 1..tb_table.count  
  42.     delete tb1 where id = tb_table(i).id;  
  43. end;  
 

 

语法2演示:

 

Sql代码   收藏代码
  1. select * from tb1;  
  2. declare  
  3.   type demo_table_type is table of demo%rowtype  
  4.     index by binary_integer;  
  5.   demo_table demo_table_type;  
  6. begin  
  7.   for i in 1..10 loop  
  8.     demo_table(i).id:=i;  
  9.     demo_table(i).name:='NAME'||i;  
  10.   end loop;  
  11.   demo_table.delete(3);  
  12.   demo_table.delete(6);  
  13.   demo_table.delete(9);  
  14.   forall i in indices of demo_table  
  15.     insert into demo values demo_table(i);  
  16. end;  
  17.   
  18. select * from demo;  
  19. 1   1   NAME1  
  20. 2   2   NAME2  
  21. 3   4   NAME4  
  22. 4   5   NAME5  
  23. 5   7   NAME7  
  24. 6   8   NAME8  
  25. 7   10  NAME10  

 

语法3演示:

Sql代码   收藏代码
  1. declare  
  2.   type index_poniter_type is table of pls_integer;  
  3.   index_poniter index_poniter_type;  
  4.   type demo_table_type is table of demo%rowtype  
  5.     index by binary_integer;  
  6.   demo_table demo_table_type;  
  7. begin  
  8.   index_poniter:=index_poniter_type(1,3,5,7);  
  9.   for i in 1..10 loop  
  10.     demo_table(i).id:=i;  
  11.     demo_table(i).name:='NAME'||i;  
  12.   end loop;  
  13.   forall i in values of index_poniter  
  14.     insert into demo values demo_table(i);  
  15. end;  
  16.   
  17.   
  18. select * from demo;  
  19. 1   1   NAME1  
  20. 2   3   NAME3  
  21. 3   5   NAME5  
  22. 4   7   NAME7  

 
Sql代码   收藏代码
  1. create table tb1(  
  2.   id number(5),  
  3.   name varchar2(50)  
  4. );  
 

语法1演示:

 

Sql代码   收藏代码
  1. --批量插入演示  
  2. declare  
  3.   type tb_table_type is table of tb1%rowtype  
  4.     index by binary_integer;  
  5.   tb_table tb_table_type;  
  6. begin  
  7.   for i in 1..10 loop  
  8.     tb_table(i).id:=i;  
  9.     tb_table(i).name:='NAME'||i;  
  10.   end loop;  
  11.   forall i in 1..tb_table.count  
  12.     insert into tb1 values tb_table(i);  
  13. end;  
  14.   
  15.   
  16. --批量修改演示  
  17. declare  
  18.   type tb_table_type is table of tb1%rowtype  
  19.   index by binary_integer;  
  20.   tb_table tb_table_type;  
  21. begin  
  22.   for i in 1..10 loop  
  23.     tb_table(i).id:=i;  
  24.     tb_table(i).name:='NAMES'||i;  
  25.   end loop;  
  26.   forall i in 1..tb_table.count  
  27.     update tb1 t set row = tb_table(i) where t.id = tb_table(i).id;  
  28. end;  
  29.   
  30.   
  31. --批量删除演示  
  32. declare  
  33.   type tb_table_type is table of tb1%rowtype  
  34.   index by binary_integer;  
  35.   tb_table tb_table_type;  
  36. begin  
  37.   for i in 1..10 loop  
  38.     tb_table(i).id:=i;  
  39.     tb_table(i).name:='NAMES'||i;  
  40.   end loop;  
  41.   forall i in 1..tb_table.count  
  42.     delete tb1 where id = tb_table(i).id;  
  43. end;  
 

 

语法2演示:

 

Sql代码   收藏代码
  1. select * from tb1;  
  2. declare  
  3.   type demo_table_type is table of demo%rowtype  
  4.     index by binary_integer;  
  5.   demo_table demo_table_type;  
  6. begin  
  7.   for i in 1..10 loop  
  8.     demo_table(i).id:=i;  
  9.     demo_table(i).name:='NAME'||i;  
  10.   end loop;  
  11.   demo_table.delete(3);  
  12.   demo_table.delete(6);  
  13.   demo_table.delete(9);  
  14.   forall i in indices of demo_table  
  15.     insert into demo values demo_table(i);  
  16. end;  
  17.   
  18. select * from demo;  
  19. 1   1   NAME1  
  20. 2   2   NAME2  
  21. 3   4   NAME4  
  22. 4   5   NAME5  
  23. 5   7   NAME7  
  24. 6   8   NAME8  
  25. 7   10  NAME10  

 

语法3演示:

Sql代码   收藏代码
  1. declare  
  2.   type index_poniter_type is table of pls_integer;  
  3.   index_poniter index_poniter_type;  
  4.   type demo_table_type is table of demo%rowtype  
  5.     index by binary_integer;  
  6.   demo_table demo_table_type;  
  7. begin  
  8.   index_poniter:=index_poniter_type(1,3,5,7);  
  9.   for i in 1..10 loop  
  10.     demo_table(i).id:=i;  
  11.     demo_table(i).name:='NAME'||i;  
  12.   end loop;  
  13.   forall i in values of index_poniter  
  14.     insert into demo values demo_table(i);  
  15. end;  
  16.   
  17.   
  18. select * from demo;  
  19. 1   1   NAME1  
  20. 2   3   NAME3  
  21. 3   5   NAME5  
  22. 4   7   NAME7  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值