java - 使用准备好的语句在 Oracle 中生成日期

标签 java oracle date prepared-statement

我这里有一个有趣的问题。我正在尝试使用 Oracle to_char 命令生成 XML 日期。当我使用 PL/SQL 执行此操作时,一切正常:

18:05:54 SQL> select to_char(sysdate, 'yyyy-mm-dd"T"hh24:mi:ss".000Z"') from dual;

TO_CHAR(SYSDATE,'YYYY-MM-DDT
---------------------------------------------------------------------------
2014-04-10T23:09:50.000Z

但是,当我将该日期格式放入 Java 程序并使用准备好的语句时,它会抛出一个非常奇怪且毫无意义的错误“在索引处缺少 IN OUT 参数::6”,这很奇怪,因为只有 5 个参数。我知道这是日期格式,因为如果我更改格式,该命令就可以正常工作。

这是我的日期格式字符串和有效的字符串:

private static final String XML_DATE = ", 'YYYY-MM-DD\"T\"HH24:MM:SS\"Z\")";  <-- BROKEN

private static final String XML_DATE = ", 'YYYY-MM-DD HH24:MM:SS')";  <-- Working

您可能会注意到,我需要转义引号以将它们保留在字符串中。

一些额外的信息。该字符串是从主准备语句内嵌插入的。这就是为什么它看起来有点滑稽。所以我的 SQL 语句的每一行看起来像这样:

    "   NVL(to_char(flt.my_date_dtm" + XML_DATE + ",'') my_date_dtm, " +

实际抛出的错误是这样的:

java.sql.SQLException: Missing IN or OUT parameter at index:: 6

这又很奇怪,因为有 5 个参数。有人知道为什么要这样做吗?

最佳答案

您在“损坏的”单引号中缺少结束单引号:

private static final String XML_DATE = ", 'YYYY-MM-DD\"T\"HH24:MM:SS\"Z\")";
                                                                         ^

您还已将损坏版本和工作版本中的 MI 更改为 MM。所以应该是:

private static final String XML_DATE = ", 'YYYY-MM-DD\"T\"HH24:MI:SS\"Z\"')";

不确定您是否故意遗漏了 .000 部分。

我认为这会导致解析失败,并且使构造字符串中的冒号稍后被解释为绑定(bind)变量。由于您没有收到缺少引号的错误,因此您可能会在最终字符串中使用此格式两次(或者偶数次,无论如何),因此总的来说,您最终会得到有效的字符串。有点 - 又长又无意义,但至少有平衡的报价......

当我看到这样的错误并且无法立即发现问题时,我通常会将最终字符串写入控制台并尝试通过 SQL*Plus 运行它,这往往会使问题变得更加明显。

关于java - 使用准备好的语句在 Oracle 中生成日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23000901/

相关文章:

java - 继承使用 Scanner 的 Java 构造函数

java - 错误消息 : java. sql.SQLException:列索引无效

java - 在 Java 中收缩 LinkedHashMap

sql - 如何在SQL Server中确定一个月中有多少天?

Java输入不识别字符串

sql - 在 Oracle 中排序 VARCHAR2 日期

oracle - PL/SQL : is there an instruction to completely stop the script execution?

java - Oracle的to_date函数返回不存在的日期

javascript - date.toLocaleString(选项)不起作用javascript

java - 在特定日期后的下周一获得第一个?