【问题标题】:Oracle To_Date issue [duplicate]Oracle To_Date 问题 [重复]
【发布时间】:2012-08-10 21:49:30
【问题描述】:

可能重复:
TO_DATE issue with Oracle DBMS_SQL.EXECUTE function

我正在使用一个函数,该函数将日期作为 varchar 输入,然后 n 将其传递给另一个过程。我可以看到在某些情况下没有插入与日期相关的过去时间。请在下面找到我的功能

iv_plsql4 :='10-AUG-2012 07:30:30';
ln_dbms_cur := DBMS_SQL.OPEN_CURSOR;
iv_plsql2 := BEGIN PKG_PRADEEP.P_INSERTDATE(to_date(iv_plsql4,'DD-MM-YYYY HH24:MI:SS'));

DBMS_OUTPUT.put_line(iv_plsql);
DBMS_SQL.PARSE(ln_dbms_cur,iv_plsql,DBMS_SQL.NATIVE);
ln_cur_execute := DBMS_SQL.EXECUTE(ln_dbms_cur);

此代码将日期插入数据库,但时间为上午 12:00

但如果我更改字符串 iv_plsql2 如下所示,日期将插入 TIME 字段。

iv_plsql2 := BEGIN PKG_PRADEEP.P_INSERTDATE(to_date('10-AUG-2012 07:30:30','DD-MM-YYYY HH24:MI:SS'));

谁能解释为什么会这样?

【问题讨论】:

  • 您发布的代码似乎没有意义。您将 PL/SQL 块分配给无法编译的 iv_plsql2 变量。您使用动态 SQL 的事实使我怀疑您实际上是在为 iv_plsql2 分配一个恰好包含 PL/SQL 块的字符串。反过来,这强烈暗示错误出现在您构建此字符串时,该字符串显然是您为了发布问题而从代码中编辑出来的。此外,我希望您需要使用动态 SQL 确实是有原因的——这里没有任何迹象表明需要这样做。
  • 是的贾斯汀。我已经编辑了在论坛上发布的代码,这与我在生产环境中的查询类似。您对to_date问题有什么建议吗?
  • 这与 Java 有什么关系?我只看到 PL/SQL。
  • 我强烈怀疑错误出在您编辑的代码中。我怀疑您编辑的代码在某些时候会进行隐式日期到字符串的转换。但是,由于我看不到您已编辑的代码,因此无法说明隐式转换发生在该代码的哪个位置。

标签: java oracle function oracle10g native


【解决方案1】:

PL/SQL: 您的日期格式应该是 DD-MON-YYYY,而不是 DD-MM-YYYY。

Java: 您在 CallableStatement 上使用 setInt 来设置日期字符串。这不可能是正确的,事实上我不确定它会如何编译。

【讨论】:

  • 更改日期格式后它起作用了。我仍然看到日期的时间部分是上午 12:00。如果我通过传递日期从 JAVA 代码调用函数。您有什么建议吗?
  • 如何将日期从 Java 代码传递到 PL/SQL?
  • 我将它作为字符串从 JAVA 传递,并将其存储在我函数的 iv_plsql4 varchar 变量中。传递的日期将采用 DD-MON-YYYY HH24:MI:SS 格式。
  • 你能添加Java代码吗?另外,你能标记我的答案吗,干杯。
  • CallableStatement cstmt = session.connection().prepareCall("{? = call PKG_PRADEEP.P_INSERT_TIME(?,)}"); cstmt.setFetchSize(10000); cstmt.registerOutParameter(1,oracle.jdbc.driver.OracleTypes.CURSOR); cstmt.setInt(2, "10-08-2012 09:30:30"); cstmt.execute();
猜你喜欢
  • 2015-07-31
  • 2014-02-01
  • 2012-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多