如何得到JDBC Insert 语句执行后插入Oracle 数据库记录的主键
2个回答
2017-11-06
展开全部
Oracle 的主键 是 sequence 生成的吗?若是,以下是解决方法:
1,用Oracle 的returning 语句。
PreparedStatement sta = conn.prepareStatement("INSERT INTO LOGGING VALUES (TESTSEQ.NEXTVAL,SYSDATE)returning id into ? ");
sta.execute();
ResultSet rset = sta.getResultSet();
while(rset.next())
{
int id = rset.getInt(1);
}
如果是既有传入值,又有返回值的话,应该:
PreparedStatement sta = conn.prepareStatement("BEGIN INSERT INTO LOGGING VALUES
(TESTSEQ.NEXTVAL,? )returning id into ?; END; ");
sta = conn.prepareCall(sqlText);
sta .setString(1, srqID);
sta .registerOutParameter(2, Types.NUMERIC);
sta .execute();
return sta .getLong(2);
或者用oracle的 OraclePreparedStatement
String sql = "insert into test values(1,?) returning id into ?";
OraclePreparedStatement pstt = (OraclePreparedStatement) conn.prepareStatement(sql);
pstt.setString(1, "xxx");
pstt.registerReturnParameter(2, OracleTypes.INTEGER);
pstt.executeUpdate();
ResultSet rset = pstt.getReturnResultSet(); // rest is not null
while (rset.next()) {
int id = rset.getInt(1);
System.out.println("Insert returnning: " + id);
}
1,用Oracle 的returning 语句。
PreparedStatement sta = conn.prepareStatement("INSERT INTO LOGGING VALUES (TESTSEQ.NEXTVAL,SYSDATE)returning id into ? ");
sta.execute();
ResultSet rset = sta.getResultSet();
while(rset.next())
{
int id = rset.getInt(1);
}
如果是既有传入值,又有返回值的话,应该:
PreparedStatement sta = conn.prepareStatement("BEGIN INSERT INTO LOGGING VALUES
(TESTSEQ.NEXTVAL,? )returning id into ?; END; ");
sta = conn.prepareCall(sqlText);
sta .setString(1, srqID);
sta .registerOutParameter(2, Types.NUMERIC);
sta .execute();
return sta .getLong(2);
或者用oracle的 OraclePreparedStatement
String sql = "insert into test values(1,?) returning id into ?";
OraclePreparedStatement pstt = (OraclePreparedStatement) conn.prepareStatement(sql);
pstt.setString(1, "xxx");
pstt.registerReturnParameter(2, OracleTypes.INTEGER);
pstt.executeUpdate();
ResultSet rset = pstt.getReturnResultSet(); // rest is not null
while (rset.next()) {
int id = rset.getInt(1);
System.out.println("Insert returnning: " + id);
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
以下代码需要JDBC 3.0 支持。
受限于厂商提供的JDBC驱动程序
代码是来源于一个 叫Roman 的开源持久层组件,仅供你参考,不保证能够直接嵌入你的工程代码,里面的代码被我删除了部分,仅保留了功能实现的基本部分:
//声明需要返回的 主键列名(String 数组)
// instance 是一个po对象 有一个 getPrimaryKeyName的方法,返回这个PO的主键名
String[] generalColumns = new String[]{instance.getPrimaryKeyName()};
//执行更新
ResultSet rsKeys = null;
PreparedStatement s = null;
try
{
s = _cnn.prepareStatement(_insertString,generalColumns);//执行SQL,_cnn 是一个数据库连接
for(int i = 0 ; i < values.size(); i ++)
s.setObject(i+1, values.get(i)); // 写入除了主键外的其它参数
int ref = s.executeUpdate(); //执行
if (ref != 1 ) // 检查是否成功执行了 Insert
throw new SqlRuntimeException(" database inserted nothing ");
rsKeys = s.getGeneratedKeys(); // 接收返回值
ResultSetMetaData rsmd = rsKeys.getMetaData(); // 获取返回的列名
int rscolumnsCount = rsmd.getColumnCount();
//接受数据库端生成的返回值
if (rsKeys.next())
{
Object val = null;
String nam = null;
for(int i = 0; i < rscolumnsCount; i ++ )
{
val = rsKeys.getObject(i + 1); // JDBC 中的参数是从 1 开始的
nam = rsmd.getColumnLabel(i + 1);
instance.setValue(nam, val);
}
}
return instance;
}
catch (SQLException e)
{
throw e;
}
finally
{
if (null != rsKeys)
rsKeys.close();
if (null != s)
s.close();
}
受限于厂商提供的JDBC驱动程序
代码是来源于一个 叫Roman 的开源持久层组件,仅供你参考,不保证能够直接嵌入你的工程代码,里面的代码被我删除了部分,仅保留了功能实现的基本部分:
//声明需要返回的 主键列名(String 数组)
// instance 是一个po对象 有一个 getPrimaryKeyName的方法,返回这个PO的主键名
String[] generalColumns = new String[]{instance.getPrimaryKeyName()};
//执行更新
ResultSet rsKeys = null;
PreparedStatement s = null;
try
{
s = _cnn.prepareStatement(_insertString,generalColumns);//执行SQL,_cnn 是一个数据库连接
for(int i = 0 ; i < values.size(); i ++)
s.setObject(i+1, values.get(i)); // 写入除了主键外的其它参数
int ref = s.executeUpdate(); //执行
if (ref != 1 ) // 检查是否成功执行了 Insert
throw new SqlRuntimeException(" database inserted nothing ");
rsKeys = s.getGeneratedKeys(); // 接收返回值
ResultSetMetaData rsmd = rsKeys.getMetaData(); // 获取返回的列名
int rscolumnsCount = rsmd.getColumnCount();
//接受数据库端生成的返回值
if (rsKeys.next())
{
Object val = null;
String nam = null;
for(int i = 0; i < rscolumnsCount; i ++ )
{
val = rsKeys.getObject(i + 1); // JDBC 中的参数是从 1 开始的
nam = rsmd.getColumnLabel(i + 1);
instance.setValue(nam, val);
}
}
return instance;
}
catch (SQLException e)
{
throw e;
}
finally
{
if (null != rsKeys)
rsKeys.close();
if (null != s)
s.close();
}
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询