【问题标题】:How to run a PLSQL function with return and in out parameter using java in DB2?如何在 DB2 中使用 java 运行带有 return 和 in out 参数的 PLSQL 函数?
【发布时间】:2013-05-24 08:58:37
【问题描述】:

我在 DB2 中创建了一个 PLSQL 函数并尝试使用 java 执行它。但是我收到一个错误代码 -440,说明没有找到匹配的存储过程。 请看下面的代码sn-p。

Java 代码

    Connection dbConnection = null;
    CallableStatement callableStatement = null;

    try {
        dbConnection = getDBConnection();
        dbConnection.setAutoCommit(false);


        String getDBUSERByUserIdSql = "{? = call saju_func(?,?)}";

        callableStatement = dbConnection.prepareCall(getDBUSERByUserIdSql);
        callableStatement.registerOutParameter(1, java.sql.Types.INTEGER);
        callableStatement.registerOutParameter(3, java.sql.Types.INTEGER);

        callableStatement.setInt(2, 10);
        callableStatement.setInt(3, 20);


        // execute getDBUSERByUserId store procedure
        callableStatement.executeUpdate();

        int sum = callableStatement.getInt(1);
        System.out.println(sum);
        dbConnection.commit();


    } catch (SQLException e) {
        dbConnection.rollback();
        System.out.println(e.getMessage());

    } finally {

        if (callableStatement != null) {
            callableStatement.close();
        }
        if (dbConnection != null) {
            dbConnection.close();
        }
    }
}

PLSQL 函数

CREATE OR REPLACE FUNCTION saju_func (
     s_num1     IN      NUMBER,
     s_num2     IN OUT      NUMBER )
RETURN NUMBER
IS
BEGIN
    s_num2:= (s_num1+s_num2);
    RETURN s_num2;
END saju_func;
/

我尝试了类似的程序(相同的代码没有返回)并且工作正常。

【问题讨论】:

    标签: java jdbc plsql db2


    【解决方案1】:

    我不相信您可以在 DB2 中调用函数。 CALL 仅适用于存储过程。您可以将函数重写为存储过程,也可以执行调用函数的 PL/SQL 块 (examples here)。

    【讨论】:

      【解决方案2】:

      您的过程不返回任何内容(它有一个 IN OUT 参数),因此请改用 {call saju_func(?,?)} 并将参数的索引调整为:

      callableStatement.registerOutParameter(2, java.sql.Types.INTEGER);
      
      callableStatement.setInt(1, 10);
      callableStatement.setInt(2, 20);
      

      更新 根据您更新的代码,您可能需要删除

      callableStatement.registerOutParameter(1, java.sql.Types.INTEGER);
      

      原因:返回值通常被认为是OUT 参数,因此不应这样注册。

      注意:我自己不使用 DB2,我的回答是基于我对 JDBC 的一般理解和期望。

      【讨论】:

      • 我错误地添加了过程而不是函数。代码已更新。请帮助运行此功能,我之前分享的过程按照建议的方式运行良好。但问题在于调用函数。
      • @Saju 查看我的更新,因为我自己不使用 DB2,所以无法为您运行。
      【解决方案3】:

      您可以在 JDBC 程序中调用 DB2 函数,例如:

      String csSql = "{? = call abc.dbo.GetLength(?)}"
      
      CallableStatement cStmt = conn.prepareCall(sql);
      cStmt.registerOutParameter(1, Types.INTEGER);
      cStmt.setString(2, "abcd");
      
      boolean returnValue = cStmt.execute();
      int length = cStmt.getInt(1);
      System.out.println(length);
      

      上面的代码会打印 4

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-01-25
        • 1970-01-01
        • 2019-11-06
        • 2021-11-19
        • 2013-09-21
        • 1970-01-01
        • 2014-08-13
        • 1970-01-01
        相关资源
        最近更新 更多