Anmelden

View Full Version : embedded SQL: View mit NULL-Werten verarbeiten



mgraskamp
27-09-17, 14:15
Hallo in die Runde,

ich habe eine SQL VIEW, welche in einigen Feldern NULL-Werte enthält

Ich möchte diesen VIEW jetzt im RPG mit embedded SQL verarbeiten. Bei den Sätzen mit NULL-Werten kommt der SQLCOD -305 und es stehen keine Werte in der Datenstruktur.

Wie gehe ich in so einem Fall am besten vor? Alle (viele) Felder in der VIEW mit COALESCE umsetzen? Oder gibt's im RPG eine Möglichkeit (ctl-opt)? Oder gibt es noch eine andere Idee?

Das ist mein Programm:
ctl-opt option(*nodebugio:*nounref)
decedit('0.')
main(main);

dcl-s sqlstm char(100)
inz('SELECT * FROM webservice/web01view');

dcl-ds web01view ext inz qualified end-ds ;

dcl-proc main;
exec sql PREPARE prepSQL1 FROM :sqlstm;
exec sql DECLARE crsr1 CURSOR FOR prepSQL1;
exec sql OPEN crsr1;
dou 1 = 0;
exec sql FETCH NEXT FROM crsr1 INTO :WEB01VIEW;
if SQLCOD = 100;
leave;
else;
// Verarbeitung
ENDIF;
enddo;
end-proc;

Vielen Dank.

Robi
27-09-17, 14:35
http://newsolutions.de/forum-systemi-as400-i5-iseries/threads/21026-SQL-fetch-for-500-rows-into-DS

funktioniert auch bei einzelsatz lesen

Robi

Fuerchau
27-09-17, 14:51
Da du in eine DS fetchst, estelle eine 2. DS mit NULL-Flags:

D NULLDS DS
D NULLFLG I5 dim(50)

FETCH NEXT FROM crsr1 INTO : WEB01VIEW : NULLDS;

mgraskamp
27-09-17, 15:21
Code durch
dcl-ds nullds;
nullflg int(5) dim(50);
END-DS;
ergänzt. Und die FETCH-Anweisung durch :NULLDS ergänzt. Jetzt kann ich das Programm nicht umwandeln, weil NULLDS nicht definiert oder verwendbar ist. Habe ich Deine D-Bestimmungen falsch in FREE umgesetzt? Was passiert, wenn es mehr als 50 Sätze werden? Warum überhaupt DIM(50)?

Fuerchau
27-09-17, 17:14
Also: je Feld ist ggf. ein NULL-Flag erforderlich, bei Kannfeldern kann man NULL-Flags verwenden.
Da dein Fetch in eine DS geht, so ist ein Flag-Array erforderlich.
Insoweit war mein SQL ein wenig falsch, da ich nicht das Array sondern die DS angegeben habe.
Der Link zu dem Thema betrifft einen Multi-Row-Fetch, wo je Zeile ein Flag-Array erforderlich ist und in dem Fall benötigt man dann ein 2-dimensionales Array (1.Dim=Zeile, 2.Dim=Spalte).

Korrigiere deinen SQL in dem du nicht die NULLDS sondern NULLFLG als Array angibst.