如何得到JDBC Insert 语句执行后插入Oracle 数据库记录的主键
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何得到JDBC Insert 语句执行后插入Oracle 数据库记录的主键相关的知识,希望对你有一定的参考价值。
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);
参考技术A insert 之前或者同时插入主键啊,不能执行之后插入主键
使用 Postgresql JDBC 时,将导致插入 0 行的 INSERT 语句
【中文标题】使用 Postgresql JDBC 时,将导致插入 0 行的 INSERT 语句【英文标题】:When Using Postgresql JDBC, INSERT statement that will result in 0 rows being inserted 【发布时间】:2017-08-24 01:34:52 【问题描述】:使用 Postgresql JDBC 时,使用 executeUpdate 语句插入行但结果为零。我发现数据被插入了。 API 文档告诉 executeUpdate 方法返回受影响的行数。
mSqlInsertEventHist = "INSERT INTO " + DatabaseTables.EVENT_HIST +
" ( event_id, mntr_id, mntr_zone, mntr_name, mntr_class_name, mntr_class_sub_type, host_name, ip_addr, " +
" metric_id, metric_name, perf_name, object_name, event_type, event_master_id, " +
" event_name, event_level, event_msg, threshold, event_recv_day, event_reco_dt, event_recv_dt," +
" event_saved_dt, blackout_yn, msg_filter_yn ) " +
" VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, " + " now() " + ", ?, ? ) ";
mPstmtInstEvtHist.setLong(1, eventid);
mPstmtInstEvtHist.setInt(2, mntrid);
mPstmtInstEvtHist.setString(3, mntrZone);
mPstmtInstEvtHist.setString(4, mntrname);
mPstmtInstEvtHist.setString(5, mntrClsName);
mPstmtInstEvtHist.setString(6, mntrClsSubType);
mPstmtInstEvtHist.setString(7, hostname);
mPstmtInstEvtHist.setString(8, ipAddr);
mPstmtInstEvtHist.setInt(9, Integer.parseInt((String)dataobj.get(MQConstants.METRIC_ID)));
mPstmtInstEvtHist.setString(10, metricname);
mPstmtInstEvtHist.setString(11, perfname);
mPstmtInstEvtHist.setString(12, objectname);
mPstmtInstEvtHist.setString(13, dataType);
mPstmtInstEvtHist.setInt(14,
Integer.parseInt((String)dataobj.get(MQConstants.EVENT_MASTER_ID)));
mPstmtInstEvtHist.setString(15, eventname);
mPstmtInstEvtHist.setString(16, eventlvl);
mPstmtInstEvtHist.setString(17, evtMsg);
mPstmtInstEvtHist.setObject(18, jsonObj);
mPstmtInstEvtHist.setInt(19,
Integer.parseInt((String)dataobj.get(MQConstants.EVENT_RECV_DAY)));
mPstmtInstEvtHist.setTimestamp(20, colTs);
mPstmtInstEvtHist.setTimestamp(21, rcvTs);
mPstmtInstEvtHist.setString(22,
(String)dataobj.get(MQConstants.BLACKOUT_YN));
mPstmtInstEvtHist.setString(23,
(String)dataobj.get(MQConstants.MSG_FILTER_YN));
rtn = mPstmtInstEvtHist.executeUpdate();
if ( rtn == 1 ) //NOPMD
Debug.getLogger().trace("Inserted Event into => , , "
,DatabaseTables.EVENT_HIST , mntrid, eventname, eventlvl);
else
Debug.getLogger().warn("Failed to insert Event into => ",
DatabaseTables.EVENT_HIST, Debug.getString(jobj));
【问题讨论】:
我不知道你在问什么。请向我们展示一些代码和数据来解释正在发生的事情。 行被插入但总是记录 Debug.getLogger().warn("Failed to insert Event into => ", DatabaseTables.EVENT_HIST, Debug.getString(jobj));跨度> 实际的INSERT
声明在哪里?
添加了实际的 INSERT 语句
【参考方案1】:
您的数据库中可能有一个基于触发器的分区,如此处所述in PostgreSQL manual。
这完全发生在数据库端,除了它总是返回“0行插入”。
检查您的数据库架构以在 DatabaseTables.EVENT_HIST 表中分区触发器。
【讨论】:
感谢您的回答,EVENT_HIST 表中有分区触发器以上是关于如何得到JDBC Insert 语句执行后插入Oracle 数据库记录的主键的主要内容,如果未能解决你的问题,请参考以下文章
通过 JDBC 执行 INSERT IGNORE 时获取重复计数
JDBC Insert语句插入Oracle数据库返回数据主键