ORACLE JDBC的getGeneratedKeys

ORACLE JDBC的getGeneratedKeys
對於JDBC 3.0, 使用statement.getGeneratedKeys()可以返回剛剛插入的記錄的自動增長的ID值。對於ORACLE,一般是定義一個序列,然後利用序列的nextval來自動給列分配ID值。但是很多人發現,在利用ORACLE JDBC驅動編寫的時候,往往會失敗。顯示“java.sql.SQLException: Unsupported feature”。

其實,對於ORACLE JDBC,只有在10.2.0.1.0版本後的JDBC才支持getGeneratedKeys特性。而且如果使用下列代碼:

String sql = "INSERT INTO FOO (NAME) VALUES ('BAR')";
Statement stmt = connection.createStatement();
stmt.executeUpdate(sql, Statement.RETURN_GENERATED_KEYS);
ResultSet rs = stmt.getGeneratedKeys();
oracle.sql.ROWID rid = (oracle.sql.ROWID) rs.getObject(1); //getLong and getInt fail

// The following fail
// long l = rid.longValue();
// int i = rid.intValue();

String s = rid.stringValue(); // s equals "AAAXcTAAEAAADXYAAB"

返回的將是ROWID值。可以使用下列代碼:

String sql = "INSERT INTO ORDERS (ORDER_ID, CUSTOMER_ID) VALUES (ORDER_ID_SEQ.NEXTVAL, ?)";
String generatedColumns[] = {"ORDER_ID"};
PreparedStatement pstmt = conn.prepareStatement(sql, generatedColumns);
pstmt.setLong(1, customerId);
pstmt.executeUpdate();
ResultSet rs = pstmt.getGeneratedKeys();
rs.next();
// The generated order id
long orderId = rs.getLong(1);

能得到正確的ID值。注意,其中generatedColumns[]表示從哪個列來獲取新的ID值。我們也可以使用:

int a[]={1};

PreparedStatement pstmt = conn.prepareStatement(sql, a);

......

來表示第1列是KEY列,我們要獲取第1列的新插入的值。

目前(20071219)ORACLE JDBC最新的是11g1,推薦使用。http://www.oracle.com/technology/software/tech/java/sqlj_jdbc/htdocs/jdbc_11...

另外,Jdeveloper 10.1.3.3裏面攜帶的JDBC驅動也不支持getGeneratedKeys。需要進行更新。

當然,也可以使用第三方的JDBC驅動,如i-net software的Oranxo驅動,支持getGeneratedKeys,而且驅動程序的體積更小。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章