是否可以从 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 函数并按名称注册返回值?的主要内容,如果未能解决你的问题,请参考以下文章
从 0jdbc6 JDBCthin 驱动程序调用具有自定义对象返回类型的 Oracle PL/SQL 过程