2

我正在尝试通过调用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...”

4

2 回答 2

3

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

如果pmdKnownBroken设置为true,我们甚至不会尝试;如果为假,我们会尝试它,如果它坏了,我们会记住不要再次使用它。

但不像描述的那样工作,因为fillStatement方法在调用时没有捕获异常java.sql.getParameterMetaData

所以你应该将 pmdKnownBroken 设置为 true

于 2013-12-03T12:40:15.540 回答
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);
于 2013-12-02T18:32:07.570 回答