有甲骨文等同于SQL Server的输出插入的。*?(Is there an Oracle equi

2019-06-24 18:41发布

在SQL Server中,你可以做这样的事情:

INSERT INTO some_table (...) OUTPUT INSERTED.*
VALUES (...)

所以,你可以插入列/值的任意集和获得这些结果返回。 有没有办法在甲骨文做到这一点?

我能想出的最好的是这样的:

INSERT INTO some_table (...)
VALUES (...)
RETURNING ROWID INTO :out_rowid

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

SELECT *
FROM some_table
WHERE ROWID = :rowid

...但是这是不太一样的,因为它返回列内的一切,不只是我插入的列。

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

Answer 1:

也许我不明白的问题,但不会这样做呢? (你必须知道你想要什么回)

INSERT INTO some_table (...)
VALUES (...)
RETURNING some_column_a, some_column_b, some_column_c,  ...  INTO :out_a, :out_b, :out_c, ...

@Vincent返回批量收集成多行插入只能连同FORALL(如果插入换句话说,从收集,你可以检索“结果”到另一个)



Answer 2:

RETURNING子句支持BULK收进 synthax。 考虑(10G):

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

它适用于多行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

也许你有一个较新版本(11克?)和BULK COLLECT INTO是支持多行INSERT S'



文章来源: Is there an Oracle equivalent to SQL Server's OUTPUT INSERTED.*?