繁体   English   中英

Oracle JDBC驱动程序结果集PreparedStatement抛出ORA-009900无效的SQL语句异常

[英]Oracle JDBC Driver ResultSet PreparedStatement Throws ORA-009900 invalid SQL statement Exception

我正在使用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中执行了describe NAMES的描述,并且name属性显示为NAME

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

有任何想法吗?

编辑:

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)

原因是您的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用于查询,也将参数name用作查询的参数(这实际上没有多大意义)。

最后,您根本不需要使用new String(...)

首先这行代码

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

如您所指定的,方法saveData()将参数作为String使用,因此这里不需要任何新的String(...),而且您正在使用PreparedStatement,因此可以使用类似此参数化的查询

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

然后,您可以在saveData()使用此语句

preparedStatement.setString(1, "name");

最后,您要更新表而不是对其进行查询,因此请更改此表

preparedStatement.executeQuery();

return preparedStatement.executeUpdate();

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM