Is there an Oracle equivalent to SQL Server's OUTPUT INSERTED.*?

后端 未结 2 1147
暖寄归人
暖寄归人 2020-12-03 21:31

In SQL Server, you can do things like this:

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

So that you can insert arbitrary se

2条回答
  •  野趣味
    野趣味 (楼主)
    2020-12-03 21:31

    The RETURNING clause supports the BULK COLLECT INTO synthax. Consider (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
    

    It works with multi-row UPDATE and DELETE with my version (10.2.0.3.0) but NOT with 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
    

    Maybe you have a more recent version (11g?) and the BULK COLLECT INTO is supported for multi-row INSERTs ?

提交回复
热议问题