DB2 java appel de Procédure Stockée renvoie l'erreur SQLCODE=-440, SQLSTATE=42884
Je suis en train de faire un simple appel de procédure stockée à DB2. Alors qu'il appelle la procédure stockée, elle renvoie toujours cette erreur:
DB2 SQL Error: SQLCODE=-440, SQLSTATE=42884, SQLERRMC=MEDIAN_RESULT_SET;PROCEDURE, DRIVER=3.66.46
========== Le code 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();
==============
La db2 clp ligne de commande a fonctionné:
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
================
La définition de la procédure stockée:
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 @
Merci Bryan, Aucune idée sur la cause?
Avez-vous connecter avec le même IDENTIFIANT d'utilisateur dans la CLP et votre application Java? Qu'est-ce retour:
C'est un bon de commande, et cela a fonctionné et m'a montré le nom de schéma. J'espère que je savais que cette commande à l'époque.
Hey huican. Avez-vous trouver comment résoudre ce problème? Quand j'ai couru mustaccio de la commande, il est rentré mon nom de schéma à la place du nom de l'utilisateur.
Avez-vous connecter avec le même IDENTIFIANT d'utilisateur dans la CLP et votre application Java? Qu'est-ce retour:
select routineschema from syscat.routines where routinename = 'MEDIAN_RESULT_SET'
? Est-ce que vous attendez?C'est un bon de commande, et cela a fonctionné et m'a montré le nom de schéma. J'espère que je savais que cette commande à l'époque.
Hey huican. Avez-vous trouver comment résoudre ce problème? Quand j'ai couru mustaccio de la commande, il est rentré mon nom de schéma à la place du nom de l'utilisateur.
OriginalL'auteur huican | 2013-08-21
Vous devez vous connecter pour publier un commentaire.
Fondamentalement "SQLCODE=-440, SQLSTATE=42884" signifie que la procédure stockée ne peut pas être trouvé.
J'ai vu une cause très fréquente est l'argument ne correspond pas.
Pour mon cas, j'ai remarqué que dans le code java, je dois mettre le nom de schéma devant le nom de la procédure stockée, e.g, au lieu de median_result_set(?), Je dois faire SCHEMANAME.median_result_set(?)
La SCHEMANAME pour cette SP peut être trouvé avec quelques DB outils d'administration.
La raison pour laquelle je n'ai pas besoin de spécifier le nom du schéma de la ligne de commande: il semble que lorsque j'appelle le SP du CLP en ligne de commande avec le même utilisateur que j'ai créé que le SP, il n'est pas nécessaire pour le nom de schéma (car en interne, ils correspondent). Bien sûr, il est toujours à droite, si vous spécifiez le schéma de la ligne de commande. J'ai observé DB2 utilise en interne le nom de l'utilisateur nom de schéma. E. g, si "ADMINISTRATEUR" a créé un SP, la chaîne "ADMINISTRATEUR" est son nom de schéma, tant que je vois sur Windows.
OriginalL'auteur huican
Vous ne la trouvez pas, car cela n'existe pas...
Essayez d'appeler MEDIAN_RESULT_SET à la place ou pour créer la procédure "median_result_set"...
Juste au cas où quelqu'un est d'avoir le même problème 😉
OriginalL'auteur Nik
L'erreur # signifie
42884 No routine was found with the specified name and compatible arguments.
Vérifier sur url: http://publib.boulder.ibm.com/infocenter/db2luw/v9r5/index.jsp?topic=%2Fcom.ibm.db2.luw.messages.doc%2Fdoc%2Frdb2stt.html
et de recherche pour 42884 code d'erreur. J'espère que vous pourrez résoudre votre problème par vous-même.
OriginalL'auteur H-Patel