2010-12-16 154 views
12

可能重複:
PLSQL JDBC: How to get last row ID?獲取有關插入行最後一個ID在Oracle數據庫

我有問題,從表中獲取ID。我有兩個表AJPES_TR和TR_LOG和TR_LOG表中的PK在AJPES_TR表中設置爲外鍵。

在TR_LOG表中,我只是寫入從哪個文件導入數據,我想將該PK鏈接到主表中。在mySQL中,我用getID.last(); int j = getID.getInt(TR_LOG_ID);做得很好,但是現在在Oracle中這不再起作用。

這些都是我用預處理:

PreparedStatement insertData = 
    con.prepareStatement(
    "INSERT INTO T_AJPES_TR(rn,sSpre,reg,eno,davcna,Ime,Priimek) VALUES (?,?,?,?,?,?,?)" 
); 
PreparedStatement select_file_log = 
    con.prepareStatement("SELECT * FROM T_AJPES_TR_LOG WHERE File_import = ?" 
); 
PreparedStatement getID = con.prepareStatement("SELECT * FROM T_AJPES_TR_LOG"); 
PreparedStatement insertFile = 
    con.prepareStatement(
    "INSERT INTO T_AJPES_TR_LOG(Date_import,File_import) VALUES (?,?)" 
); 

在MySQL的ID被設置爲自動增量。

如何從TR_LOG獲得ID值並將該值寫入AJPES_TR表?

+0

這個問題是不重複的,因爲jdbc的oracle驅動程序工作不同於其他驅動程序 – 2016-04-01 17:38:04

回答

6

在Oracle所使用sequences

下一個值自動增加值是SEQUENCE_NAME.NEXTVAL,最後使用SEQUENCE_NAME.CURRVAL

+0

感謝您的回答。那麼當管理員創建表時,我看到自動增量已經完成了。 所以現在只需要幫助我從TR_LOG表中獲取ID。:) – Igor 2010-12-16 09:39:20

2

你能信號在準備語句調用自動遞增列

實施例:

PreparedStatement ps = con.prepareStatement(sql, pkColumns); 

數據庫行的插入後:

ResultSet keys = ps.getGeneratedKeys(); 

重要:這僅適用於,如果自動增量值已經自動由DB-觸發通過序列

+4

您還依賴於使用的JDBC驅動程序。 Oracle提供的JDBC驅動程序都不支持這一點。 – BalusC 2010-12-23 13:36:08

4

如果我理解你正確,你要插入一個表格T1一個記錄集,得到插入記錄的PK和使用在另一個表T2中作爲FK。在這種情況下,甲骨文returning clause是非常有用的,你可以使用它像這樣(對不起,我不知道熱在Java中使用它,但你應該明白我的意思):

declare 
    fId int; 
begin 
    insert into T1(id) values seq1.nextval returning id into fId 
end; 

插入後您將在fId變量中創建記錄ID。

+0

是的,這正是我想要做的。 :) – Igor 2010-12-16 10:49:22

12

如果觸發器被配置爲自動設置主鍵字段從序列中的下一個值,那麼你可以修改你的INSERT語句如下:

INSERT INTO table (field1, field2, field3) 
    VALUES (?, ?, ?) 
    RETURNING primary_key_field INTO ? 

然後,添加參數值的INSERT ,主鍵末尾的輸出參數,並執行查詢。

查詢執行後,抓取輸出參數的值。它應該包含primary_key_field的值。