DB2 V9 Z/OsDB2 procédure stockée à l'aide d'un curseur
CREATE PROCEDURE SERDB.I21MMSNOUPD()
RESULT SETS 1
LANGUAGE SQL
FENCED
COLLID SER
WLM ENVIRONMENT DDSNSPENV
RUN OPTIONS 'NOTEST(NONE,*,*,*)'
P1: BEGIN
--Declare variables
DECLARE CONSUMER INTEGER;
DECLARE NEW_MMS_NO INTEGER;
DECLARE END_TABLE INT DEFAULT 0;
DECLARE C1 CURSOR FOR
SELECT I20_CONSUMER_ID,
NEW_MMS_NO
FROM SERDB.I20_TEMP
-- WHERE I20_CONSUMER_ID = 164921;
ORDER BY I20_CONSUMER_ID;
DECLARE CONTINUE HANDLER FOR NOT FOUND
SET END_TABLE = 1;
OPEN C1;
FETCH C1 INTO CONSUMER,
NEW_MMS_NO;
WHILE END_TABLE = 0 DO
UPDATE SERDB.I20_CONSUMER_T
SET I20_MMS_NO = NEW_MMS_NO
WHERE I20_CONSUMER_ID = CONSUMER;
END WHILE;
CLOSE C1;
END P1
La procédure ci-dessus stockée construit avec un code de cond 0, mais ne parvient pas à exécuter même lorsqu'une consumer_id spécifique. Est-ce que quelqu'un voit quelque chose de mal?
Les instructions SQL individuelles s'exécutent exactement comme elles le devraient.
J'ai suivi les exemples de curseurs dans les procédures SQL d'IBM.
Merci
Vous savez que cela pourrait (probablement) être mieux fait sans le curseur, n'est-ce pas? A savoir, cela peut être fait dans une seule instruction UPDATE, en supposant que la taille des lignes mises à jour n'est pas trop grande (pour la transaction). Préférer les instructions 'normales' sur les curseurs la plupart du temps, sauf si le jeu de résultats est soit paginé (comme lors de l'affichage à un utilisateur), soit mis à jour/supprimer/tout ce qui doit être 'batché' (si le nombre de lignes verrouillées trop grande). –