JDBC:像过程一样调用Oracle函数

JDBC:像过程一样调用Oracle函数,oracle,jdbc,plsql,Oracle,Jdbc,Plsql,我使用Oracle过程并对其进行批处理 CallableStatement st = con.prepareCall ("{call MyProc (123)}"); ... st.addBatch (); 现在这个过程被转换成一个函数。因此,批处理不再有效,忽略返回值也不起作用。 如果我没有设置“?=”则找不到函数 CallableStatement st = con.prepareCall ("{? = call MyFunc (123)}"); 但如果不进行批处理,则运行所有调用所需的

我使用Oracle过程并对其进行批处理

CallableStatement st = con.prepareCall ("{call MyProc (123)}");
...
st.addBatch ();
现在这个过程被转换成一个函数。因此,批处理不再有效,忽略返回值也不起作用。 如果我没有设置“?=”则找不到函数

CallableStatement st = con.prepareCall ("{? = call MyFunc (123)}");
但如果不进行批处理,则运行所有调用所需的时间太长。我必须做很多


那么,有没有一种方法可以在不接触函数的情况下忽略JDBC级别的返回值?我希望恢复批处理。

当然,您可以使用Oracle语法,忽略PL/SQL块中的函数值

像这样的

con.prepareCall("""
declare
 v_ignore number;
begin
  v_ignore := MyFunc (?);
end;""")

当然,您可以使用Oracle语法并忽略PL/SQL块中的函数值

像这样的

con.prepareCall("""
declare
 v_ignore number;
begin
  v_ignore := MyFunc (?);
end;""")

对于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);
}
private Long getResultOfFunction(最终长参数1){
CallableStatementCallback action=新建CallableStatementCallback(){
公共长doInCallableStatement(CallableStatement cs)
抛出SQLException、DataAccessException{
cs.registerOutParameter(1,类型.NUMERIC);
cs.setLong(2,参数1);
cs.executeQuery();
返回cs.getLong(1);
}
};
返回getJdbcTemplate().execute(“{call?:=package_name.function_name(?)}”,action);
}

对于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);
}
private Long getResultOfFunction(最终长参数1){
CallableStatementCallback action=新建CallableStatementCallback(){
公共长doInCallableStatement(CallableStatement cs)
抛出SQLException、DataAccessException{
cs.registerOutParameter(1,类型.NUMERIC);
cs.setLong(2,参数1);
cs.executeQuery();
返回cs.getLong(1);
}
};
返回getJdbcTemplate().execute(“{call?:=package_name.function_name(?)}”,action);
}

请重新阅读问题。问题是如何在批处理模式下调用函数。使用SQL92 syntaxt返回
java.sql.SQLException:不允许操作:无法批处理带有out或inout参数的存储过程
请重新阅读问题。问题是如何在批处理模式下调用函数。使用SQL92 syntaxt返回
java.sql.SQLException:不允许操作:不能批处理带有out或inout参数的存储过程