jdbc取得插入记录的主键值
来源:互联网 发布:新手开淘宝视频教程 编辑:程序博客网 时间:2024/05/21 22:58
网上有很多关于这方面的文章,但是我按照这种做法却得到的是rowid,按照下面这篇文章解决了问题,转之,希望有用。。。。。。。。。。
对于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列的新插入的值。
------------------------------------------------------------------------------------------------------------------------------------------------
在Oracle Metalink公司(甲骨文的支持网站 - 注号736273.1),我发现这是在JDBC适配器错误(版本10.2.0.0.0到11.1.0.7.0),当你调用超过7位置的JDBC PreparedStatement的参数,然后将抛出此错误。
如果您有访问Oracle Metalink公司那么我们的选择是去那里和下载上述补丁。
另一个解决方案是解决办法 - 使用命名的,而不是位置参数参数:
INSERT INTO rule_definitions(RULE_DEFINITION_SYS,rule_definition_type,
rule_name,rule_text,rule_comment,rule_message,rule_condition,rule_active,
rule_type,current_value,last_modified_by,last_modified_dttm,
rule_category_sys,recheck_unit,recheck_period,trackable)
VALUES(RULE_DEFINITIONS_SEQ.NEXTVAL,:rule_definition_type,
:rule_name,:rule_text,:rule_comment,:rule_message,:rule_condition,:rule_active,
:rule_type,:current_value,:last_modified_by,:last_modified_dttm,
:rule_category_sys,:recheck_unit,:recheck_period,:trackable)
然后使用
preparedStatement.setStringAtName("rule_definition_type", ...)
等等,为这个命名查询绑定变量。
----------------------------------------------------------------------------------------------------------------------------------------------
后来发现有workaround的方法:
可以先得到序列值:
String sqlForSeq = "select cqweblog_sequence.NEXTVAL from dual";
ResultSet rs = stmt.executeQuery(sqlForSeq);
if (rs.next()) {
logSeq = rs.getString("NEXTVAL");
}
然后在用这个序列值insert到DB里。
笨笨:-(
- jdbc取得插入记录的主键值
- JDBC 插入时, 取得插入的主键的返回值
- 使用JdbcTemplate取得插入Oracle记录的主键值
- JDBC ORACLE: 取得SQL总列数; 插入数据后 取得指定自增字段(主键)的值
- 使用JDBC获取插入记录的自增主键值
- JDBC 插入带有主键序列的记录
- JDBC( 八) 获取插入记录的主键。
- python插入记录后取得主键id的方法
- python插入记录后取得主键id的方法
- JDBC:元数据 && 获取插入记录的主键值 && _JDBC_处理 Blob
- jdbc 插入记录后返回主键
- JDBC_获取插入记录的主键值
- python插入记录后取得主键id的方法(cursor.lastrowid和conn.insert_id())
- python插入记录后取得主键id的方法(cursor.lastrowid和conn.insert_id())
- python插入记录后取得主键id的方法(cursor.lastrowid和conn.insert_id())
- JDBC插入Oracle数据库有主键的X表记录时,获取此记录的主键ID。
- 如何得到JDBC Insert 语句执行后插入Oracle 数据库记录的主键
- 如何得到JDBC Insert 语句执行后插入Oracle 数据库记录的主键
- android源码框架
- PACKSSDW
- pku--3126 prime road(注意数据范围BFS)
- Problem56
- Eclipse 快捷键
- jdbc取得插入记录的主键值
- 观察者模式Observable与Observer的运用(单指拖放)(转帖)
- Could not create an environment: OCIEnvCreate returned -1(OCIEnvCreate 失败, 返回代码为-1,但错误消息文本不可用)
- 802.11 Scan and Discovery
- Problem57
- Android 4.4.3 bionic can't compile c code on LFS 6.6 platform
- android国际化之各国区域和语言的标志码
- Graphics View的体系结构
- 软件项目管理随谈(3)——项目经理