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

Posted

技术标签:

【中文标题】是否可以从 jdbc 调用 pl/sql 函数并按名称注册返回值?【英文标题】:Is it possible to call pl/sql function from jdbc and register the return value by name? 【发布时间】:2014-12-15 01:15:44 【问题描述】:

我能够调用 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 named parameter's name (for Oracle JDBC function result)

【问题讨论】:

提供你的函数的概要来理解你所说的没有名字的 OUT 参数到底是什么意思。 @Polppan:他的意思是返回值。 但是函数的返回值叫什么名字? Name of return value ??它没有名字..任何函数都会有它返回的值的名字,用任何语言吗?它只是返回类型... @RahimMammadlee 我怀疑是否可以使用名称调用返回值。请参阅 CallableStatement 文档here。 【参考方案1】:

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

在使用这种方法之前,请先看看这篇文章,并确保您不会在颠倒 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"));


【讨论】:

以上是关于是否可以从 jdbc 调用 pl/sql 函数并按名称注册返回值?的主要内容,如果未能解决你的问题,请参考以下文章

使用 JDBC 从 PL/SQL 存储函数中获取表返回值

从 apex 页面进程调用 pl/sql 函数

通知调用方不存在记录的 DML PL/SQL 过程

从 0jdbc6 JDBCthin 驱动程序调用具有自定义对象返回类型的 Oracle PL/SQL 过程

带有输入参数的 Oracle JDBC 调用 PL/SQL 过程记录表

从 Java 调用 PL/SQL Web Toolkit 过程