我试图通过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
...”
答案 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);