在日常的数据库操作中,我们经常需要在执行DML语句(INSERT、UPDATE和DELETE)之后,获取被操作数据的信息。常规的做法是在DML执行前后执行SELECT语句来查询数据。但这样做不仅增加了代码量,还可能影响性能。
幸运的是,Oracle数据库提供了一个强大而简洁的特性:RETURNING INTO子句。它允许我们在同一条DML语句中直接返回受影响行的列值,极大地提升了代码的效率和可读性。
RETURNING INTO 子句简介
RETURNING INTO子句可以附加在DML语句之后,用于将受影响数据行的列值存储到指定变量中。具体来说:
-
INSERT操作:返回插入后的值 -
UPDATE操作:返回更新后的值 -
DELETE操作:返回删除前的值
这一特性既可以在SQL*Plus中使用,也可以在PL/SQL中使用,下面通过实际示例来展示其用法。

SQL*Plus 中的使用示例
INSERT 操作
VARIABLE info varchar2(40);
insert into scott.dept values (50, 'TECHNICAL', 'FUJIAN')
returning dname || ':' || loc into :info;
commit;
print :info;
执行结果:
INFO
----------------------------------------
TECHNICAL:FUJIAN
UPDATE 操作
VARIABLE info varchar2(40);
update scott.dept set deptno = 51 where dname = 'TECHNICAL'
returning dname || ':' || loc into :info;
commit;
print :info;
执行结果:
INFO
----------------------------------------
TECHNICAL:FUJIAN
DELETE 操作
VARIABLE info varchar2(40);
delete scott.dept where dname = 'TECHNICAL'
returning dname || ':' || loc into :info;
commit;
print :info;
执行结果:
INFO
----------------------------------------
TECHNICAL:FUJIAN
PL/SQL 中的使用示例
INSERT 操作
set serveroutput on;
declare
row_id rowid;
info varchar2(40);
begin
insert into scott.dept values (50, 'TECHNICAL', 'FUJIAN')
returning rowid, dname || ':' || to_char(deptno) || ':' || loc
into row_id, info;
commit;
dbms_output.put_line(info);
end;
/
执行结果:
TECHNICAL:50:FUJIAN
PL/SQL 过程已成功完成。
UPDATE 操作
declare
row_id rowid;
info varchar2(40);
begin
update scott.dept set deptno = 51 where dname = 'TECHNICAL'
returning rowid, dname || ':' || loc into row_id, info;
commit;
dbms_output.put_line(info);
end;
/
执行结果:
TECHNICAL:FUJIAN
PL/SQL 过程已成功完成。
DELETE 操作
declare
row_id rowid;
info varchar2(40);
begin
delete scott.dept where dname = 'TECHNICAL'
returning rowid, dname || ':' || loc into row_id, info;
commit;
dbms_output.put_line(info);
end;
/
执行结果:
TECHNICAL:FUJIAN
PL/SQL 过程已成功完成。
总结
Oracle的RETURNING INTO子句是一个极其实用的特性,它能够:
-
减少数据库往返次数:将DML操作和结果获取合并为一步 -
提高代码简洁性:避免了额外的SELECT查询语句 -
提升程序性能:减少了数据库调用开销 -
增强数据一致性:确保获取的数据与DML操作完全对应
无论是简单的SQL*Plus脚本还是复杂的PL/SQL程序,RETURNING INTO子句都能让你的数据库操作更加高效和优雅。下次当你在Oracle中执行DML操作时,不妨尝试使用这一强大功能,体验它带来的便利和效率提升!

