我这里有一个有趣的问题。我正在尝试使用 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/