在Java中将Oracle函数作为String传递

时间:2013-03-10 08:41:47

标签: java sql oracle jdbc

我有这样的查询..

String query = "UPDATE tbl_customer_policies SET "+
        "start_date = ?," + 
        "next_pay_date = ?,"+
        "maturity_date = ?, " + 
        "modified_at = CURRENT_TIMESTAMP,"+
        "modifier = ?, status = ? " + 
        "WHERE id = ?";

现在代替start_date的占位符,我想传递一个像SYSDATE这样的字符串。

我现在正在做的是在名为String startDate = "SYSDATE"的变量中设置该字符串并将其绑定到该占位符。但我想这似乎不起作用。我得到了这个例外

ORA-01858:找到一个非数字字符,其中包含数字

我必须传递类似的Oracle函数。如何实现?

2 个答案:

答案 0 :(得分:2)

如果始终为sysdate,则无需对其进行参数化。 直接在查询中设置它,如下所示:

String query = "UPDATE tbl_customer_policies SET "+
        "start_date = sysdate," + // or "start_date = ADD_MONTHS(SYSDATE, 12),"
        "next_pay_date = ?,"+
        "maturity_date = ?, " + 
        "modified_at = CURRENT_TIMESTAMP,"+
        "modifier = ?, status = ? " + 
        "WHERE id = ?";

并像以前一样设置所有其他参数。

答案 1 :(得分:0)

使用功能TO_DATE(docs) 例如

    "UPDATE tbl_customer_policies SET "+
     "start_date = TO_DATE(?, 'DD-MON-RR')," + 
    "next_pay_date = TO_DATE(?, 'DD-MON-RR'),"+

并且在这种情况下不要忘记传递参数,如'27 -OCT-98'。

P.S。 我误解了这个问题,所以试着纠正我的答案。

所描述的问题是PreparedStatement Java类的限制。 PreparedStatement对象用于存储对某些预编译(和优化)SQL语句的引用 因此,您必须仅提供用于填充它们的参数值。 必须在使用结果之前评估函数,并且无法将它们放在那里。

我猜你可以使用Oracle结构化类型的解决方法。 您可以使用PreparedStatement的setRef()方法将它们作为引用类型传递。 使用函数可以使用object的构造函数中的包装器来实现。 我没试过,但在我看来这是一个可能的解决方案。