RETURNING语句

来源:互联网 发布:明星代言页游 知乎 编辑:程序博客网 时间:2024/06/06 08:31
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 ONSQL> DECLARE V_NAME VARCHAR2(30); BEGIN INSERT 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: YANGTKUPDATE: YTKDELETE: YTKPL/SQL 过程已成功完成。

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

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


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

SQL> SET SERVEROUT ONSQL> DECLARE V_NAME VARCHAR2(30); BEGIN INSERT 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: YANGTKUPDATE: YTKDELETE: 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) T1 ON (T.ID = T1.ID) WHEN MATCHED THEN UPDATE SET NAME = T1.NAME WHEN 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 命令未正确结束

1 0
原创粉丝点击