Java to_date in callablestatement
我试图在Java to_date in callablestatement,java,oracle,to-date,Java,Oracle,To Date,我试图在callableStatement中使用to\u date函数 我的陈述最终被证明是错误的 RGPKG.PKG_RG_LEAD.ADD_LEAD('TO_DATE('05-Aug-2014 11:53:34 AM', 'DD-MON-RR HH.MI.SSXFF AM')', <More-parameters-here>) 其中sTS是正确日期格式的字符串。我可以看出问题在于setString将我的字符串用单引号括起来
callableStatement
中使用to\u date
函数
我的陈述最终被证明是错误的
RGPKG.PKG_RG_LEAD.ADD_LEAD('TO_DATE('05-Aug-2014 11:53:34 AM', 'DD-MON-RR HH.MI.SSXFF AM')',
<More-parameters-here>)
其中sTS
是正确日期格式的字符串。我可以看出问题在于setString
将我的字符串用单引号括起来,但是我如何在callable语句中设置它呢
create or replace
PACKAGE BODY PKG_RG_LEAD AS
PROCEDURE ADD_LEAD
(p_created_tstamp IN RG_LEAD.CREATED_TSTAMP%type,
p_created_by IN RG_LEAD.CREATED_BY%type,
数据库上的列将创建为
CREATED_TSTAMP TIMESTAMP(6) No systimestamp 2
为什么不想将字符串转换为日期,然后将其发送到过程?我已回答如果您打算将字符串传递到呼叫中,您的声明应该是:
RGPKG.PKG_RG_LEAD.ADD_LEAD(TO_TIMESTAMP(?, 'DD-MON-RR HH.MI.SSXFF AM'), ?, ...)
然后,您可以使用以下设置值:
stmt.setString(1, sTS);
如果需要小数秒和格式掩码的XFF
部分,则需要到_timestamp()
而不是到_date()
,尽管示例值没有小数秒
但是,按照Zaratutra的建议,使用stmt.setTimestamp()
传递一个实际的时间戳值要好得多。下面是一个例子:
String sTS = "05-Aug-2014 11:53:34 AM";
stmt = conn.prepareCall("{ call RGPKG.PKG_RG_LEAD.ADD_LEAD(?, ?, ...) }";
SimpleDateFormat sdf = new SimpleDateFormat("dd-MMM-yy hh:mm:ss a");
stmt.setTimestamp(1, new Timestamp(sdf.parse(sTS).getTime()));
...
如果实际值有小数秒,则将格式
“dd MMM yy hh:mm:ss.S”设为“
什么是stmt
查询-占位符周围是否有单引号?为什么截止日期的本身不是查询的一部分呢?stmt是一个CallableStation,它调用package ADD_LEADADD_LEAD
的具体说明是什么?您是要传递一个日期,还是传递一个字符串,该过程将对其求值以形成一个日期?那将是。。。奇数。参数1需要一个字符串。数据库最近已更改,现在默认的日期格式不同。它过去只传递一个字符串作为日期,但现在不起作用,因此如果要使用to_date,则应更改该过程以获取日期参数。如果您确实无法做到这一点,请设置会话NLS\u DATE\u格式
,或者以数据库现在期望的格式传递字符串。将函数调用作为参数传递将不起作用。包当前接受参数1的字符串,如果可能,我希望避免更改它。这是为了避免数据库的日期格式发生更改时出现问题。请向我们显示包源,至少是其签名。过程添加\u LEAD(p_created_tstamp IN RG_LEAD.created_tstamp%type,p_created_by RG_LEAD.created_by%type,@MikeMcK如果你把它添加到你的问题中会更好。另外,让我们看看什么是RG_LEAD.created_tstamp和RG_LEAD.created_by?@MikeMcK你的过程ADD_LEAD
在输入中有时间戳,如果在java代码中将字符串转换为datebefore,然后将其传递给add\u lead
过程。
String sTS = "05-Aug-2014 11:53:34 AM";
stmt = conn.prepareCall("{ call RGPKG.PKG_RG_LEAD.ADD_LEAD(?, ?, ...) }";
SimpleDateFormat sdf = new SimpleDateFormat("dd-MMM-yy hh:mm:ss a");
stmt.setTimestamp(1, new Timestamp(sdf.parse(sTS).getTime()));
...