Java sql oracle中的错误
我使用App Java及其connect for JDBC并执行以下查询:Java sql oracle中的错误,java,oracle,Java,Oracle,我使用App Java及其connect for JDBC并执行以下查询: String date = '21-Dec-16'; StringBuilder query = new StringBuilder("SELECT * "); query.append("FROM TEST WHERE PUBLISHED_DATE='").append(date).append("'"); connection = getConnection(jdbc); stmt = connection.crea
String date = '21-Dec-16';
StringBuilder query = new StringBuilder("SELECT * ");
query.append("FROM TEST WHERE PUBLISHED_DATE='").append(date).append("'");
connection = getConnection(jdbc);
stmt = connection.createStatement();
rs = stmt.executeQuery(query.toString());
syso query => select * from TEST where PUBLISHED_DATE='21-Dec-16'
和错误:
java.sql.SQLDataException: ORA-01858: a non-numeric character was found where a numeric was expected
java.sql.SQLDataException: ORA-01843: not a valid month
我也测试:
select * from TEST where PUBLISHED_DATE=TO_DATE('21-Dec-16','DD-MON-RR')
和错误:
java.sql.SQLDataException: ORA-01858: a non-numeric character was found where a numeric was expected
java.sql.SQLDataException: ORA-01843: not a valid month
尽管如此,我还是在我的sql developer和works中执行此查询 导致错误的直接原因是您使用的日期格式不适用于Oracle查询。但除此之外,你应该认真考虑使用准备好的声明在这里。除了保护您的程序不受SQL注入的影响外,它还将使您不再担心如何格式化查询日期。相反,您可以简单地将DirectJavaDate对象绑定到查询
String query = "SELECT * FROM TEST WHERE PUBLISHED_DATE = ?";
PreparedStatement stmt = connection.prepareStatement(query);
stmt.setDate(1, date); // here 'date' is an actual Date object, not a string
ResultSet rs = stmt.executeQuery();
while (rs.next()) {
// access each record
}
如果您必须继续当前的工作,我希望以下原始查询能够正常运行:
SELECT * FROM TEST WHERE PUBLISHED_DATE = '2016-12-21'
您可以使用Java
SimpleDataFormat
对象从Date
对象获取该格式。如果要将该格式用于日期,必须更改数据库会话的语言设置:
Statement s = connection.createStatement();
s.execute("alter session set NLS_LANGUAGE = 'AMERICAN'");
然后您可以使用第二个示例中的
TO_DATE
函数。在哪里定义了DATE
?顺便说一句,您完全应该在这里使用准备好的语句,您当前的方法充满了问题。如果您尝试使用这种格式“'DD-MM-YYYY'”MON
,这取决于会话设置中定义的语言。帮你自己一个忙,只需使用MM
。如果我更改:String date='21-12-16';工作但我需要字符串date='21-Dec-16';