Anmelden

View Full Version : NULL und Case



Seiten : 1 2 [3] 4

Allrounder
09-05-12, 10:01
Schonmal danke an alle für's Miträtseln.

RPG können wir denke ich außen vor lassen.
Es wird auch initialisiert bzw. *loval gesetzt statt NULL, wenn ich in der SQL-Konsole des navigators oder auch in einer SQL-Sitzung auf der i5 einen sql-update absetze, z.B.:


update tabelle
set spalte =
case 1
when 1
then NULL
else 'xx'
end
where ID = 1;


Noch ein Hinweis:
Ein insert mit analoger Syntax funktioniert:


insert into tabelle (
spalte)

values (case 1
when 1
then NULL
else
'xx'
end );

Allrounder
09-05-12, 10:03
Irgendwo muss deine Logik da noch falsch sein. Gibts da vielleicht noch einen Trigger?

Trigger gibt es hier keine, ist eine neue Tabelle ohne zugehörige Objekte.

Pikachu
09-05-12, 10:22
Funktioniert denn das?

update tabelle set spalte =
case 1 when 1 then NULL else NULL end

andreaspr@aon.at
09-05-12, 10:31
Ich habe jetzt dein Beispiel in ein SQLRPGLE-Code gepackt, eine entsprechende Tabelle erstellt und befüllt und mal getest.
Das Programm macht das was erwartet wird.


/Free
Exec Sql SET OPTION COMMIT=*NONE, CLOSQLCSR=*ENDMOD,
ALWBLK=*ALLREAD, ALWCPYDTA=*YES,
SRTSEQ=*HEX, DLYPRP=*YES;

exec sql update pranlib/t1
set such = case 1 when 1 then NULL else 'xxx' end
where nr = 2000;
*inlr = *on;
return;
/End-Free

V6R1

Allrounder
09-05-12, 12:15
Funktioniert denn das?

update tabelle set spalte =
case 1 when 1 then NULL else NULL end

Wird abgeblockt mit "Mindestens ein Ergebnis in CASE-Ausdruck darf nicht NULL sein".

Allrounder
09-05-12, 12:25
Ich habe jetzt dein Beispiel in ein SQLRPGLE-Code gepackt, eine entsprechende Tabelle erstellt und befüllt und mal getest.
Das Programm macht das was erwartet wird.


/Free
Exec Sql SET OPTION COMMIT=*NONE, CLOSQLCSR=*ENDMOD,
ALWBLK=*ALLREAD, ALWCPYDTA=*YES,
SRTSEQ=*HEX, DLYPRP=*YES;

exec sql update pranlib/t1
set such = case 1 when 1 then NULL else 'xxx' end
where nr = 2000;
*inlr = *on;
return;
/End-Free

V6R1

Können wir die Maschinen tauschen? ;)

Was passiert, wenn Du das sql-statement interaktiv ausführst?

andreaspr@aon.at
09-05-12, 13:32
Können wir die Maschinen tauschen? ;)
Derzeit wohl eher nicht :)


Was passiert, wenn Du das sql-statement interaktiv ausführst
Das gleiche Ergebnis.

B.Hauser
09-05-12, 16:22
Versuch mal folgendes:

/Free
Exec SQL
update tabelle
set spalte = NULLIF(:hostvar, '');

oder


D HostVarInd S 5I 0
/Free
If HostVar <= ' ';
HostVarInd = -1;
Else;
HostVarInd = *Zeros;
EndIf;

Exec SQL Update Table
Set Spalte = :HostVar :HostVarInd;
/End-Free

Birgitta

Fuerchau
09-05-12, 16:23
Dann würde ich mal doch eine Fehlermeldung an IBM abgeben.

Ggf. vorher noch PTF's prüfen und ggf. einspielen oder mal das Problem mit einer anderen, neu erstellten Tabelle ausprobieren.

PS:
Das mit dem NULL-Anzeiger wurde ja abgelehnt :).

Allrounder
10-05-12, 08:53
Versuch mal folgendes:

/Free
Exec SQL
update tabelle
set spalte = NULLIF(:hostvar, '');


Das war einer meiner ersten Versuche. Hab's trotzdem noch einmal versucht, aber leider das gleiche Ergebnis.





D HostVarInd S 5I 0
/Free
If HostVar <= ' ';
HostVarInd = -1;
Else;
HostVarInd = *Zeros;
EndIf;

Exec SQL Update Table
Set Spalte = :HostVar :HostVarInd;
/End-Free

Auch das hat leider nicht funktioniert. Gleicher Effekt: Keine Meldung im Joblog, sqlcod 0, sqlstate 0, update erfolgreich, aber eben kein NULL in der Spalte :confused:

Wir haben auch etliche Serviceprogramme mit der gleichen Technik: ein update mit NULL innerhalb einer case-Anweisung in embedded sql, ohne NULL-Anzeiger. Da funktioniert es.
Ein Unterschied zu der aktuellen Tabelle können wir nicht feststellen.

Der Fehler tritt übrigens auf zwei unterschiedlichen i5 auf.

Wir (meine Kollegen und ich) sind jetzt mit unserem Latein am Ende und haben uns für zwei update-anweisungen in einer if/else-block entschieden, eine schreibt NULL direkt, die andere schreibt die Hostvariable.

Nicht schön, aber selten ;)

Danke an alle für die Antworten!

@Fuerchau: Wir hätten sogar die NULL-Anzeiger eingebaut. ^^