Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java to_date in callablestatement_Java_Oracle_To Date - Fatal编程技术网

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_LEAD
ADD_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()));
...