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 函数的主要内容,如果未能解决你的问题,请参考以下文章

java调用Oracle中的存储过程与存储函数

如何在ORACLE存储过程中调用WEBSERVICE函数

从 Java JDBC 调用 oracle 函数

对 Oracle 存储函数的 JDBC 调用 - “结构表”类型的 IN 参数

Oracle系列:(33)JDBC访问Oracle的存储过程和存储函数

使用 JDBC 从存储过程中获取 Oracle 表类型