Java sql oracle中的错误

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

我使用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.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';