DB2 Gespeicherte Prozedur mit einem Cursor

DB2 V9 für Z/Os

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

Die oben gespeicherte Prozedur erstellt mit cond code 0, aber nicht ausgeführt werden, auch wenn eine bestimmte consumer_id. Hat jemand sehen, was falsch???

Einzelnen sql-Anweisungen ausführen, genau so, wie Sie sollen.

Habe ich folgte dem Beispiele für Cursor in SQL-Prozeduren von IBM.

Danke

  • Sie wissen, dies könnte (wahrscheinlich) besser machen, ohne den cursor, richtig? Nämlich, diese kann getan werden, in einem einzigen UPDATE Anweisung, vorausgesetzt, die Größe des aktualisierten Zeilen nicht zu groß (für die Transaktion). Lieber "normale" Aussagen über die Cursor, die meisten der Zeit, es sei denn, das Ergebnis ist entweder ausgelagert (wie bei der Anzeige an einen Benutzer), oder das aktualisieren/löschen/was auch immer muss sein 'Batch' (wenn die Anzahl der Zeilen gesperrt wäre zu groß).
InformationsquelleAutor John Milton | 2012-08-28
Schreibe einen Kommentar