to_date里面的callablestatement

时间:2014-08-05 13:07:54

标签: java oracle to-date

我试图在to_date内使用callableStatement功能。

我的陈述最终成为

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>)

我使用以下代码构建TO_DATE函数:

CallableStatement stmt
String dateParam =  "TO_DATE('" + sTS + "', 'DD-MON-RR HH.MI.SSXFF AM')";
stmt.setString(1, dateParam);    
//set more parameters
stmt.execute();      

其中sTS是正确日期格式的字符串。我可以看到问题是setString将我的字符串包装在单引号中,但是如何在可调用语句中设置它?

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   

2 个答案:

答案 0 :(得分:0)

为什么不想将字符串转换为日期然后将其发送到您的程序?我已回答similar question already

答案 1 :(得分:0)

如果您打算将字符串传递给调用,则您的语句应为:

RGPKG.PKG_RG_LEAD.ADD_LEAD(TO_TIMESTAMP(?, 'DD-MON-RR HH.MI.SSXFF AM'), ?, ...)

然后您可以使用以下值设置值:

stmt.setString(1, sTS);       

如果您需要小数秒和格式掩码的to_timestamp()部分,则需要to_date()而不是XFF,尽管您的样本值无论如何都没有小数秒。

但是,如zaratustra建议的那样,使用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 a"