通常, 我們在做完 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 語法是不是簡化了呢.