是否可以从jdbc调用pl/sql函数并按名称注册返回值



我能够使用以下语法的调用语句来调用pl/sql函数:

String call = "{ ? = call p_some_package.some_function( ?, ?, ?, ?, ?) }";
CallableStatement cs = connection.prepareCall(call);

但是,我必须使用它们的索引传递参数,因为我必须注册返回值,它没有名称:

cs.registerOutParameter(1, OracleTypes.NUMBER);
cs.setInt(2, someInteger);
...

然而,当调用过程时,我可以提供参数名称,因为没有像函数那样的"无名称"输出参数

cs.setInt("param_name", param_value);

Oracle pl/sql引用指出,对于函数,Oracle会创建一个额外的OUT参数,并返回该参数。所以我的问题是:是否可以像我对过程所做的那样,传递这个参数的名称,或者以某种方式为这个参数分配一个名称,并使用它从JDBC向pl/sql函数传递参数?

类似的问题,没有答案:Java命名参数';s名称(用于Oracle JDBC函数结果)

您可以使用匿名块而不是"call"语法来使用命名绑定

在使用这种方法之前,请看一下这篇文章,并确保您不会在反转setXXX变量的顺序时遇到麻烦http://info.michael-simons.eu/2012/07/23/oracle-jbdc-callablestatements-and-named-parameters/

@Test
public void testFunctionOrdered() throws SQLException {
    String sql = "begin :quotient := TEST_QUOTIENT(DIVIDEND => :numerator, DIVISOR => :denominator); end;";
    CallableStatement cs = conn.prepareCall(sql);
    cs.registerOutParameter("quotient", Types.INTEGER);
    cs.setInt("numerator", 6);
    cs.setInt("denominator", 2);
    cs.execute();
    assertEquals(3, cs.getInt("quotient"));
}

最新更新