oracle 動態語句中的returning用法

regonly1發表於2009-11-10

一般情況下,在plsql語句中,對一個表做update的時候,我們可以直接透過returning子句來得到更新的資料的情況(包括更新的和未更新的),如:
DECLARE
   type rec_return is record(ename varchar2(30), sal number(10,2));
   TYPE tbl_return IS TABLE OF rec_return index by pls_integer;
   v_ret    tbl_return;
BEGIN
   update scott.emp t
      set t.sal = t.sal + 100
   returning t.ename, t.sal bulk collect into v_ret;
END;
但是,如果是一個動態語句,我們如何實現類似returning bulk collect into這樣的功能呢?這個問題上次已經解決過一次,但是沒有記錄下來,很快就忘掉了,這次要用的時候就沒想起來。這次又翻了下文件,順便記錄下來:

DECLARE
   TYPE tbl_ename IS TABLE OF varchar2(255) index by pls_integer;
   type tbl_sal   is table of number(10,2) index by pls_integer;
   v_ret     tbl_ename;
   v_sal     tbl_sal;
   v_sqltext varchar2(2000) := '';
BEGIN
   v_sqltext := 'update scott.emp t set t.sal = t.sal + 100 returning t.ename, t.sal into :1, :2';
   execute immediate v_sqltext
   returning bulk collect into v_ret, v_sal;
END;

可惜的是,在10g中,不支援多維陣列,比如以上例子中ename和sal我可以組成一個record型別,然後再將這個record型別封裝成陣列,如:
SQL> DECLARE
  2      type rec_return is record(ename varchar2(255), sal number(10,2));
  3      TYPE tbl_return IS TABLE OF rec_return index by pls_integer;
  4      v_ret     tbl_return;
  5      v_sqltext varchar2(2000) := '';
  6  BEGIN
  7      v_sqltext := 'update scott.emp t set t.sal = t.sal + 100 returning t.ename, t.sal into :1, :2';
  8      execute immediate v_sqltext
  9      returning bulk collect into v_ret;
 10  END;
 11  /
 
DECLARE
    type rec_return is record(ename varchar2(255), sal number(10,2));
    TYPE tbl_return IS TABLE OF rec_return index by pls_integer;
    v_ret     tbl_return;
    v_sqltext varchar2(2000) := '';
BEGIN
    v_sqltext := 'update scott.emp t set t.sal = t.sal + 100 returning t.ename, t.sal into :1, :2';
    execute immediate v_sqltext
    returning bulk collect into v_ret;
END;
 
ORA-06550: 第 10 行, 第 5 列:
PLS-00429: RETURNING 子句不支援的功能
ORA-06550: 第 9 行, 第 5 列:
PL/SQL: Statement ignored
說明該種型別在動態語句的情況下不受支援。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12932950/viewspace-619353/,如需轉載,請註明出處,否則將追究法律責任。

相關文章