Oracle PL/SQL Returning 用法


通常, 我們在做完 DML (Insert, Update, Delete) 之後,

若要取得 "相同 Table 相同條件" 的資料值,

就必須再執行 Select 語法,

現在可透過 Returning 節省一次語法,

參考如下 :

原始範例 :
 程式碼
-- 建立 Temp Table
create table tom_test ( aa number, amt number, code varchar2(100) );
 
declare
   v_amt  number;
   v_code varchar2(100);
begin
   -- 新增 Data
   insert into tom_test
        values( 1, 100, 'aaa' );
  
   -- 取得剛新增的 Data
   select code
     into v_code
     from tom_test
    where aa = 1;
  
   dbms_output.put_line( 'code = ' || v_code );
  
   -- 修改 Data
   update tom_test
      set amt  = amt + 100
        , code = 'xxx'
    where aa = 1;
  
   -- 取得該修改的 Data
   select amt, code
     into v_amt, v_code
     from tom_test
    where aa = 1;
  
   dbms_output.put_line( 'code = ' || v_code );
   dbms_output.put_line( 'amt = ' || v_amt );
  
   -- 刪除 Data
   delete
     from tom_test
    where aa = 1;
   
   -- 無法取得剛刪除資料的其他欄位值
end;
 
-- 刪除 Temp Table
drop table tom_test;
 
-- 結果 :
code = aaa
code = xxx
amt = 200

Returning 範例 :
 程式碼
-- 建立 Temp Table
create table tom_test ( aa number, amt number, code varchar2(100) );
 
declare
   v_amt  number;
   v_code varchar2(100);
begin
   -- 新增 Data, 然後再取得資料
   insert into tom_test
        values( 1, 100, 'aaa' )
     returning code into v_code;
  
   dbms_output.put_line( 'code = ' || v_code );
  
   -- 修改 Data, 然後再取得資料
   update tom_test
      set amt  = amt + 100
        , code = 'xxx'
    where aa = 1
   returning amt, code into v_amt, v_code;
  
   dbms_output.put_line( 'code = ' || v_code );
   dbms_output.put_line( 'amt = ' || v_amt );
  
   -- 刪除 Data, 然後取得舊有資料
   delete
     from tom_test
    where aa = 1
   returning code into v_code;
  
   dbms_output.put_line( 'code = ' || v_code );
end;
 
-- 刪除 Temp Table
drop table tom_test;
 
-- 結果 :
code = aaa
code = xxx
amt = 200
code = xxx

進階用法, 若 returning 一次多筆資料, 可以用 returning ... bulk collect into ... 以上, SQL 語法是不是簡化了呢.
Related Posts Plugin for WordPress, Blogger...