3

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 @
4

3 に答える 3

10

基本的に "SQLCODE=-440, SQLSTATE=42884" は、ストアド プロシージャが見つからないことを意味します。

非常に一般的な原因は、引数が一致しないことです。

私の場合、Java コードでは、スキーマ名をストアド プロシージャ名の前に置く必要があることに気付きました。たとえば、median_result_set(?) の代わりに、SCHEMANAME.median_result_set(?)

この SP の SCHEMANAME は、いくつかの DB 管理ツールで見つけることができます。

コマンドラインからスキーマ名を指定する必要がない理由:そのSPを作成したときと同じユーザーでCLPコマンドラインからSPを呼び出すと、スキーマ名は必要ないようです(内部的にそれらは一致します)。もちろん、コマンド ラインでスキーマを指定するのは常に正しいことです。DB2 が内部的にユーザー名をスキーマ名として使用していることを確認しました。たとえば、「ADMINISTRATOR」が SP を作成した場合、Windows で表示される限り、文字列「ADMINISTRATOR」はそのスキーマ名です。

于 2013-08-22T15:19:35.073 に答える
0

実際には存在しないため、見つけることができません...代わりにMEDIAN_RESULT_SETを呼び出すか、プロシージャを「median_result_set」として作成してください...

誰かが同じ問題を抱えている場合に備えて;)

于 2017-02-08T07:39:28.423 に答える
-3

エラー # は42884 No routine was found with the specified name and compatible arguments. URL のチェックを意味します: http://publib.boulder.ibm.com/infocenter/db2luw/v9r5/index.jsp?topic=%2Fcom.ibm.db2.luw.messages.doc%2Fdoc%2Frdb2stt.html

42884 エラー コードを検索します。質問を自分で解決できることを願っています。

于 2013-08-21T21:47:09.410 に答える