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

Rah*_*lee 2 java oracle plsql jdbc oracle11g

我可以使用以下语法的call语句调用pl/sql函数:

String call = "{ ? = call p_some_package.some_function( ?, ?, ?, ?, ?) }";
CallableStatement cs = connection.prepareCall(call);
Run Code Online (Sandbox Code Playgroud)

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

cs.registerOutParameter(1, OracleTypes.NUMBER);
cs.setInt(2, someInteger);
...
Run Code Online (Sandbox Code Playgroud)

但是在调用过程时,我可以提供参数名称,因为没有"无名"out参数,因为有一个函数:

cs.setInt("param_name", param_value);
Run Code Online (Sandbox Code Playgroud)

Oracle pl/sql参考声明,对于函数,Oracle会创建一个返回的额外OUT参数.所以我的问题是:是否可以传递此参数的名称或以某种方式为此参数指定名称,并使用它将参数传递给JDBC中的pl/sql函数,就像我为程序做的那样?

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

Fra*_*nta 5

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

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

@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"));

}
Run Code Online (Sandbox Code Playgroud)