2013-08-21 837 views
3

我在做一个简单的DB2存储过程调用。尽管调用存储过程,它总是返回该错误:DB2 Java存储过程调用返回错误SQLCODE = -440,SQLSTATE = 42884

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 @ 
+0

谢谢布莱恩,有关这个原因的任何想法? – huican

+2

您是否使用CLP和Java应用程序中的相同用户标识进行连接?这返回什么:'从syscat.routines where routinename ='MEDIAN_RESULT_SET''选择routineschema?这是你期望的吗? – mustaccio

+0

这是一个很好的命令,它工作并向我展示了模式名称。我希望我当时知道这个命令。 – huican

回答

-3

错误#意味着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

问题是为什么没有找到路线。 1)我有独立的工作。 2)在java代码中,我连接到一个好的数据库,并且3)我使用了与在独立版中使用的名称相同的名称。我正在使用DB2 Express-C,我想知道它是否没有启用。 – huican

10

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

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

对于我而言,我注意到,在Java代码中,我必须把架构名称在存储过程的名称的前面,例如,而不是median_result_set(?),我应该怎么办SCHEMANAME.median_result_set(?)

该SP的SCHEMANAME可以在某些数据库管理工具中找到。

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

+0

我试图在UDF中使用ASCII函数时最近收到错误;使用SYSFUN.ASCII解决了这个,谢谢! – ESP

0

你找不到它,因为它实际上不存在... 尝试调用MEDIAN_RESULT_SET代替或创建的程序为“median_result_set” ......

万一有人有同样的问题; )

相关问题