茫茫網海中的冷日
         
茫茫網海中的冷日
發生過的事,不可能遺忘,只是想不起來而已!
 恭喜您是本站第 1671842 位訪客!  登入  | 註冊
主選單

Google 自訂搜尋

Goole 廣告

隨機相片
F09_250.jpg

授權條款

使用者登入
使用者名稱:

密碼:


忘了密碼?

現在就註冊!

爪哇咖啡屋 : [轉貼]ORACLE JDBC 的 getGeneratedKeys

發表者 討論內容
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15771
[轉貼]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,而且驅動程序的體積更小。

原文出處:ORACLE JDBC的getGeneratedKeys - 台部落
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15771
[分享]冷日取得 Sequence Identity ID on Java 實做
繼承這一篇冷日的 Oracle Identity 實做之後,再來就是在 Java 上取得 Sequence Identity ID!
冷日這裡稍微分享一下冷日的實做方法:
首先準備一個 Boolean 來決定最後要 Commit 或是 Rollback
			boolean ready2Commit = true;

然後如同前面所說的,先給一個 int array 告訴 PreparedStatement 我們的 Sequence Identity ID 是哪個欄位
			int rimtid[]={1};

再來就是準備 Connection 囉
			try {
				ebsConnection = sqlTalk.getConnectionFromPool();
				//Prepared Statement Transaction with commit/rollback pattern
				ebsConnection.setAutoCommit(false);

中間如何組合 PreparedStatement 冷日就不獻醜了,最重要的是把 PreparedStatement 給 Execute 出去
				updateMCount = sqlPreparedStamtementM.executeUpdate();

如果有順利執行出去的話,我們就要去把 Sequence Identity ID 給拿回來了
				if( updateMCount > 0 ) {
					ResultSet rsM = sqlPreparedStamtementM.getGeneratedKeys();
					rsM.next();
					long orderMId = rsM.getLong(1);

順利取回 Sequence Identity ID,就看各位要怎麼使用囉!
記得,全部都準備好以後,要 Commit 出去唷!
				if( ready2Commit ) {
					//20190726,Prepared Statement Transaction with commit/rollback pattern
					ebsConnection.commit();
				}

搞定!!!
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15771
[分享]提醒 RETURN_GENERATED_KEYS
特別強調一下,在建立 PrepareStatement 的時候,別忘記要宣告『RETURN_GENERATED_KEYS』!
pstmt = conn.prepareStatement(query, Statement.RETURN_GENERATED_KEYS); 

否則就會拿到:
com.microsoft.sqlserver.jdbc.SQLServerException
The statement must be executed before any results can be obtained.

前一個主題 | 下一個主題 | 頁首 | | |



Powered by XOOPS 2.0 © 2001-2008 The XOOPS Project|