【问题标题】:How to call a SQL Scalar function using Apache DbUtils如何使用 Apache DbUtils 调用 SQL 标量函数
【发布时间】:2013-12-10 16:22:53
【问题描述】:

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

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...”,它就可以工作

【问题讨论】:

  • 你试过用 exec 命令代替 select 吗? msdn.microsoft.com/pt-br/library/ms188332.aspx
  • 是的,EXEC 不返回任何内容。
  • 我没有使用 Apache Common DBUtils 的经验,但我会尝试执行代码,因为我有一个包含一行和一列的记录集。
  • run 是 QueryRunner 的实例吗?它在构造函数中有参数 pmdKnownBroken。尝试将其设置为 true。
  • 你试过在ScalarHandler中设置ResultSet参数吗?

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


【解决方案1】:

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

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

但是不像描述的那样工作,因为fillStatementmethod 在调用java.sql.getParameterMetaData 时没有捕捉到异常。

所以您应该将 pmdKnownBroken 设置为 true

【讨论】:

    【解决方案2】:

    我不确定是否可以使用 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);
    

    【讨论】:

    • 它与 CALL 抛出相同的异常。而第二种解决方案不是这个问题的答案。
    • 第一个解决方案不会为我调用函数返回任何结果集,但不会引发相同的异常,请检查调用语法。
    • 可能,因为您在创建运行对象时将 true 作为参数传递了。这样就可以了。
    • 我在对您的问题发表评论时向您询问了此参数。解决问题了吗?
    猜你喜欢
    • 2013-03-13
    • 2012-11-07
    • 1970-01-01
    • 1970-01-01
    • 2011-11-08
    • 1970-01-01
    • 1970-01-01
    • 2013-04-01
    • 2012-01-27
    相关资源
    最近更新 更多