Существует ли эквивалент 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
?