如何得到JDBC Insert 语句执行后插入Oracle 数据库记录的主键

 我来答
匿名用户
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);
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
苦于强赶
2017-11-06 · 超过14用户采纳过TA的回答
知道答主
回答量:32
采纳率:71%
帮助的人:15.5万
展开全部
以下代码需要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();
}
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式