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ß).
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich Stimme 100% mit @X-Zero, dies scheint wie eine Menge Arbeit definieren von Cursor-und was-nicht, wenn Sie tun könnten, einen einfachen Satz-basierte Bedienung (wahrscheinlich mit besserer Leistung). Hier sind zwei Beispiele, wie Sie es tun können, mit einem einzigen Vorgang:
Normalen
UPDATE
:Neuen
MERGE
Schärfe:Diese wurden getestet auf DB2 für Linux/Unix/Windows v9.7, aber sollte funktionieren auf jeder beliebigen version von DB2, die neuer als Version 9.1 (DB2 for iSeries ist ein Platzhalter, habe ich nie daran erinnern, was die Plattform tut oder nicht unterstützen
:)
)MERGE
aber die erste Variante sollte funktionieren (Was genau das war, was ich gedacht habe).Den FETCH-Befehl innerhalb der WHILE -, so dass jedes mal aufgerufen wird, ruft es eine Zeile.