PDA

View Full Version : Fehler bei RUNSQLSTM über *SYSRPYL automatisch beantworten



nico1964
11-03-21, 10:33
Hallo,

ich habe schon wieder einmal eine undankbare Aufgabe bekommen.
Durch die Konstellation einer Fremd Datenanlieferung an uns und die nicht gleichlaufende Weiterverarbeitung kann es zu dupKey kommen. Da mir da der Job abbricht, suche ich eine Möglichkeit das trotzdem durch zu bekommen. Ich brauche die weiteren Schritte nach diesem CL

Im CL habe ich jetzt folgendes drinnen:

CHGJOB INQMSGRPY(*SYSRPYL)
ADDRPYLE SEQNBR(4712) MSGID(CPF5009) RPY(I)
ADDRPYLE SEQNBR(4713) MSGID(CPF5034) RPY(I)
ADDRPYLE SEQNBR(4714) MSGID(SQL0803) RPY(I)
ADDRPYLE SEQNBR(4715) MSGID(SQL9010) RPY(I)
ADDRPYLE SEQNBR(4716) MSGID(CEE9901) RPY(I)
RUNSQLSTM SRCFILE(*LIBL/QSQLSRC) SRCMBR(T13CRLST) +
COMMIT(*NONE)
RMVRPYLE SEQNBR(4712)
RMVRPYLE SEQNBR(4713)
RMVRPYLE SEQNBR(4714)
RMVRPYLE SEQNBR(4715)
RMVRPYLE SEQNBR(4716)

Trotzdem bricht das CL ab was mache ich falsch?

LG aus Wien

BenderD
11-03-21, 10:51
... ich weiß zwar nicht, was Du da wirklich vorhast, aber hast Du mal über RUNSQLSTM ... ERRLVL(...) nachgedacht?

D*B

Fuerchau
11-03-21, 12:00
SQLxxxx-Fehler sind keine Antwortfehler. Somit zieht das nicht.
Um also DUPKEY-Fehler auszuschließen musst du einen " where not exists (select * from dest where sorce.key = dest.key) " hinzufügen.

ERRLVL(40) funktioniert nur, wenn du mehrere Befehle in der SRC hast. Dann wird beim Abbruch eines SQL's der nächste trotzdem ausgeführt.

Es liegt leider im SQL begründet, dass dieser beendet wird, sollte ein Fehler auftreten.

nico1964
11-03-21, 12:34
SQLxxxx-Fehler sind keine Antwortfehler. Somit zieht das nicht.
Um also DUPKEY-Fehler auszuschließen musst du einen " where not exists (select * from dest where sorce.key = dest.key) " hinzufügen.

ERRLVL(40) funktioniert nur, wenn du mehrere Befehle in der SRC hast. Dann wird beim Abbruch eines SQL's der nächste trotzdem ausgeführt.

Es liegt leider im SQL begründet, dass dieser beendet wird, sollte ein Fehler auftreten.

Ich habe mehrere Insert in diesem SQL und die brauche ich alle, der eine doppelte ist mir wurscht kommt aus einem Fremdsystem

Fuerchau
11-03-21, 13:06
Dann nimm ERRLVL(40), der ignoriert alle Fehler bis auf obige Ausnahmen.
Bei einem

insert into tablea
select * from tableb

wird nach der ersten fehlerhaften Zeile abgebrochen, selbst wenn die folgenden Zeilen korrekt wären.

nico1964
12-03-21, 05:38
Danke mit ERRLVL 40 funktioniert es das eigentliche Problem werde ich angehen, wenn ich Zeit dafür habe.