jdbc oracle驱动程序错误17024没有数据读取

时间:2016-02-07 02:55:10

标签: java oracle jdbc

我尝试使用如下所示的SQL语句对Oracle数据库运行插入:

INSERT INTO browsers (browsers.id,browsers.browser,browsers.engine,browsers.platform,browsers.version,browsers.grade) VALUES (BROWSERS_SEQ.NEXTVAL,?,?,?,?,?)

但是,jdbc驱动程序不断返回错误消息:

SQL问题:没有数据读取
SQL状态:02000
供应商错误:17024
java.sql.SQLException:没有数据读取

声明的执行按预期进行。但是,由于这是一个插入,我试图获取新记录的ID。

请参阅我的Java代码,我收到错误消息:

   try{
      connection = getConnection();

      if(connectionException == false)
      {
        connection.setAutoCommit(false);
        statement = query.getPreparedStatement(connection);         
        statement.executeUpdate(); //<<< This executes fine.
        if(query.getQueryType() == Query.Type.INSERT)
        {
            //Get the id assigned to the new record
            //If we are dealing with a Link Table then we don't need to retrieve any generated ids.
            if(query.isLinkTable() == false)
            {
              resultSet = statement.getGeneratedKeys();
              if(!resultSet.wasNull())//<<< This is where I'm getting the error.                  
              {
                if(resultSet.next())
                {
                  query.setNewRecordID(resultSet.getInt(1));
                  //System.out.println(query.getNewRecordID());                       
                }
                else
                {
                  if(Editor.isLoggingEnabled())           
                  {                      
                    throw new SQLException("Database.executeInsertUpdate - on INSERT - Unable to retrieve id value");
                  }
                }
             }
             resultSet.close();
             resultSet = null;                 
           }
        }
        connection.commit();
        statement.close();
        statement = null;               
      }

完成堆栈跟踪:

17:48:56,219 ERROR Database:882 - Database.executeInsertUpdate - query: INSERT I
NTO browsers (browsers.id,browsers.browser,browsers.engine,browsers.platform,bro
wsers.version,browsers.grade) VALUES (BROWSERS_SEQ.NEXTVAL,?,?,?,?,?)
SQL Problem: No data read
SQL State: 02000
Vendor Error: 17024
java.sql.SQLException: No data read
        at oracle.jdbc.driver.OracleStatement.wasNullValue(OracleStatement.java:
4099)
        at oracle.jdbc.driver.InsensitiveScrollableResultSet.wasNull(Insensitive
ScrollableResultSet.java:201)
        at org.apache.tomcat.dbcp.dbcp.DelegatingResultSet.wasNull(DelegatingRes
ultSet.java:210)
        at org.apache.tomcat.dbcp.dbcp.DelegatingResultSet.wasNull(DelegatingRes
ultSet.java:210)
        at com.tacticalenterprisesltd.Database.executeInsertUpdate(Database.java
:841)
        at com.tacticalenterprisesltd.Editor.insert(Editor.java:1922)
        at com.tacticalenterprisesltd.Editor.Process(Editor.java:800)
        at org.apache.jsp.jsp.browsers_jsp._jspService(browsers_jsp.java:178)
        at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)

2 个答案:

答案 0 :(得分:1)

从代码片段中不清楚PreparedStatement是如何创建的。我认为它隐藏在getPreparedStatement(con)方法中。

您可能想要检查的一件事是,您是否在preparedstatement创建中指定它应该返回生成的密钥。例如:con.prepareStatement(query,Statement.RETURN_GENERATED_KEYS);?如果没有,请添加并测试。

答案 1 :(得分:0)

我认为您使用preparedStmt.getResultSet()代替preparedStmt.executeQuery() Insert不会返回任何结果数据。如果不是这种情况,我们需要查看更多代码。