假设有以下数据表emp:
一、使用forall批量修改数据库
如果有以下需求:要求修改EMPNO为7499、7566、和7654的成员的sal值为5000,如果我们在Plsql中使用for循环,如下:
declare
type empno_varray is varray(8) of emp.empno%type;
v_empno empno_varray :=empno_varray(7499,7566,7654);
begin
for x in v_empno.first..v_empno.last loop
update emp set sal=5000 where empno=v_empno(x);
end loop;
end;
/
显然,上面的代码执行了三次数据库更新操作,使用foral是for一种特殊的用法,l可以只用一次数据库操作批量地更新数据:
declare
type empno_varray is varray(8) of emp.empno%type;
v_empno empno_varray :=empno_varray(7499,7566,7654);
begin
forall x in v_empno.first..v_empno.last
update emp set sal=5000 where empno=v_empno(x);
end;
/
从上面forall的语法上也可以看出来,forall中并没有loop和endloop关键字,所以它并不是循环写入数据库,而是一次性写入,相当于执行下面的sql语句:
update emp set sal=5000 where empno in(7499,7566,7654);
执行的结果如下:
二、使用bulk collect 批量接收数据
假设有下面的需求,打印输出sal大于2000的所有雇员的姓名。之前使用的select...into 变量..语句只能向变量中插入一个数据,借助bulk collect我们可以实现批量的插入数据。
declare
type ename_varray is varray(20) of emp.ename%type;
v_ename ename_varray :=ename_varray();
begin
select ename bulk collect into v_ename from emp where sal>2000;
for x in v_ename.first..v_ename.last loop
dbms_output.put_line(v_ename(x));
end loop;
end;
/
结果如下: