1.DELETE的情况,RETURNING返回的肯定是DELETE之前的结果;

INSERT的情况,RETURNING返回的一定是INSERT之后的结果。

UPDATE的情况,RETURNING返回的一定是UPDATE之后的结果。

2.RETURNING语句似乎和RETURN通用。(即两个可以相互替换)

3.INSERT INTO VALUES语句支持RETURNING语句,而INSERT INTO SELECT语句不支持。

4.MERGE语句不支持RETURNING语句。

ORACLE的DML语句中可以指定RETURNING语句。RETURNING语句的使用在很多情况下可以简化PL/SQL编程。

在使用RETURNING子句是应注意以下几点限制:
  1.不能与DML语句和远程对象一起使用;
  2.不能检索LONG类型信息;
  3.当通过视图向基表中插入数据时,只能与单基表视图一起使用。

问题:
使用UPDATE语句的时候,RETURNING得到的结果是UPDATE之前的结果还是UPDATE之后的结果?

例:

SQL> CREATE TABLE T (ID NUMBER, NAME VARCHAR2(30));表已创建。
SQL> SET SERVEROUT ON
SQL> DECLAREV_NAME VARCHAR2(30);BEGININSERT INTO T VALUES (1, 'YANGTK') RETURNING NAME INTO V_NAME;DBMS_OUTPUT.PUT_LINE('INSERT: ' || V_NAME);V_NAME := NULL;UPDATE T SET NAME = 'YTK' RETURNING NAME INTO V_NAME;DBMS_OUTPUT.PUT_LINE('UPDATE: ' || V_NAME);V_NAME := NULL;DELETE T RETURNING NAME INTO V_NAME;DBMS_OUTPUT.PUT_LINE('DELETE: ' || V_NAME);END;/
INSERT: YANGTK
UPDATE: YTK
DELETE: YTKPL/SQL 过程已成功完成。

显然,UPDATE操作的RETURNING语句是返回UPDATE操作之后的结果。

顺便总结几个RETURNING操作相关的问题:

1.RETURNING语句似乎和RETURN通用。

SQL> SET SERVEROUT ON
SQL> DECLAREV_NAME VARCHAR2(30);BEGININSERT INTO T VALUES (1, 'YANGTK') RETURN NAME INTO V_NAME;DBMS_OUTPUT.PUT_LINE('INSERT: ' || V_NAME);V_NAME := NULL;UPDATE T SET NAME = 'YTK' RETURN NAME INTO V_NAME;DBMS_OUTPUT.PUT_LINE('UPDATE: ' || V_NAME);V_NAME := NULL;DELETE T RETURN NAME INTO V_NAME;DBMS_OUTPUT.PUT_LINE('DELETE: ' || V_NAME);END;/
INSERT: YANGTK
UPDATE: YTK
DELETE: YTKPL/SQL 过程已成功完成。

2.RETURNING语句也可以使用SQLPLUS的变量,这样,RETURNING语句不一定非要用在PL/SQL语句中。

SQL> VAR V_NAME VARCHAR2(30)
SQL> INSERT INTO T VALUES (1, 'YANGTK') RETURNING NAME INTO :V_NAME;已创建 1 行。SQL> PRINT V_NAMEV_NAME
--------------------------------
YANGTKSQL> UPDATE T SET NAME = 'YTK' RETURNING NAME INTO :V_NAME;已更新 1 行。SQL> PRINT V_NAMEV_NAME
--------------------------------
YTKSQL> DELETE T RETURNING NAME INTO :V_NAME;已删除 1 行。SQL> PRINT V_NAMEV_NAME
--------------------------------
YTK

3.INSERT INTO VALUES语句支持RETURNING语句,而INSERT INTO SELECT语句不支持。MERGE语句不支持RETURNING语句。

SQL> MERGE INTO T USING (SELECT * FROM T) T1ON (T.ID = T1.ID)WHEN MATCHED THEN UPDATE SET NAME = T1.NAMEWHEN NOT MATCHED THEN INSERT VALUES (T1.ID, T1.NAME)RETURNING NAME INTO :V_NAME;RETURNING NAME INTO :V_NAME
*第 5 行出现错误:
ORA-00933: SQL 命令未正确结束
SQL> INSERT INTO T SELECT * FROM T RETURNING NAME INTO :V_NAME;
INSERT INTO T SELECT * FROM T RETURNING NAME INTO :V_NAME
*第 1 行出现错误:
ORA-00933: SQL 命令未正确结束

RETURNING语句相关推荐

  1. oracle output语句,Oracle Returning 语句用法总结

    场景 在存储过程.PL/SQL块里需要返回INSERT.DELETE.UPDATE.MERGE等DML语句执行后的信息时使用,合理使用returning能够简化程序逻辑.提高程序性能. 概述 创建测试 ...

  2. java returning_JAVA中使用PostgreSQL的RETURNING语句来实现插入时快速获取insert id

    很多时候,当插入一条记录后,希望马上获得插入的主键id, 不少获得这个id的方法是 select max(id) from tablename; 为了获得这个id需要多执行一次sql语句. Postg ...

  3. PL/SQL 中Returning Into的用法

    ORACLE的DML语句中可以指定RETURNING INTO语句.RETURNING INTO语句的使用在很多情况下可以简化PL/SQL编程,少一次select into语句. DELETE操作:R ...

  4. oracle error 439,JDBC使用INSERT RETURN语句报错ORA-439

    在给客户开发人员讲解LOB列的访问方式后,开发人员尝试在JDBC中使用包含RETURN的INSERT语句,但是出现了ORA-439错误. 检查后发现客户的程序使用的还是PreparedStatemen ...

  5. oracle动态 returning,ORACLE RETURNING 用法总结

    ORACLE RETURNING用法总结 场景 在存储过程.PL/SQL块里需要返回INSERT.DELETE.UPDATE.MERGE等DML语句执行后的信息时使用,合理使用returning能够简 ...

  6. oracle动态 returning,ORACLE RETURNING 用法小结

    ORACLE RETURNING 用法总结 ORACLE RETURNING用法总结 场景 在存储过程.PL/SQL块里需要返回INSERT.DELETE.UPDATE.MERGE等DML语句执行后的 ...

  7. oracle returning into,PL/SQL 中Returning Into的用法

    ORACLE的DML语句中可以指定RETURNING INTO语句.RETURNING INTO语句的使用在很多情况下可以简化PL/SQL编程,少一次select into语句. DELETE操作:R ...

  8. mysql returning into_PL/SQL 中Returning Into的用法_MySQL

    ORACLE的DML语句中可以指定RETURNING INTO语句.RETURNING INTO语句的使用在很多情况下可以简化PL/SQL编程,少一次select into语句. DELETE操作:R ...

  9. oracle 触发器 upsert,如何使SQLAlchemy insert与Postgres多处理proof upsert触发器一起工作?...

    我有多处理应用程序,需要upsert(插入,如果存在更新)功能.在 我决定使用触发器解决方案来接近upsert.(为每个名为is_upsert的启用upsert的表添加额外的列,在触发器检查此字段时, ...

最新文章

  1. vs2003不能正常调试或运行!
  2. python读文件操作-python文件操作读取文件写入文件
  3. 在C#中实现Socket端口复用
  4. pythonyaml参数_使用python检查yaml配置文件是否符合要求
  5. UVa 1394 约瑟夫问题的变形
  6. ECharts插件的使用
  7. 武电实业卡密接口对接经验分享
  8. java随机生成字母用三元运算符,【代码笔记】Java常识性基础补充(一)——赋值运算符、逻辑运算符、三元运算符、Scanner类、键盘输入、Random类、随机数...
  9. 高通联手商汤科技共推终端人工智能
  10. 网页版在线客服实现代码
  11. 关于计算机WIFI网络(无线网卡)消失问题
  12. 服务器被挖矿入侵,进程 command为ld-linux-x86-64占用cpu很高
  13. UEditor上传文件大小超限,上传失败问题解决
  14. 图解python中的time、datetime模块及他们的时间格式转换(附:格林尼治时间gmt、本地时间、协调世界时utc)
  15. excel中利用综合应用len(),lenb(),left() ,find()函数筛选汉字问题
  16. 网络安全攻防实验室通关教程-上传关
  17. LEFT JOIN条件在on后面和在where后面的区别
  18. oracle连接另外一个oracle,Oracle 连接 另一个Oracle数据库 服务器连接
  19. 网络舆情相关书籍推荐
  20. JavaScript中的函数中arguments、参数、默认值和表达式以及箭头函数

热门文章

  1. Activiti获取历史任务信息
  2. 一篇文章带你读懂真正的大数据公司
  3. opencv 九 提取车辆照片中的车牌区域(基于纹理特征)
  4. KBEngine简单RPG-Demo源码解析
  5. 青龙常见问题整理,其他可用仓库以及通知设置
  6. 如何使用Firefox的WebVR
  7. 白盒测试、黑盒测试、灰盒测试
  8. 1/2分频器的设计和仿真
  9. jsdoc api文档_创建更好的JSDoc文档
  10. MultiDex从基础原理到实践优化