簡體   English   中英

使用JDBC獲取Oracle 11g的最后一個插入ID

[英]Get last insert id with Oracle 11g using JDBC

我剛開始使用Oracle,所以我將在之前回答過這個問題 我似乎無法讓它工作。 這是我正在使用的聲明:

declare
  lastId number;
begin
INSERT INTO "DB_OWNER"."FOO" 
  (ID, DEPARTMENT, BUSINESS)
  VALUES (FOO_ID_SEQ.NEXTVAL, 'Database Management', 'Oracle')
  RETURNING ID INTO lastId;
end;

當我調用executeQuery我所做的PreparedStatement時,它會將所有內容都插入到數據庫中。 但是,我似乎無法弄清楚如何檢索ID。 返回的ResultSet對象對我不起作用。 調用

if(resultSet.next()) ...

產生令人討厭的SQLException,其內容如下:

無法對PLSQL語句執行提取:下一步

我怎么得到lastId 顯然我做錯了。

我嘗試使用Oracle驅動程序v11.2.0.3.0(因為10.x和11.1.x中存在一些錯誤,請參閱其他博客 )。 以下代碼工作正常:

final String sql = "insert into TABLE(SOME_COL, OTHER_COL) values (?, ?)";
PreparedStatement ps = con.prepareStatement(sql, new String[] {"ID"});
ps.setLong(1, 264);
ps.setLong(2, 1);
int executeUpdate = ps.executeUpdate();
ResultSet rs = ps.getGeneratedKeys();
if (rs.next() ) {
    // The generated id
    long id = rs.getLong(1);
    System.out.println("executeUpdate: " + executeUpdate + ", id: " + id);
}

使它成為一個函數,將它返回給你(而不是一個過程)。 或者,使用OUT參數的過程。

不確定這是否有效,因為我已經清除了所有Oracle的計算機,但......

將您的聲明更改為:

declare
  lastId OUT number;

通過在連接上使用prepareCall()將語句從PreparedStatement切換到CallableStatement。 然后在調用之前注冊輸出參數,並在更新后讀取它:

cstmt.registerOutParameter(1, java.sql.Types.NUMERIC);
cstmt.executeUpdate();
int x = cstmt.getInt(1);

准備語句時,將第二個參數設置為RETURN_GENERATED_KEYS 然后,您應該能夠從語句對象中ResultSet

你是在存儲過程中這樣做的嗎? 根據此Oracle文檔 ,它不適用於服務器端驅動程序。

The Oracle server-side internal driver does not support 
the retrieval of auto-generated keys feature.

您可以使用Statement.getGeneratedKeys()來執行此操作。 您只需確保使用其中一個方法重載告訴JDBC您想要返回哪些列,例如此處的Connection.prepareStatement重載:

Connection conn = ...
PreparedStatement pS = conn.prepareStatement(sql, new String[]{"id"});
pS.executeUpdate();
ResultSet rS = pS.getGeneratedKeys();
if (rS.next()) {
  long id = rS.getLong("id");
  ...
}

你不需要用這個來做RETURNING x INTO東西,只需使用你想要的基本SQL語句。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM