Существует ли эквивалент Oracle для SQL Server OUTPUT INSERTED. *?

В SQL Server вы можете делать такие вещи:

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

Итак, вы можете вставить произвольные наборы столбцов/значений и вернуть эти результаты. Есть ли способ сделать это в Oracle?

Лучшее, что я могу придумать, это следующее:

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

... используя: out_rowid как переменную связывания. И затем, используя второй запрос, например:

SELECT *
FROM some_table
WHERE ROWID = :rowid

... но это не совсем то же самое, что возвращает все внутри столбца, а не только столбцы, которые я вставил.

Есть ли лучший способ сделать это, не используя много PL/SQL и желательно только с одним запросом?

Ответы

Ответ 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 (другими словами, если вы вставляете из коллекции, вы можете получить "результаты" в другую)

Ответ 2

Предложение RETURNING поддерживает BULK COLLECT INTO 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

Он работает с несколькими строками UPDATE и DELETE с моей версией (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

Возможно, у вас более поздняя версия (11g?), а BULK COLLECT INTO поддерживается для нескольких строк INSERT?