2

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

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;
/

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

4

3 回答 3

2

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

于 2013-05-29T11:51:22.767 回答
1

您的过程不返回任何内容(它有一个 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 的一般理解和期望。

于 2013-05-29T07:59:01.840 回答
0

您可以在 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

于 2015-07-30T11:49:10.630 回答