Proc SQL NOERRORSTOP Job läuft aber dennoch auf Fehler

Hallo zusammen,

ich habe folgendes Problem.

Nach einem Proc SQL mit den Optionen NOPRINT und NOERRORSTOP führt SAS das Programm zwar weiter aus, aber z.B. im LSF steht es anschliessend dennoch auf Fehler. Gleiches gilt wenn ich es im EG laufen lasse.

Wie kann ich nun vermeiden, das es auf einen Fehler läuft.

Beispiel für den SQL:

Auf der Datei liegt ein unique constraint auf dem Feld kd_nr damit jede Nummer nur einmal vorkommen kann.

PROC SQL NOPRINT NOERRORSTOP;
INSERT INTO work.datei
SET kd_nr = 1
;
QUIT;

Die Fehlermeldung lautet dann ERROR: Add/Update failed for data set work.datei because data value(s) do not comply with integrity constraint PK_kd_nr.

Dies ist ja auch o.K.
Die variable &SQLRC liefert den wert 24 auch das ist o.k.

Ich Prüfe dann diesen ab und hole mir eine neue Kd_nr und inserte diese dann was auch klappt.

Danach ist der &SQLRC 0.

Wie kann ich nun verhindern, dass der LSF bzw der EG das Programm als abgebrochen erkennt.

Vielen Dank im voraus für alle Antworten.

BIGAIRFOX

Hallo, warum versuchst Du

Hallo,

warum versuchst Du denn immer, erst einmal einen Datensatz mit der Nr. 1 einzufügen?
Vielleicht ist das Beispiel auch etwas zu stark verkürzt, so dass mir der Sinn
dieser ersten Aktion nicht klar wird.
Aber warum denn nicht direkt eine neue Kd_nr holen (dafür scheint es ja eine
funktionierende Möglichkeit zu geben) und diese auch sofort verwenden?

Schönen Gruß

Olaf Musch

Nähere Info

Hallo,

vielen Dank für die Info.

Dann hole ich etwas weiter aus.

Es soll über dieses Programm ein Surrogate Key ermittelt werden. Es wird also zuerst die gleiche Datei gelesen und mit MAX(sid) die höchste Nummer ermittelt. Danach wir diese Nummer um 1 erhöht und wieder eingefügt. Da es aber sein kann, das ein zweiter Ablauf sich ebenfalls die gleiche Nummer holt (ist zwar unwahrscheinlich kann aber vorkommen), kann es sein, das zweimal die gleiche Nummer eingefügt werden soll. Damit das nicht geschieht, wurde ein Primärer Index auf die SID gelegt.

Wird nun versucht der gleiche Schlüssel nochmal einzufügen kommt der gewünschte SQL-Fehler daher auch der NOERRORSTOP. Tritt der Fehler auf, wird nochmal mit MAX(sid) die neue Nummer geholt und wieder versucht diese einzufügen. Das ganze kann 5 Mal geschehen dann erfolgt ein gewollter Abbruch.

Obwohl der Insert beim 2. mal klappt, steht der Job trotz der NOERRORSTOP-Option nach dem Ende auf Fehler. Dies soll aber vermieden werden, da es blöd ist, wenn ein Job korrekt beendet wurde, auf Fehler steht.

Ich hoffe, das ganze wurde jetzt etwas klarer.

Viele Grüße

BIGIARFOX

Ähnliche Problematik im DATA STEP

Hallo,
wir hatten eine ähnliche Problematik, aber im Data Step. Das Problem ist gelöst, deshalb schreibe ich hatten, die Aufgaben-Stellung existiert weiterhin.
Bei uns wird mit dem set-set-key-Zugriff in ein zweites Data Set gegriffen, um eine Zusatz-Information zum eigentlichen Datensatz hinzuzulesen. Wenn im zweiten Data Set kein passendes Gegenstück gefunden wurde, dann ist das auch kein Problem.
Bis zur SAS-6.12-Version war das kein Problem, man konnte mit options errors=0; die Fehler-Erkennung/-Meldung abschalten und nach dem Data-Step mit dem set-set-key-Zugriff wurde mit options errors=20; die Fehler-Erkennung/-Meldung wieder aktiviert.
Mit der SAS-8-Version klappte das nicht mehr, SAS behandelte diese Situation als Fehler und meldete das lautstark im LOG und unsere LOG-Analyse machte daraus das Gesamt-Ergebnis Job endete mit Fehler.
Es dauerte eine halbe Ewigkeit bis SAS zwar den Fehler nicht behob, aber bis SAS einen Work-Around anbieten konnte (dieser Work-Around ergab sich eher zufällig bei eine Kaffe-Pausen-Diskusion während eines Kurses bei SAS). Der Trick besteht darin mit _error_=0; die SAS-interne Fehler-Variable auf alles OK zu setzen.
Beispiel:

if _iorc_=%sysrc(_sok) /* Falls Treffer, dann: NOP, sonst: reset error */
then do;
/* Treffer: NOP */
end;
else do;
/* Kein Treffer bei "set katdatS2 key=VkoVtwPrli"-Zugriff, KEY='VKORG, VTWEG, prli_k' */
/* reset _error_ bei set-set-key-Zugriff, das unterdrückt Fehler im LOG */
_error_=0; /* 20050609: Unterdrückt Fehler im LOG (nötig bei set-set-key-Zugriff) */
end;

Vielleicht passt diese Lösung auch bei der obigen Fragestellung.

Gruß
Hans Kneilmann, Schäfer Shop GmbH (SSI)

Geht leider nicht

Hallo Herr Kneilmann,

vielen Dank für Ihre Antwort.

leider funktioniert es mit _error_ = 0 nicht, das es diese Variable nur im Data-Step gibt. Aber nicht im SQL.

Habe aber gerade eine Lösung für den LSF bekommen. Es gibt die Macrovariable &SYSCC diese wird durch den SQL auf 1008
gesetzt und liefert dies wohl auch an den LSF als Returncode. Durch %LET SYSCC = 0; erkennt der LSF den Fehler nicht mehr und zeigt den Job als erfolgreich ausgeführt an. Im Log tauchen die ERRORS allerdings noch auf was aber da kein Problem darstellt.

Im EG geht dies aber nicht. Da steht das Programm weiter auf Fehler. Mal sehen, ob sich hier auch noch eine Lösung findet.

Viele Grüße

BIGAIRFOX