【问题标题】:Generating date in Oracle using prepared statements使用准备好的语句在 Oracle 中生成日期
【发布时间】:2014-04-11 08:58:53
【问题描述】:

我有一个有趣的问题。我正在尝试使用 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 程序并使用准备好的语句时,它会引发一个非常奇怪且无意义的错误“在 index:: 6 处缺少 IN OUT 参数”,这很奇怪,因为只有 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 个参数。有人对它为什么这样做有任何想法吗?

【问题讨论】:

    标签: java oracle date prepared-statement


    【解决方案1】:

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

    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 部分。

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

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

    【讨论】:

    • 天哪!谢谢!你不知道有多少人看过这个愚蠢的声明,却找不到。拥有另一双眼睛总是有帮助的!
    • "并且它在构造字符串中的冒号稍后被解释为绑定变量"......好的,这解决了我的问题。我从准备好的语句中取出 ' 字符,我的绑定变量神奇地开始正常工作。太棒了!
    猜你喜欢
    • 2016-04-10
    • 1970-01-01
    • 1970-01-01
    • 2013-07-16
    • 1970-01-01
    • 2016-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多