是否有Oracle等效于SQL Server的OUTPUT INSERTED.*?

Jas*_*ker 16 sql sql-server oracle oracle10g

在SQL Server中,您可以执行以下操作:

INSERT INTO some_table (...) OUTPUT INSERTED.*
VALUES (...)
Run Code Online (Sandbox Code Playgroud)

这样您就可以插入任意的列/值集并获取这些结果.有没有办法在Oracle中这样做?

我能想到的最好的是:

INSERT INTO some_table (...)
VALUES (...)
RETURNING ROWID INTO :out_rowid
Run Code Online (Sandbox Code Playgroud)

...使用:out_rowid作为绑定变量.然后使用这样的第二个查询:

SELECT *
FROM some_table
WHERE ROWID = :rowid
Run Code Online (Sandbox Code Playgroud)

...但这与它返回列中的所有内容并不完全相同,而不仅仅是我插入的列.

有没有更好的方法来做到这一点,而不使用大量的PL/SQL,最好只有一个查询?

Mic*_*vda 5

也许我不明白这个问题,但不会这样做吗?(你必须知道你想要的东西)

INSERT INTO some_table (...)
VALUES (...)
RETURNING some_column_a, some_column_b, some_column_c,  ...  INTO :out_a, :out_b, :out_c, ...
Run Code Online (Sandbox Code Playgroud)

@Vincent返回批量收集进入多行插入只能与forall一起使用(换句话说,如果你从集合中插入,你可以将"结果"检索到另一个)


Vin*_*rat 3

RETURNING子句支持BULK COLLECT INTO语法。考虑(10克):

SQL> CREATE TABLE t (ID NUMBER);

Table created
SQL> INSERT INTO t (SELECT ROWNUM FROM dual CONNECT BY LEVEL <= 5);

5 rows inserted
SQL> DECLARE
  2     TYPE tab_rowid IS TABLE OF ROWID;
  3     l_r tab_rowid;
  4  BEGIN
  5     UPDATE t SET ID = ID * 2
  6      RETURNING ROWID BULK COLLECT INTO l_r;
  7     FOR i IN 1 .. l_r.count LOOP
  8        dbms_output.put_line(l_r(i));
  9     END LOOP;
 10  END;
 11  /

AADcriAALAAAAdgAAA
AADcriAALAAAAdgAAB
AADcriAALAAAAdgAAC
AADcriAALAAAAdgAAD
AADcriAALAAAAdgAAE
Run Code Online (Sandbox Code Playgroud)

它适用于多行UPDATEDELETE我的版本(10.2.0.3.0),但不适用于INSERT

SQL> DECLARE
  2     TYPE tab_rowid IS TABLE OF ROWID;
  3     l_r tab_rowid;
  4  BEGIN
  5     INSERT INTO t (SELECT ROWNUM FROM dual CONNECT BY LEVEL <= 5)
  6      RETURNING ROWID BULK COLLECT INTO l_r;
  7     FOR i IN 1 .. l_r.count LOOP
  8        dbms_output.put_line(l_r(i));
  9     END LOOP;
 10  END;
 11  /

ORA-06550: line 7, column 5:
PL/SQL: ORA-00933: SQL command not properly ended
Run Code Online (Sandbox Code Playgroud)

也许您有更新的版本(11g?)并且BULK COLLECT INTO支持多行INSERT