2009-07-02 81 views
13

在SQL Server中,你可以做這樣的事情:是否存在與SQL Server的OUTPUT INSERTED *等價的Oracle?

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

如果它是你感興趣的(而不是行數據的列)... - 您是如何得出的(......)?當然,在那一點上,你知道哪些列在插入中被引用? – 2009-07-03 05:27:10

+0

我剛剛閱讀了關於OUTPUT INSERTED(http://msdn.microsoft.com/en-us/library/ms177564.aspx)。顯然,它允許您選擇返回的行數據是在任何表觸發器運行之前還是之後。 Oracle的RETURNING子句不支持這一點 - 它只會在觸發器有機會更改它之後爲您提供數據。 – 2009-07-03 05:30:04

回答

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 

它與多行UPDATEDELETE我的版本(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 

也許你有一個更最新版本(11克?)和BULK COLLECT INTO支持多行INSERT S'

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如果插入從集合只能結合(換句話說,你可以檢索「結果」到另一個)

相關問題