【问题标题】:Oracle JDBC Driver ResultSet PreparedStatement Throws ORA-009900 invalid SQL statement ExceptionOracle JDBC Driver ResultSet PreparedStatement Throws ORA-009900 invalid SQL statement Exception
【发布时间】:2014-05-15 11:04:00
【问题描述】:

我正在使用 Oracle JDBC 驱动程序 ojdbc6.jar。执行PreparedStatement 时,将返回ResultSet。但是,当尝试获取已保存内容的详细信息时,我无法获取此信息并引发异常。

下面是代码:

public Processor {

    private Connection connection;

    public Processor() throws Exception {
        connection = DriverManager.getConnection(url, username, password);
    }

    public int saveData(String name) throws Exception {
       PreparedStatement preparedStatement = connection.prepareStatement(name);
       preparedStatement.setString(1, name);
       ResultSet resultSet = preparedStatement.executeQuery();
       resultSet.next();
       String row = resultSet.getString("NAME");
       return resultSet.getRow();
    }

    public static void main(String[] args) throws Exception {
         Processor processor = new Processor();
         int row = processor.saveData(new String("INSERT INTO NAMES (name) VALUES (nameTable)"));
    }
}

url、用户名和密码已设置,但未显示在代码中。我可以连接到 Oracle 数据库并保存数据。但是,调用resultSet.getString("NAME") 时会出现问题。显示以下异常:

ORA-009900: invalid SQL statement
java.sql.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:447)

执行以下代码时:

ResultSet resultSet = connection.createStatement().executeQuery("SELECT NAME FROM NAMES"));
resultSet.next();
String name = resultSet.getString("NAME");

这行得通。我在SQL中也执行了describeNAMES,name属性显示为NAME

问题与返回 ResultSet 数据的 PreparedStatement 对象有关。

有什么想法吗?

编辑:

ORA-00900: invalid SQL statement
java.sql.SQLSyntaxErrorException
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:447)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:389)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:382)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:675)
at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:513)
at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:227)
at oracle.jdbc.driver.T4C8Odscrarr.doODNY(T48COdscrarr.java:98)
at oracle.jdbc.driver.T4CPreparedStatement.doDescribe(T4CPreparedStatement.java:818)
at oracle.jdbc.driver.OracleStatement.getColumnIndex(OracleResultSetImpl.java:3711)
at oracle.jdbc.driver.OracleResultSetImpl.findColumn(OracleResultSetImpl.java:2799)
at oracle.jdbc.driver.OracleResultSet.getString(OracleResultSet.java:498)
at com.example.ProcessorTest.testExecuteInsert(ProcessorTest.java:14)

【问题讨论】:

  • 请包含完整的堆栈跟踪。我很难相信resultSet.getString 会抛出这个错误;我希望它在执行时更早完成
  • 请参阅上面的编辑。

标签: java oracle jdbc


【解决方案1】:

你的saveData方法是原因,因为INSERT不会产生ResultSet,所以executeQuery会产生错误,因为不会有ResultSet

另外你应该只使用connection.prepareCall(String) 来执行存储过程,而不是其他类型的语句。对于准备好的语句,您应该使用connection.prepareStatement(String)

将您的代码更改为:

public int saveData(String name) throws Exception {
   PreparedStatement preparedStatement = connection.prepareStatement(name);
   preparedStatement.setString(1, name);
   return preparedStatement.executeUpdate();
}

顺便说一句:我希望你知道这个方法使用参数name作为查询和查询的参数(这真的没有多大意义)。

最后,您在 main 中所做的 new String(...) 完全没有必要。

【讨论】:

  • 对不起,其实是connection.prepareStatement(name),但是prepareStatement.executeQuery()。
  • 我无法将代码复制到浏览器中,所以我不得不编写代码。我想接收通过 get() 方法插入的数据。我已经显示了上面的堆栈跟踪。
  • 我需要获取唯一标识符的ID作为结果的返回。这就是为什么我需要获取结果集的详细信息。
  • 我建议您发布您的实际代码,因为我觉得缺少一些东西。然而,使用 Oracle 获取生成的 ID 并没有这么简单。你可能想看看stackoverflow.com/questions/1004128/…
【解决方案2】:

首先是这行代码

int row = processor.saveData(new String("INSERT INTO NAMES (name) VALUES (nameTable)"));

由于您已指定方法 saveData() 将参数作为 String ,因此此处不需要任何 new String(...) 而且您正在使用 PreparedStatement ,因此您可以使用类似这样的参数化查询

int row = processor.saveData("INSERT INTO NAMES (name) VALUES (?)");

那么你就可以在saveData()使用这个语句了

preparedStatement.setString(1, "name");

最后你是更新表而不是查询它所以改变这个

preparedStatement.executeQuery();

return preparedStatement.executeUpdate();

还有一件事你应该非常具体地说明你的方法名称。您应该始终根据要执行的操作来命名方法。就像saveData() 一样,这里只能用于保存数据,而不是像您尝试使用ResultSet 那样查询数据。如果要检索数据,请使用其他方法。

【讨论】:

    猜你喜欢
    • 2010-11-05
    • 2014-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-20
    相关资源
    最近更新 更多