0

我有这样的查询..

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 函数。如何做到这一点?

4

2 回答 2

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 = ?";

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

于 2013-03-10T08:57:32.630 回答
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”等格式传递参数。

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

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

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

于 2013-03-11T10:16:07.500 回答