JDBC:像过程一样调用 Oracle 函数
Posted
技术标签:
【中文标题】JDBC:像过程一样调用 Oracle 函数【英文标题】:JDBC: Call Oracle function like a procedure 【发布时间】:2018-06-05 14:32:04 【问题描述】:我使用了一个 Oracle 过程并对其进行批处理。
CallableStatement st = con.prepareCall ("call MyProc (123)");
...
st.addBatch ();
现在该过程被转换为一个函数。因此批处理不再起作用,并且忽略返回值也不起作用。 如果我不设置“?=”,则找不到该功能。
CallableStatement st = con.prepareCall ("? = call MyFunc (123)");
但是如果没有批处理,运行所有调用需要很长时间。我必须做很多。
那么有没有一种方法可以在不触及函数的情况下忽略 JDBC 级别的返回值?我想要我的批处理。
【问题讨论】:
【参考方案1】:您当然可以使用 Oracle 语法并忽略 PL/SQL 块中的函数值。
类似的东西
con.prepareCall("""
declare
v_ignore number;
begin
v_ignore := MyFunc (?);
end;""")
【讨论】:
【参考方案2】:对于 oracle db,它将是这样的:
private Long getResultOfFunction(final long param1)
CallableStatementCallback<Long> action = new CallableStatementCallback<Long>()
public Long doInCallableStatement(CallableStatement cs)
throws SQLException, DataAccessException
cs.registerOutParameter(1, Types.NUMERIC);
cs.setLong(2, param1);
cs.executeQuery();
return cs.getLong(1);
;
return getJdbcTemplate().execute("call ? := package_name.function_name (?)", action);
【讨论】:
请重新阅读问题。问题是关于如何在批处理模式下调用函数。使用 SQL92 语法返回java.sql.SQLException: operation not allowed: Stored procedure with out or inout parameters cannot be batched
以上是关于JDBC:像过程一样调用 Oracle 函数的主要内容,如果未能解决你的问题,请参考以下文章
对 Oracle 存储函数的 JDBC 调用 - “结构表”类型的 IN 参数