2011-10-11 91 views
1

我的應用程序需要知道哪個行接收數據庫中的哪個密鑰。Oracle 11g JDBC預取密鑰

我正在使用JDBC讀取批量更新提交的隔離級別。因此使用getGeneratedKeys檢索密鑰是不可能的。我的計劃是以安全的交易方式從數據庫中獲取一系列ID,例如兩個並行事務不能獲得相同的密鑰。

我可以使用未來行數作爲參數來編寫一些SQL查詢以獲取Oracle 11g中未來密鑰的列表嗎?

我在這裏有什麼選擇?

回答

3

您可以使用序列用於此目的:

create sequence s; 

檢索ID

select s.nextval from dual; 

或檢索ID的範圍:

select s.nextval from dual connect by level <= 10; 
+0

謝謝,您能否詳細說明此方法的交易安全性?對於所有表格的所有自動遞增鍵,雙重魔法池塘? –

+0

如何知道哪張桌子需要鑰匙? –

+0

您可以創建儘可能多的序列。每張表有一個序列並不罕見。從dual中選擇table1_seq.nextval;從dual中選擇table2_seq;等等。 –

2

只想補充:

有n o序列和表之間的明確關係。一個序列只是一個產生數字序列的機制。你可以假設一個序列永遠不會產生重複的值,這就是它。不要假定順序,並且肯定不指望沒有間隙的順序。在Oracle中按照這種方式完成序列設計。通過遵循這些規則,並且不對序列的行爲做出其他假設,我們可以獲得具有序列的極高可擴展性。請注意,只要您嘗試執行訂單或無間隙序列,您的表現就會受到嚴重影響。

總結: 1.)序列很簡單,而且速度非常快。 2.)除了「沒有dups」,不要以爲你可以預測一個序列的行爲。 3.)序列是獨立的對象,與表格無關,可用於生成將在同一個表格或許多不同表格中使用的序列值。

希望有所幫助。