26.PLSQL中使用forall和bulk collect批量操作資料庫
阿新 • • 發佈:2019-02-15
假設有以下資料表emp:
一、使用forall批量修改資料庫
如果有以下需求:要求修改EMPNO為7499、7566、和7654的成員的sal值為5000,如果我們在Plsql中使用for迴圈,如下:顯然,上面的程式碼執行了三次資料庫更新操作,使用foral是for一種特殊的用法,l可以只用一次資料庫操作批量地更新資料: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; /
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; /
結果如下: