我有这样的查询..
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函数。如何实现?
答案 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的构造函数中的包装器来实现。 我没试过,但在我看来这是一个可能的解决方案。