我使用的是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)"));
}
}
网址,用户名和密码已设置但未在代码中显示。我可以连接到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描述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)
答案 0 :(得分:0)
您的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
作为查询和查询的参数(这真的没有多大意义)。
最后,你在主管身上做的new String(...)
完全没必要。
答案 1 :(得分:0)
首先是这行代码
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
那样查询数据。如果要检索数据,请使用其他方法。