View Full Version : Null-Wert mit Fetch in DS übertragen
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
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
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
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
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.
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.
super, vielen Dank, hat so funktioniert.
Gruss Klaus