از نسخه های قدیمی اوراکل امکان استفاده از عبارت 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