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

语法:

--语法1:   

FORALL 下标变量(只能当作下标被引用) IN 下限..上限   

  sql 语句;    --只允许一条 sql 语句   

  

  

--语法2:   

FORALL 下标变量 IN INDICES OF(跳过没有赋值的元素,例如被 DELETE 的元素,NULL 也算值) 集合   

  [BETWEEN 下限 AND 上限]   

  sql 语句;   

  

  

--语法3:   

FORALL 下标变量 IN VALUES OF 集合(把该集合中的值当作下标,且该集合值的类型只能是 PLS_INTEGER BINARY_INTEGER)   

  sql 语句; 

 

create table tb1(   

  id number(5),   

  name varchar2(50)   

);  

语法1演示:

  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演示:

  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演示:

  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  

备注:本文转自网络,非原创