Anmelden

View Full Version : RPG SQL Insert VALUES(Datenstruktur)



ASFOURI
26-10-16, 11:42
Hallo

Info: Betriebssystem V7R2.

in einem RPG (SQLRPG) Programm soll ein SQL INSERT in eine Datenstruktur erfolgen.
Die DS enthält ein NULL-Feld

*--> Datenstrucktur der GVKP
D ds_gvkp E DS EXTNAME(gvkp)

D AnzeigerV S 5I 0 DIM(22)

D TrCodNull S 5I 0
D NULL S 5I 0 Inz(-1)


Der Insert in die DS funktioniert leider nicht.
EXEC SQL
INSERT INTO GVKP VALUES(:ds_gvkp :AnzeigerV);

Der INSERT mittels einzelner Values funktioniert.
EXEC SQL
INSERT INTO GVKP VALUES(:gvseqid,
....
NULL,
:gvdatum)

Funktioniert es grundsätzlich nicht bei einem NULL-Feld in der DS, oder mache ich da etwas verkehrt oder fehlt irgendein Parameter.

Danke voraus
viele Grüße
Jürgen

Fuerchau
26-10-16, 12:27
So genau gibt das das Handbuch nicht her, aber um konform mit MultipleRow-Insert zu bleiben, ist ggf. das NULL-Array in einer DS anzugeben und die DS als NULL-Anzeiger.

D AnzeigerDS DS
D AnzeigerV 5I 0 dim(22)

INSERT INTO GVKP VALUES(: ds_gvkp : AnzeigerDS);

Bei mehreren Zeilen wird nämlich auf beiden DS nur die Dimension gesetzt.
Empfehlenswert ist dieses Vorgehen nicht, da man ja die NULL-Anzeiger abzählen muss.
Die Einzelbenennung ist auf jeden Fall sicherer.

ASFOURI
26-10-16, 12:44
Hallo
vielen Dank für die schnelle Antwort.

Wenn das 22. Feld NULL enthalten soll, was muss in AnzeigerV(22) reingeschrieben werden?
Der Inhalt aus der Variable NULL (wie oben definiert mit -1) ?

Viele Grüße
Jürgen

Fuerchau
26-10-16, 13:21
Das ist korrket:
0 = Wert ist nicht NULL
-1 = Wert ist NULL
Zu beachten ist, dass du alle NULL-Anzeiger setzen musst.

ASFOURI
27-10-16, 08:40
Hallo an *Alle

INFO zur Lösung:

INSERT INTO GVKP VALUES(: ds_gvkp : AnzeigerDS);
die Anweisung hat leider nicht funktioniert.

Funktioniert hat es dann mit dieser Definition
*--> Anzeiger Variable (indicator) zur GVKP
D AnzeigerV S 5I 0 DIM(22) INZ(*ZEROS)

*--> Null Value
D NULL S 5I 0 Inz(-1)

Dann das NULL-Feld (Nummer 21) mit NULL definierien.
AnzeigerV(21) = NULL;

EXEC SQL
INSERT INTO GVKP VALUES(:ds_gvkp :AnzeigerV);


viele Grüße
Jürgen

Fuerchau
27-10-16, 13:38
Nun, ich bin halt nicht davon ausgegangen, dass du die Nullanzeiger nicht initialisierst!
Manchmal ist das Fehlen von Code schwer ersichtlich.
Ich habe mir z.B. angewöhnt, jede DS und Single-Variable mit INZ zu initialisieren.
INZ reicht im Übrigen, da der typspezifische Default verwendet wird.

BenderD
27-10-16, 14:09
Hallo an *Alle

INFO zur Lösung:

INSERT INTO GVKP VALUES(: ds_gvkp : AnzeigerDS);
die Anweisung hat leider nicht funktioniert.

Funktioniert hat es dann mit dieser Definition
*--> Anzeiger Variable (indicator) zur GVKP
D AnzeigerV S 5I 0 DIM(22) INZ(*ZEROS)

*--> Null Value
D NULL S 5I 0 Inz(-1)

Dann das NULL-Feld (Nummer 21) mit NULL definierien.
AnzeigerV(21) = NULL;

EXEC SQL
INSERT INTO GVKP VALUES(:ds_gvkp :AnzeigerV);


viele Grüße
Jürgen

... seltsam, seltsam das INZ sollte eigentlich nur in einer DS erforderlich sein, da diese sonst als char behandelt und mit blank initialisiert wird. (Die reference garantiert das zumindest für static (= global) Felder, scheint aber auch für automatic storage (locale Variablen) ohne INZ auf die Felddefaults, in diesem Fall 0, zu funzen.

D*B

ASFOURI
02-11-16, 11:34
Hallo
vielen Dank für eure Info und Hilfe.
"INZ wird nun ein wichtiger Bestandteil zukünftiger Definitionen werden".

viele Grüße
Jürgen