-
定義
- 批量綁定可以將操作結果返回到某一個集合中,也可以使數據庫一次性接收多條SQL;
-
舉個栗子
-
示例1:更新時使用BULK COLLECT語句
-
DECLARE TYPE ename_index IS TABLE OF emp.ename%TYPE INDEX BY PLS_INTEGER ; TYPE job_index IS TABLE OF emp.job%TYPE INDEX BY PLS_INTEGER ; TYPE sal_index IS TABLE OF emp.sal%TYPE INDEX BY PLS_INTEGER ; v_ename ename_index ; v_job job_index ; v_sal sal_index ; v_sql_statement VARCHAR2(200) ; --定義動態SQL v_deptno emp.deptno%TYPE := 10 ; --查詢10部門 BEGIN v_sql_statement := 'UPDATE emp SET sal=sal*1.2 WHERE deptno=:dno ' || ' RETURNING ename,job,sal INTO :ena, :ej, :es' ; --此時返回多行更新結果 EXECUTE IMMEDIATE v_sql_statement USING v_deptno RETURNING BULK COLLECT INTO v_ename,v_job,v_sal ; FOR x IN 1 .. v_ename.COUNT LOOP DBMS_OUTPUT.put_line('僱員姓名:' || v_ename(x) || ',職位:' || v_job(x) || ',工資:' || v_sal(x)) ; END LOOP ; END ; / |
本程序在定義更新的動態SQL語句後會同時影響到多行數據的更新,所以執行此SQL時,會利用BULK COLLECT INTO語句,將所有取得的數據一次性寫入到指定的索引表集合中,這樣只需要一次就可以取得所有的結果 |
-
示例2:查詢時使用BULK COLLECT
DECLARE TYPE ename_index IS TABLE OF emp.ename%TYPE INDEX BY PLS_INTEGER ; --保存僱員姓名 TYPE job_index IS TABLE OF emp.job%TYPE INDEX BY PLS_INTEGER ; --保存僱員職位 TYPE sal_index IS TABLE OF emp.sal%TYPE INDEX BY PLS_INTEGER ; --保存僱員工資 v_ename ename_index ; v_job job_index ; v_sal sal_index ; v_sql_statement VARCHAR2(200) ; --定義動態SQL v_deptno emp.deptno%TYPE := 10 ; --查詢10部門 BEGIN v_sql_statement := 'SELECT ename,job,sal FROM emp WHERE deptno=:dno' ; --此時返回多行更新結果 EXECUTE IMMEDIATE v_sql_statement BULK COLLECT INTO v_ename,v_job,v_sal USING v_deptno ; --將多個結果一起返回 FOR x IN 1 .. v_ename.COUNT LOOP DBMS_OUTPUT.put_line('僱員姓名:' || v_ename(x) || ',職位:' || v_job(x) || ',工資:' || v_sal(x)) ; END LOOP ; END ; / |
本程序採用了同樣的方式將所有的查詢結果通過BULK COLLECT INTO分別保存到3個索引表集合中,然後採用循環輸出所查詢出的數據 |
-
使用FORALL設置多個參數
- 語法:
FORALL 索引變量 IN參數集合最小值 ..
參數集合最大值 |
- 示例:通過FORALL設置多個參數
DECLARE TYPE empno_nested IS TABLE OF emp.empno%TYPE ; --定義嵌套表 TYPE ename_index IS TABLE OF emp.ename%TYPE INDEX BY PLS_INTEGER ; --定義索引表 TYPE job_index IS TABLE OF emp.job%TYPE INDEX BY PLS_INTEGER ; --定義索引表 TYPE sal_index IS TABLE OF emp.sal%TYPE INDEX BY PLS_INTEGER ; --定義索引表 v_ename ename_index ; --保存刪除後的姓名 v_job job_index ; --保存刪除後的職位 v_sal sal_index ; --保存刪除後的工資 v_empno empno_nested := empno_nested(7369,7566,7788) ; --定義要刪除僱員編號 v_sql_statement VARCHAR2(200) ; --動態SQL BEGIN v_sql_statement := 'DELETE FROM emp WHERE empno=:eno ' || ' RETURNING ename,job,sal INTO :ena , :ej , :es' ; --刪除數據SQL FORALL x IN 1 .. v_empno.COUNT -- FORALL綁定多個變量 EXECUTE IMMEDIATE v_sql_statement USING v_empno(x) RETURNING BULK COLLECT INTO v_ename,v_job,v_sal ; FOR x IN 1 .. v_ename.COUNT LOOP DBMS_OUTPUT.put_line('僱員姓名:' || v_ename(x) || ',職位:' || v_job(x) || ',工資:' || v_sal(x)) ; END LOOP ; END ; / |
該程序通過FORALL操作向動態SQL語句中設置了多個參數(所有參數保存在v_empno嵌套表類型變量中),同時此操作也會返回多行要刪除的數據信息,這些數據通過BULK COLLECT INTO分別保存在3個集合中 |