[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Mar 2001
    Beiträge
    163

    Null-Wert mit Fetch in DS übertragen

    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

  2. #2
    Registriert seit
    Feb 2001
    Beiträge
    20.247
    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.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  3. #3
    Registriert seit
    Mar 2001
    Beiträge
    163
    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

  4. #4
    Registriert seit
    Feb 2001
    Beiträge
    20.247
    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)
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  5. #5
    Registriert seit
    Mar 2001
    Beiträge
    163
    Hallo Fürchau,

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

    Peter

  6. #6
    Registriert seit
    Mar 2002
    Beiträge
    5.287
    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
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  7. #7
    Registriert seit
    Mar 2001
    Beiträge
    163
    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

  8. #8
    Registriert seit
    Sep 2004
    Beiträge
    327
    Zitat Zitat von Fuerchau Beitrag anzeigen
    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.

  9. #9
    Registriert seit
    Feb 2001
    Beiträge
    20.247
    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.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  10. #10
    Registriert seit
    Sep 2004
    Beiträge
    327
    super, vielen Dank, hat so funktioniert.

    Gruss Klaus

  11. #11
    Registriert seit
    Aug 2001
    Beiträge
    2.875
    ... 2 Byte Binär bedeutet übrigens NICHT 2B 0!, sondern muss entweder als 4B 0 oder besser 5I 0 definiert werden.

    Birgitta
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 4. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

Similar Threads

  1. Brauche Hilfe zu FETCH xxx USING DESCRIPTOR
    By AndreasH in forum IBM i Hauptforum
    Antworten: 13
    Letzter Beitrag: 08-05-15, 13:09
  2. Wert aus CSV Datei
    By mk in forum IBM i Hauptforum
    Antworten: 9
    Letzter Beitrag: 21-12-06, 08:56
  3. DS Übergabe
    By Squall in forum NEWSboard Programmierung
    Antworten: 9
    Letzter Beitrag: 24-10-06, 08:44
  4. FETCH n ROws in einzelne Felder einer DS
    By pedro-zapata in forum NEWSboard Programmierung
    Antworten: 6
    Letzter Beitrag: 11-09-06, 12:34
  5. NOT NULL WITH DEFAULT
    By deni87991 in forum IBM i Hauptforum
    Antworten: 1
    Letzter Beitrag: 04-08-06, 10:32

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • You may not post attachments
  • You may not edit your posts
  •