如何得到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数据库返回数据主键

java下连接mysql数据库 ——插入语句——insert

java 中如何使用sql插入语句

sql注入之 update/insert/delete篇

java关于jdbc的insert语句问题?