首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Oracle驱动程序ResultSet PreparedStatement抛出ORA-009900 invalid SQL语句异常

Oracle驱动程序ResultSet PreparedStatement抛出ORA-009900 invalid SQL语句异常
EN

Stack Overflow用户
提问于 2014-04-03 22:24:43
回答 2查看 3.4K关注 0票数 0

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

代码如下:

代码语言:javascript
复制
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")时会出现问题。将显示以下异常:

代码语言:javascript
复制
ORA-009900: invalid SQL statement
java.sql.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:447)

执行以下代码时:

代码语言:javascript
复制
ResultSet resultSet = connection.createStatement().executeQuery("SELECT NAME FROM NAMES"));
resultSet.next();
String name = resultSet.getString("NAME");

这是可行的。我还在SQL describe名称中执行了NAMES,并且名称属性显示为NAME

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

有什么想法吗?

编辑:

代码语言:javascript
复制
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)
EN

回答 2

Stack Overflow用户

发布于 2014-04-03 22:32:44

您的saveData方法是原因,因为INSERT不会生成ResultSet,所以executeQuery将生成一个错误,因为没有ResultSet

此外,您应该仅将connection.prepareCall(String)用于执行存储过程,而不应将其用于其他类型的语句。对于预准备语句,您应该使用connection.prepareStatement(String)

将您的代码更改为:

代码语言:javascript
复制
public int saveData(String name) throws Exception {
   PreparedStatement preparedStatement = connection.prepareStatement(name);
   preparedStatement.setString(1, name);
   return preparedStatement.executeUpdate();
}

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

最后,您在main中执行的new String(...)是完全不必要的。

票数 0
EN

Stack Overflow用户

发布于 2014-07-14 12:36:49

首先,这行代码

代码语言:javascript
复制
int row = processor.saveData(new String("INSERT INTO NAMES (name) VALUES (nameTable)"));

由于您已经指定saveData()方法将参数作为字符串,因此不需要任何新的字符串(...)此外,您使用的是PreparedStatement,因此可以使用参数化查询,如下所示

代码语言:javascript
复制
int row = processor.saveData("INSERT INTO NAMES (name) VALUES (?)");

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

代码语言:javascript
复制
preparedStatement.setString(1, "name");

最后,您正在更新表,而不是查询它,因此请更改以下内容

代码语言:javascript
复制
preparedStatement.executeQuery();

代码语言:javascript
复制
return preparedStatement.executeUpdate();

还有一件事,你应该对你的方法名进行非常具体的说明。您应该始终根据方法将要做的事情来命名方法。与saveData()类似,这里必须仅用于保存数据,而不是像您试图使用ResultSet那样查询数据。如果您想要检索数据,则使用其他方法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22840673

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档