복붙노트

[SQL] INSERTED SQL 서버 OUTPUT에 오라클 상당 있습니다. *?

SQL

INSERTED SQL 서버 OUTPUT에 오라클 상당 있습니다. *?

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을 많이 사용하지 않고 이렇게 바람직하게는 하나 개의 쿼리 할 수있는 더 좋은 방법이 있나요?

해결법

  1. ==============================

    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. ==============================

    2.복귀 절은 BULK COLLECT INTO의 synthax을 지원합니다. (10g)을 고려 :

    복귀 절은 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 내 버전 (10.2.0.3.0)와 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?)와 COLLECT INTO 다중 행 INSERT들에 대해 지원되는 BULK 있나요?

  3. from https://stackoverflow.com/questions/1074843/is-there-an-oracle-equivalent-to-sql-servers-output-inserted by cc-by-sa and MIT license