oracle12C--批量綁定(63)

  • 定義
    • 批量綁定可以將操作結果返回到某一個集合中,也可以使數據庫一次性接收多條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參數集合最小值 .. 參數集合最大值
EXECUTE IMMEDIATE 動態SQL字符串
[USING 綁定參數| 綁定參數(索引),.....]
[[RETURNING | RETURN] BULK COLLECT INTO 綁定參數集合,.....];

  • 示例:通過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個集合中

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章