2008-10-01 62 views
6

對於SQLServer,似乎普遍認爲將SELECT SCOPE_IDENTITY()添加到插入的末尾是返回新插入記錄的PK的最佳方法,假設您使用自動增量字段派克。最佳實踐:.NET:如何針對Oracle數據庫返回PK?

但是,我似乎無法找到Oracle的等價物。

最佳實踐似乎是使用一個序列來生成PK,但即使如此也有不同的選擇。您是否將其留給開發人員以插入sequence.nexval或使用觸發器?

在任何一種情況下,獲取新ID似乎都是一個常見問題。

建議和解決方案我已經跨越運行包括:

  • 創建一個存儲過程返回的PK
  • 運行從seq.nextval一個選擇ID,然後傳遞一個到插入
  • 選擇MAX(ID)插入後(注:不要做)
  • 回來的條款添加到insert

我應該ŧ他的「最佳實踐」解決方案適用於這種情況嗎?

回答

9

您可以使用RETURNING子句在Oracle存儲過程中執行此操作。

例如:

TABLEA具有NAME和EMP_ID。當插入記錄時,EMP_ID在內部被填充。

INSERT INTO TABLEA(NAME)VALUES('BOB')RETURNING EMP_ID INTO o_EMP_ID;

這是假設該行在存儲過程中的輸出參數爲o_EMP_ID。

希望幫助......如果沒有,這裏有一個更詳細的例子:

http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14261/returninginto_clause.htm

4

RETURNING子句僅用於這種用法,所以我將其稱爲使用它的最佳實踐。

另一種方法是在插入後選擇seq.CURRVAL。這返回從這個會話序列中獲得的最後一個值。

+0

但是,如果併發呼叫增加了序列,請注意,對嗎? – Liam 2008-10-01 16:51:47

+0

不,CURRVAL是從THIS會話序列中獲得的最後一個值。 – 2008-10-01 16:53:55

2

存儲過程和返回的條款有一個單獨的數據庫的不同利益傳召任何其他的解決辦法是遜色。無論你是通過存儲過程來實現還是使用返回子句,它本身就是一整套蠕蟲。