2013-08-21 838 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」 ......

萬一有人有同樣的問題; )

相關問題