از نسخه های قدیمی اوراکل امکان استفاده از عبارت RETURNING INTO به همراه دستورات DMLای وجود داشت که در قسمت زیر نحوه استفاده از آن را می بینید:
SQL*Plus: Release 10.1.0.4.2 - Production on Tue Aug 15 14:08:30 2023 SQL> select * from tbl1; ID NAME ---------- ---------- 1 Vahid 2 Usef
SQL>declare var_id number; var_name varchar2(10); begin --Update update tbl1 set name='ALI' where id=2 returning name into var_name; dbms_output.put_line('After_Update==>' || name='||var_name); --Delete delete tbl1 where id=1 returning name into var_name; dbms_output.put_line('Before_Delete==>' || name='||var_name); --Insert insert into tbl1 values(3,'Reza') returning id,name into var_id,var_name; dbms_output.put_line('INSERT==> id='||var_id||' , name='||var_name); commit; end; /
After_Update==>name=ALI Before_Delete==> name=Vahid INSERT==> id=3 , name=Reza
SQL> select * from tbl1; ID NAME ---------- ---------- 2 ALI 3 Reza
در اوراکل 23c بهبودی در این زمینه ایجاد شد اوراکل دو عبارت OLD و NEW را هم در این زمینه اضافه کرده است برای دستور Update می توان از هر دو عبارت OLD و NEW استفاده کرد همچنین عبارت NEW برای دستور Insert و عبارت OLD برای دستور Delete قابل استفاده هستند.
syntax کلی عبارت RETURNING INTO در اوراکل 10g و 23c را در قسمت زیر مشاهده می کنید:
Oracle 10g: RETURNING <exprs> INTO <data_items>; Oracle 23c: ( RETURN | RETURNING) ( OLD | NEW ) expr [ , ( OLD | NEW ) expr ]+ INTO [data_item] ...
مثال زیر را ببنید:
SQL> select * from tbl1; ID NAME ---------- ---------- 1 Vahid 2 Usef
DECLARE OLD_Name varchar2(1000); NEW_Name varchar2(1000); New_Val_id number(10); BEGIN --'update' update tbl1 set name = 'ALI' where id = 2 RETURNING OLD name, NEW name INTO OLD_Name, NEW_Name; DBMS_OUTPUT.PUT_LINE('Update_OLD_Value-name = ' || OLD_Name); DBMS_OUTPUT.PUT_LINE('Update_NEW_Value-name = ' || NEW_Name); DBMS_OUTPUT.PUT_LINE('-------------------------------'); --'Delete' delete tbl1 where id=1 returning OLD name into OLD_Name; dbms_output.put_line('Before_Delete==> name='||OLD_Name); DBMS_OUTPUT.PUT_LINE('-------------------------------'); --'Insert' insert into tbl1 values(3,'Reza') RETURNING NEW id, NEW name into New_Val_id, NEW_Name; dbms_output.put_line('INSERT_New_Value==> id='|| New_Val_id ||' , name='|| NEW_Name); END; /
Update_OLD_Value-name = Usef Update_NEW_Value-name = ALI ------------------------------- Before_Delete==> name=Vahid ------------------------------- INSERT_New_Value==> id=3 , name=Reza