1. 程式人生 > >26.PLSQL中使用forall和bulk collect批量操作資料庫

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;
/

        結果如下: