[NEWSboard IBMi Forum]

Hybrid View

  1. #1
    Registriert seit
    Jan 2012
    Beiträge
    1.226
    Zitat Zitat von B.Hauser Beitrag anzeigen
    Du kannst auch mit SQL gezielt auf Daten zugreifen und dir nur das rausholen, was Du brauchst.
    File-Referenz-Variablen kannst Du mit SQL-Funktionen genau wie alphanumerische Felder behandeln, d.h. mit POSSTR oder LOCATE kannst Du positionieren und suchen, mit SUBSTR kannst Du Daten gezielt herauslesen und dann in eine (kürzere) Host-Variable ausgeben.
    ... und Du bist auch nicht auf 16MB beschränkt, sondern kannst die ganzen (möglichen) 2GB verarbeiten. (Die Daten werden überigens nicht kopiert)

    Beispiel:
    Code:
     DCL-S MyClobFile  SQLTYPE(CLOBFILE) CCSID(1208);
    ...
     MyCLOBFile_Name = %Trim(ParIFSFile);                               
     MyCLOBFile_NL   = %Len(%Trim(MyCLOBFile_Name));                    
     MyCLOBFile_FO   = SQFRD;                            //Read Only    
                                                                        
     For Index =  1 to 15;                                              
         Start = (Index-1) * RowLen + 1;                                
         Exec SQL Set :MyText = Substr(:MyCLOBFile, :Start, :RowLen);   
         Dsply MyText;                                                  
         If    SQLCODE = 100 or SQLCODE < *Zeros                        
            or %Len(%Trim(MyText)) = *Zeros;                            
            Leave;                                                      
         EndIf;                                                         
     EndFor;
    Birgitta

    Hinweis für alle, die sich für dieses Thema interessieren: Das Programmbeispiel von Birgitta ist fast korrekt. Der SQLTYPE muss allerdings mit Unterstrich getrennt werden: CLOB_FILE.

    Aber mit einer anderen Sache haben wir ganz schön gekämpft: Im obigen Beispiel greift man mit substr auf den Clob zu. Das funktioniert nicht korrekt, wenn es sich um Mixed Data Strings handelt ! Das ist bei UTF-8 der Fall, wo ja die einzelnen Zeichen durch unterschiedliche viele Bytes ausgedrückt werden. Substr akzeptiert zwar einen UTF-8 String, interpretiert die Positionsangaben aber als Byte, nicht als Zeichen!

    (Steht in der SQL Referenz "im Kleingedruckten").

    Die Lösung ist aber einfach: Es gibt zusätzlich die Funktion "substring" (also alles ausgeschrieben). Die Funktion kann mit echten Zeichenzählungen umgeben!

    Aber nochmals Danke an Birgitta für das Programmbeispiel. Hat uns sehr weitergeholfen!

    Dieter

  2. #2
    Registriert seit
    Jan 2012
    Beiträge
    1.226
    Noch ein Hinweis:
    Auch die SQL Funktion length kommt mit Mixed Byte Strings (wie UTF-8) nicht zurecht. Es gibt aber die Funktion character_length. Die zählt echte Zeichen und nicht etwa Bytes!

  3. #3
    Registriert seit
    Feb 2001
    Beiträge
    20.774
    Was hilft einem das für Substring?
    Bei der Angabe der CCSID zur CLOB_FILE könnte man mal versuchen die 1200 für UCS16 zu verwenden.
    Dann sollte beim Lesen der Datei von 1208 in 1200 gewandelt werden und Substring wieder funktionieren.
    Performant ist das nicht gerade. Einfacher wäre dann, die Datei in einen Lob-Locator vom Typ DBCLOB abzulegen. Dann kann man per Substring ja darauf zugreifen.
    Dann wird nur 1x auf die IFS-Datei zugegriffen, der Rest passiert im Speicher.
    Vergiss nicht, den Locator auch wieder frei zu geben.
    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

  4. #4
    Registriert seit
    Jan 2012
    Beiträge
    1.226
    substring funktioniert ja mit utf-8. Nur substr geht nicht! Ich wollte nur darauf hinweisen, dass es inzwischen einige SQL Funktionen gibt, die auf den ersten Blick genau das machen, was die alten Funktionen (substr, length) auch gemacht haben. Aber die neuen Funktionen (substring, character_length) funktionieren eben auch bei UTF-8 korrekt, während die alten Funktionen falsche Ergebnisse liefern.

    Zu dem Freigeben muss ich aber nochmal nachfragen: Ich mache den Zugriff ja wie im obigen Beispiel beschrieben:
    DCL-S MyClobFile SQLTYPE(CLOBFILE) CCSID(1208);
    ...
    MyCLOBFile_Name = %Trim(ParIFSFile);
    MyCLOBFile_NL = %Len(%Trim(MyCLOBFile_Name));
    MyCLOBFile_FO = SQFRD;

    Dann arbeite ich auf dem Clob mit den SQL-Funktionen substring und character_length. Muss ich danach nochmal irgendetwas freigeben?

  5. #5
    Registriert seit
    Feb 2001
    Beiträge
    20.774
    Freigabe brauchst du da nicht, da du ja keinen Locator nimmst.
    Dein Verfahren liest die Datei komplett ein, nimmt den Substring und verwirft den Inhalt wieder.
    Je nach dem wie häufig du da auf eine Datei zugreifst, dauert das halt.
    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

  6. #6
    Registriert seit
    Jan 2012
    Beiträge
    1.226
    Danke für die Antwort. So hatte ich es mir beim Programmieren auch vorgestellt. Gefühlt geht das ganze rasend schnell. Ich habe aber keine Messungen durchgeführt.

Similar Threads

  1. http_url_get mit unicode
    By dschroeder in forum NEWSboard Programmierung
    Antworten: 5
    Letzter Beitrag: 29-03-19, 14:56
  2. Zeichenumsetzung AS/400 nach Streamfile
    By Theo in forum IBM i Hauptforum
    Antworten: 3
    Letzter Beitrag: 02-03-18, 13:46
  3. Ausländische Zeichen in Streamfile schreiben
    By dschroeder in forum NEWSboard Programmierung
    Antworten: 7
    Letzter Beitrag: 12-12-17, 14:32
  4. Konvertieren in Unicode
    By Rainer Ross in forum NEWSboard Programmierung
    Antworten: 5
    Letzter Beitrag: 28-10-16, 17:16
  5. IFS-Streamfile in RPG bearbeiten
    By Bleil in forum IBM i Hauptforum
    Antworten: 2
    Letzter Beitrag: 13-10-01, 21:15

Berechtigungen

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