PDA

View Full Version : NULL und Case



Seiten : 1 [2] 3 4

Allrounder
08-05-12, 16:31
Woran siehst du, daß da Leerzeichen und nicht NULL reingeschrieben wurden?

Bei NULL wird ein '-' angezeigt.

Allrounder
08-05-12, 16:35
Bitte um Entschuldigung, aber NULL-Anzeiger werden zum korrekten Schreiben wirklich gebraucht.
Alle anderen Varianten kosten nur Zeit und sind nicht eindeutig zumal BLANK auch nicht NULL ist.

Deshalb ist der NULL-Anzeiger auch eine eigene Variable und muss im SQL auch separat angegebne werden.
Deine Hostvariable ist davon unberührt.

Spätesten wieder beim Lesen benötigst du sinnvollerweise wieder den NULL-Anzeiger, wenn du allerdings beim Select wieder coalesce verwendest kannst du dir das mit dem NULL-Wert auch schenken.

Du merkst sicher, dass ich kein Freund von NULL-Anzeigern bin ;-). Bisher sind wir immer ohne ausgekommen. Beim Lesen verwenden wir coalesce.

Fuerchau
08-05-12, 16:39
Dann prüfe doch mal deine Where-Klausel und das Ergebnis in SQLER3.
Wenn SQLER3 = 0 ist, erfolgte nämlich kein Update und SQLCOD ist auch dann 0 wenn kein Satz gefunden wurde.

Fuerchau
08-05-12, 16:41
Das habe ich befürchtet :).
Ohne coalesce kannst du beim Lesen eben auch den NULL-Wert feststellen denn die Hostvariable wird auch dann initialisiert.

Wenn ihr (entschuldige) so einen Blödsinn programmiert, warum dann überhaupt NULL-Werte ?

Allrounder
08-05-12, 16:45
Dann prüfe doch mal deine Where-Klausel und das Ergebnis in SQLER3.
Wenn SQLER3 = 0 ist, erfolgte nämlich kein Update und SQLCOD ist auch dann 0 wenn kein Satz gefunden wurde.

Alles gute Ideen, aber das Update passiert. In der Tabelle ist eine Spalte "Zeitmarke für Zeilenänderung". Da schreibt die Datenbank automatisch den Timestamp, wenn der Datensatz geändert wurde.

Fuerchau
08-05-12, 16:49
Irgendwo muss deine Logik da noch falsch sein. Gibts da vielleicht noch einen Trigger?

Allrounder
08-05-12, 16:55
Das habe ich befürchtet :).
Ohne coalesce kannst du beim Lesen eben auch den NULL-Wert feststellen denn die Hostvariable wird auch dann initialisiert.

Wenn ihr (entschuldige) so einen Blödsinn programmiert, warum dann überhaupt NULL-Werte ?

Wir sind erfolgreich von DDS/RPG auf SQL/ILE umgestiegen bzw. sind auch noch dabei. Blödsinn ist meiner Meinung nach, bei DDS zu bleiben ;-).

Zu NULL-Werten: Warum soll ich etwas speichern, wenn nichts da ist? Aber das ist eine andere Diskussion.

Wir schreiben an zig Stellen NULL-Werte weg, überall funktioniert es. Nur hier eben nicht. Wenn die Lösung einfach wäre, hätte ich's nicht posten müssen.

Mir wurde hier schon oft geholfen, auch von Dir.
Deshalb hoffe ich einfach, dass jemand ein ähnliches Phänomen schon einmal hatte.

Allrounder
08-05-12, 17:31
Bin einen kleinen Schritt weiter.

Ich habe noch eine NULLABLE-Spalte in der gleichen Tabelle, Datentyp Timestamp. Für die Spalte habe ich den Update analog gebaut.

Das Ergebnis: Er schreibt 0001-01-01 00:00:00.000000, initialisiert also nur und setzt nicht NULL.

Das passt auch zum vorherigen Fall. Da ist die Spalte char. Dort inititialisiert er also auch nur mit Leerzeichen und setzt nicht NULL.

Jetzt stellt sich aber immer noch die Frage, warum das NULL innerhalb der case-Anweisung ignoriert wird?

andreaspr@aon.at
09-05-12, 06:21
Und wenn du die gleiche SQL-Anweisung im STRSQL ausführst (natürlich mit den gleichen Werten wie in den Hostvars und der Where...) wird ein NULL geschrieben??

Das klingt für mich schon sehr mystisch.

Führe mal dein Programm im Debug aus und setze einen Breakpoint gleich direkt nach der UPDATE-Anweisung.
Schau dann nach dem Update in der Tabelle nach ob ein NULL drinnen steht. Danach lass das PGM zu ende laufen.

Entweder hast du wirklich noch irgendwo was (Default-Values in der Tabelle, Trigger, andere Programme die zusätzlich ausfgeführt werden etc.) oder das ist ein Bug.

Pikachu
09-05-12, 08:26
Ist vielleicht irgendeine spezielle Compiler-Anweisung oder H-Definition bezüglich NULL-Werten für dieses Programm angegeben?