如何使用Apache DbUtils调用SQL Scalar函数

时间:2013-11-25 19:30:42

标签: java sql-server jdbc user-defined-functions apache-commons-dbutils

我试图通过SQLServer调用Apache Common DbUtils存储的标量函数。 我试过这样的事情:

run.query("SELECT [MyDB].[dbo].[test] ('testParam')", new ScalarHandler());

但是,我得到了这个例外:

com.microsoft.sqlserver.jdbc.SQLServerException: com.microsoft.sqlserver.jdbc.SQLServerException: Unable to identify the table SELECT [MyDB].[dbo].[test] ('testParam') for the metadata.

然而,在SQLServer中运行相同的查询会返回有效的标量值。

我想知道如何使用Apache DbUtils调用标量函数。

更新:对于表值函数,如果我使用“SELECT * FROM ...”

2 个答案:

答案 0 :(得分:3)

看起来Apache Common DbUtils(v.1.5)AbstractQueryRunner(基类QueryBuilder)代码中存在一个错误。它有参数pmdKnownBroken,其描述如下:

如果pmdKnownBroken设置为true,我们甚至都不会尝试;如果不对,我们会尝试,如果它破了,我们会记得不再使用它。

但是没有按照描述工作,因为fillStatement方法在调用java.sql.getParameterMetaData时没有捕获异常。

所以你应该将pmdKnownBroken设置为true

答案 1 :(得分:0)

我不确定是否可以使用DBUtils运行SQL Server标量函数,请尝试这种方式

Object[] params = {"inputparam"};
ScalarHandler<T> scalar = new ScalarHandler<T>();
run.query("{CALL DB.dbo.test(?)}", scalar, params);

如果找不到DBUtils的解决方案,你可以使用CallableStatement

String url = "jdbc:sqlserver://....";
SQLServerDataSource sqls = new SQLServerDataSource();
sqls.setURL(url);
sqls.getConnection();

CallableStatement callStatement = sqls.getConnection().prepareCall("{? = CALL DB.dbo.f_promedio(?,?)}");
callStatement.setDouble(2, 1.8);
callStatement.setDouble(3, 6.8);
callStatement.registerOutParameter(1, java.sql.Types.DECIMAL);
callStatement.execute();

double d = callStatement.getDouble(1);