【问题标题】:DB2 java Stored Procedure call return error SQLCODE=-440, SQLSTATE=42884DB2 java 存储过程调用返回错误 SQLCODE=-440, SQLSTATE=42884
【发布时间】:2013-08-24 10:30:03
【问题描述】:

我正在对 DB2 进行一个简单的存储过程调用。当它调用存储过程时,它总是返回这个错误:

DB2 SQL Error: SQLCODE=-440, SQLSTATE=42884, SQLERRMC=MEDIAN_RESULT_SET;PROCEDURE, DRIVER=3.66.46

========== Java 代码:

String JDBC_DRIVER = "com.ibm.db2.jcc.DB2Driver";
// STEP 2: Register JDBC driver
Class.forName(JDBC_DRIVER);

// STEP 3: Open a connection
System.out.println("Connecting to database..."); 
conn = DriverManager.getConnection(DB_URL, USER, PASS);

// to execute the stored procedure.
System.out.println("CALL median_result_set(?)");
String sql = "CALL median_result_set(?)";
CallableStatement stmt1 = conn.prepareCall(sql);
stmt1.registerOutParameter(1, Types.DOUBLE);

stmt1.execute();
System.out.println("jdbcadapter->callproc after execute " + sql);
stmt1.close();

conn.close();

=============== db2 clp 命令行有效:

c:SP>db2 call median_result_set(?)
 Value of output parameters 
 --------------------------
 Parameter Name  : MEDIANSALARY 
 Parameter Value : +7.68582000000000E+004

Result set 1
--------------
NAME      JOB   SALARY
--------- ----- ---------
Marenghi  Mgr    77506.75
O'Brien   Sales  78006.00

================ 存储过程定义:

CREATE PROCEDURE median_result_set
-- Declare medianSalary as OUT so it can be used to return values
(OUT medianSalary DOUBLE)
RESULT SETS 2
LANGUAGE SQL
BEGIN

   DECLARE v_numRecords INT DEFAULT 1;
   DECLARE v_counter INT DEFAULT 0;

   DECLARE c1 CURSOR FOR
      SELECT salary FROM staff
       ORDER BY CAST(salary AS DOUBLE);

  -- use WITH RETURN in DECLARE CURSOR to return a result set
  DECLARE c2 CURSOR WITH RETURN FOR
   SELECT name, job, salary
   FROM staff 
   WHERE CAST(salary AS DOUBLE) > medianSalary
   ORDER BY salary;

  -- use WITH RETURN in DECLARE CURSOR to return another result set
 DECLARE c3 CURSOR WITH RETURN FOR
    SELECT name, job, salary
    FROM staff
    WHERE CAST(salary AS DOUBLE) < medianSalary
    ORDER BY SALARY DESC;

 DECLARE CONTINUE HANDLER FOR NOT FOUND
   SET medianSalary = 6666; 

 -- initialize OUT parameter
 SET medianSalary = 0;

 SELECT COUNT(*) INTO v_numRecords FROM STAFF;

 OPEN c1;

   WHILE v_counter < (v_numRecords / 2 + 1) DO
     FETCH c1 INTO medianSalary;
     SET v_counter = v_counter + 1;
  END WHILE;
  CLOSE c1;

  -- return 1st result set, do not CLOSE cursor
  OPEN c2;

  -- return 2nd result set, do not CLOSE cursor
  OPEN c3;
END @

【问题讨论】:

  • 谢谢 Bryan,您知道原因吗?
  • 您在 CLP 和您的 Java 应用程序中使用相同的用户 ID 连接吗?这会返回什么:select routineschema from syscat.routines where routinename = 'MEDIAN_RESULT_SET'?这是你所期望的吗?
  • 这是一个很好的命令,它有效并显示了模式名称。我希望我当时知道这个命令。
  • @huican 嘿 huican。你知道如何解决这个问题吗?当我运行 mustaccio 的命令时,它返回的是我的模式名称而不是用户名。

标签: java stored-procedures jdbc db2


【解决方案1】:

错误#表示42884 No routine was found with the specified name and compatible arguments. 查看网址:http://publib.boulder.ibm.com/infocenter/db2luw/v9r5/index.jsp?topic=%2Fcom.ibm.db2.luw.messages.doc%2Fdoc%2Frdb2stt.html

并搜索 42884 错误代码。希望您能自己解决您的问题。

【讨论】:

  • 问题是为什么找不到路由。 1)我有独立工作。 2)在 java 代码中,我连接到一个好的数据库,并且 3)我使用了与我在独立中使用的相同的名称。我正在使用 DB2 Express-C,我想知道那里是否没有启用它。
【解决方案2】:

基本上“SQLCODE=-440, SQLSTATE=42884”表示找不到存储过程。

我看到一个很常见的原因是参数不匹配。

对于我的情况,我注意到在 java 代码中,我必须将模式名称放在存储过程名称的前面,例如,而不是 median_result_set(?),我应该使用 SCHEMANAME.median_result_set(?)

可以使用一些数据库管理工具找到此 SP 的 SCHEMANAME。

我不需要从命令行指定架构名称的原因:似乎当我在创建该 SP 时使用同一用户从 CLP 命令行调用 SP 时,不需要架构名称(因为它们在内部匹配)。当然,在命令行中指定模式总是正确的。我观察到 DB2 在内部使用用户名作为模式名。例如,如果“ADMINISTRATOR”创建了一个 SP,那么字符串“ADMINISTRATOR”就是它的模式名称,只要我在 Windows 上看到。

【讨论】:

  • 我最近在尝试在 UDF 中使用 ASCII 函数时收到错误消息;使用 SYSFUN.ASCII 解决了这个问题,谢谢!
【解决方案3】:

你找不到它,因为它实际上并不存在...... 尝试调用 MEDIAN_RESULT_SET 或将过程创建为“median_result_set”...

以防万一有人遇到同样的问题;)

【讨论】:

    猜你喜欢
    • 2017-04-02
    • 1970-01-01
    • 2011-11-20
    • 1970-01-01
    • 2014-01-22
    • 1970-01-01
    • 2015-09-12
    • 2017-04-01
    • 2019-04-19
    相关资源
    最近更新 更多