26.PLSQL中使用forall和bulk collect批量操作数据库

        假设有以下数据表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;
/

        结果如下:




你可能感兴趣的:(Oracle数据库开发,Oracle数据库开发)