在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的情况下执行此操作,最好只使用一个查询?
答案 0 :(得分:5)
也许我不明白这个问题,但不会这样做吗? (你必须知道你想要的东西)
INSERT INTO some_table (...)
VALUES (...)
RETURNING some_column_a, some_column_b, some_column_c, ... INTO :out_a, :out_b, :out_c, ...
@Vincent返回批量收集进入多行插入只能与forall一起使用(换句话说,如果你从集合中插入,你可以将“结果”检索到另一个)
答案 1 :(得分:3)
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
适用于我的版本(10.2.0.3.0)的多行UPDATE
和DELETE
,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
?