Oracle是否支持SQL语句中的RETURNING



PostgreSQL支持RETURNING子句,例如在中

UPDATE some_table SET x = 'whatever' WHERE conditions RETURNING x, y, z

MSSQL通过OUTPUT子句支持该语法的变体。

然而,Oracle";返回到";似乎旨在从存储过程的上下文中将值放置在变量中。

有没有一种方法可以在不涉及存储过程的情况下,使SQL与上面的SQL等效,并在Oracle中工作?

注意:我正在寻找一个纯SQL解决方案,如果存在的话,而不是特定于语言的解决方案,或者需要在代码中进行特殊处理。实际的SQL是动态的,进行调用的代码是与数据库无关的,只有SQL是自适应的

Oracle不直接支持在SELECT语句中使用DML返回子句,但您可以通过使用WITH函数来伪造这种行为。尽管下面的代码使用PL/SQL,但该语句仍然是一个纯SQL语句,并且可以在任何可以运行常规SELECT语句的地方运行。

SQL> create table some_table(x varchar2(100), y number);
Table created.
SQL> insert into some_table values('something', 1);
1 row created.
SQL> commit;
Commit complete.
SQL> with function update_and_return return number is
2      v_y number;
3      --Necessary to avoid: ORA-14551: cannot perform a DML operation inside a query
4      pragma autonomous_transaction;
5  begin
6      update some_table set x = 'whatever' returning y into v_y;
7      --Necessary to avoid: ORA-06519: active autonomous transaction detected and rolled back
8      commit;
9      return v_y;
10  end;
11  select update_and_return from dual;
12  /
UPDATE_AND_RETURN
-----------------
1

不幸的是,这种方法有很大的局限性,可能使其在非琐碎的情况下不切实际:

  1. DML必须在语句中提交
  2. WITH函数语法需要12.1及以上版本的客户端和服务器
  3. 返回多列或多行将需要更高级的功能。多行需要函数返回一个集合,语句的SELECT部分必须使用TABLE函数。对于每个不同的结果集,多个列将需要一个新的类型。如果幸运的话,您可以使用其中一种内置类型,比如SYS.ODCIVARCHAR2LIST。否则,您可能需要创建自己的自定义类型

您可以在SQL中完成,而不需要pl/SQL,这取决于您的工具和/或语言。以下是sqlplus中的一个示例:

SQL> create table t0 as select * from dual;
Table created.
SQL> var a varchar2(2)
SQL> update t0 set dummy='v' returning dummy into :a;
1 row updated.
SQL> print a
A
--------------------------------
v

最新更新