繁体   English   中英

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

[英]Generating date in Oracle using prepared statements

我这里有一个有趣的问题。 我正在尝试使用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程序并使用一条准备好的语句时,它会引发一个非常奇怪且毫无意义的错误,即“在索引:: 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

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

一些其他信息。 该字符串从主要的prepared语句直接插入。 这就是为什么它看起来有点有趣的原因。 因此,我的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部分。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM