PDA

View Full Version : Null-Wert mit Fetch in DS übertragen



Seiten : [1] 2

Peter Kosel
24-03-04, 09:03
Hi *all

ich habe mal eine kleine Frage zu SQLRPG.
Ich möchte mit fetch einen Datensatz in eine DS übertragen.
Eine der Spalten hat aber leider den Wert NULL - ist ein Feld vom Typ VARCHAR.
Das Ergebnis dieser Operation ist SQLCOD -305 nun sagt die Fehlermeldung folgendes aus :


SQL0305N The NULL value cannot be assigned to a host variable in the SELECT or FETCH statement because no indicator variable is specified.

Explanation: A FETCH or embedded SELECT or VALUES operation resulted in the retrieval of a NULL value to be inserted into a host variable for which no indicator variable was provided. An indicator variable must be supplied if a column can return a NULL value.

The statement cannot be processed. No data was retrieved.

User Response: Examine the definition of the FETCH or SELECT object table or the elements of the VALUES list. Correct the program to provide indicator variables for all host variables where NULL values from those columns can be retrieved.

sqlcode: -305


Was habe ich hier zu tun, um den Satz verarbeiten zu können ?
Die Spalte mit dem Null-Wert brauche ich nicht.

Vielen Dank vorab für eingehende Tips!

Gruß
Peter

Fuerchau
24-03-04, 09:21
Wenn man einzelne Spalten nicht benötigt, kann man keinen SELECT * .... FETCH ... INTO :MYDS verwenden. In diesem Fall halt etwas der Mühe unterziehen und die Felder gezielt per SELECT auswählen.
Dies ist sowieso der bessere Weg, da bei einer Änderung der Tabelle ggf. neue Felder nicht in der DS sind aber der SELECT * diese auswählt, der SQL somit nicht ausgeführt werden kann.

Zu einer DS kann man auch ein Indicator-Array verwenden:

fetch mycursor into :myds :dsind

Wobei "dsind" ein Array von 2-Byte-Binärfeldern sein muss.

Peter Kosel
24-03-04, 09:28
Hallo Fürchau,

Du hast wohl Recht mit dem SELECT * ...
Meine Datenstruktur ist aber eine externe DS.
Somit reicht mir bei Anpassungen an der Tabelle eine erneute Umwandlung.

Dann aber noch einmal zur DSIND. Kann ich davon ausgehen, das die Anzahl der Elemente der Anzahl der Spalten entsprechen muß ? Und ganz dumme Frage,: Wie definiere ich ein Array von 2-Byte-Binärfeldern ?

Gruß und Danke

Peter

Fuerchau
24-03-04, 09:34
Die Anzahl der Felder des Arrays muss mindestens der Anzahl Felder der DS entsprechen (kann aber auch größer sein).

Definition in ILERPG:

d myind 5I 0 dim(256)

Peter Kosel
24-03-04, 09:37
Hallo Fürchau,

vielen Dank für die wie immer schnelle und kompetente Hilfe!

Peter

BenderD
24-03-04, 10:25
Hallo Peter,

ich würde mit SQL generell Views verwenden, das löst die Anforderungen alle und vermeidet jeden Recompile. Mit SQL CREATE VIEW erstellte LFs haben keinerlei maintenance Overhead.

mfg

Dieter Bender

Peter Kosel
24-03-04, 10:56
Hallo Dieter,

danke für den Tip, auch wenn ich das mit dem Overhead jetzt nicht ganz verstanden habe. Ich möchte auch in der DB keine Views anlegen. Da sie nicht von uns erstellt wurde und auch nicht von uns gepflegt wird.

Der Tip von Fürchau hat mir da schon prima geholfen. Mit der INDDS hat sich das Problem gelöst. Der SQLCOD bleibt bei Feldern mit Null immer 0.

Gruß
Peter

itec01
29-09-11, 16:47
Wenn man einzelne Spalten nicht benötigt, kann man keinen SELECT * .... FETCH ... INTO :MYDS verwenden. In diesem Fall halt etwas der Mühe unterziehen und die Felder gezielt per SELECT auswählen.
Dies ist sowieso der bessere Weg, da bei einer Änderung der Tabelle ggf. neue Felder nicht in der DS sind aber der SELECT * diese auswählt, der SQL somit nicht ausgeführt werden kann.

Zu einer DS kann man auch ein Indicator-Array verwenden:

fetch mycursor into :myds :dsind

Wobei "dsind" ein Array von 2-Byte-Binärfeldern sein muss.

Ich habe ähnliche Probleme. Ich habe ein SQL mit left join, d.h. das Ergebnis bringt NULL Werte zurück, wenn Daten aus der zweiten Tabelle nicht gefunden wurden.
Nun taucht auch dieser SQL0305 Fehler auf.

Hier die DS:
dnullind s 2b 0
**
d InpSql ds
d iPsWhSe 2
d iPsPtNo 15
d iPsBonT 7 0
d iPmWhse 2
d iPmPtNo 15

Feld 4 wird moniert.

Hier der SQL Fetch command:
c/EXEC SQL
c+ FETCH NEXT FROM CRS1SQL INTO :INPSQL :NULLIND
c/END-EXEC

Was mache ich falsch?

Danke.

Fuerchau
29-09-11, 17:27
NULLIND muss ein Array mit mindestens der Anzahl Felder sein, da ja je Feld ein Null-Indikator übergeben wird.

Also "dim(5)" dahinter.

Das Hauptproblem ist dann immer die Zählerrei, insbesonders wenn man mal die Struktur mit dem SQL ändert und neue Felder nicht hinten anhängt.
Dann kann später mal die Abfrage "if NULLIND(4) = *zero" zu unerwünschten Programmfehlern führen.

Daher sollte beim Fetch jedes Feld einzeln kodiert werden (was der Compiler ja sowieso schon macht, schau mal in die Liste), so dass man gezielt jedem Feld auch seinen NullInd zuweisen kann.
Das macht das spätere Ändern dann einfacher.

itec01
30-09-11, 08:28
super, vielen Dank, hat so funktioniert.

Gruss Klaus