[NEWSboard IBMi Forum]
Seite 1 von 2 1 2 Letzte

Hybrid View

  1. #1
    Registriert seit
    Aug 2014
    Beiträge
    179
    Hallo Rischer,

    ich hab mit den Arrays etwas rumprobiert:

    PHP-Code:

    Kundendaten im 
    Array:

    select                                                
     value from tsto
    .wrkjson,                                  
     
    table(systools.json_table(json_info,'kunde','s:32')) as x

    Kunden
    -Ids im Array:

    select                                                
     value from tsto
    .wrkjson,                                  
     
    table(systools.json_table(json_info,'kunde.id','i')) as 
    Quelle: http://www.volubis.fr/news/liens/courshtm/XML/JSON.HTM

    Herzliche Grüße

    Rainer

  2. #2
    Registriert seit
    Sep 2015
    Beiträge
    18
    Zitat Zitat von Rainer Ross Beitrag anzeigen
    Hallo Rischer,

    ich hab mit den Arrays etwas rumprobiert:

    PHP-Code:

    Kundendaten im 
    Array:

    select                                                
     value from tsto
    .wrkjson,                                  
     
    table(systools.json_table(json_info,'kunde','s:32')) as x

    Kunden
    -Ids im Array:

    select                                                
     value from tsto
    .wrkjson,                                  
     
    table(systools.json_table(json_info,'kunde.id','i')) as 
    Quelle: http://www.volubis.fr/news/liens/courshtm/XML/JSON.HTM

    Herzliche Grüße

    Rainer
    Interessant, will aber bei mir nicht funken.

    Ich habe ein JSON-Array in meiner Datenbank das so aussieht:

    PHP-Code:
    {
    "displayinformation": {"detail": [{"name":"ZZESCD","contentdecimal":null,"contentstring":"""type":"string""colour":"GRN""visible"true"protected"false"underlined"false"highlighted"false"haserror"false"desciption"false},{"name":"ZZIITX","contentdecimal":null,"contentstring":"ÄNDERN""type":"string""colour":"GRN""visible"true"protected"false"underlined"false"highlighted"false"haserror"false"desciption"false},{"name":"Z1ZXSB","contentdecimal":null,"contentstring":"""type":"string""colour":"GRN""visible"true"protected"false"underlined"false"highlighted"false"haserror"false"desciption"false}]}} 
    Setze ich ein Select darauf ab a la:

    select
    value from tsto.wrkjson,
    table(systools.json_table(json_info,'displayinform ation.detail','s:32')) as x

    bekomme ich kein Ergebnis angezeigt (aber auch keinen Fehler).

    Mache ich es so:

    select
    cast(data1.value as varchar(20) ccsid 1141) as name,
    from
    tsto.wrkjson j, table
    (systools.json_table(j.JSON_INFO,'displayinformati on.detail.name','s
    :20')) data1

    Dann bekomme ich x (Anzahl der Elemente im Array) Records mit dem Inhalt von Name.
    Ohne Cast geht es bei mir übrigends nicht (obwohl ich CCSID 1141 im Job habe), sonst bekomme ich kryptische Zeichen angezeigt.

    Was ich bräuchte wäre die dynamische Auslesung aller Inhalte eines Array-elements also name, string, colour etc. auf einmal. Das hab ich noch nicht geschafft.....

  3. #3
    Registriert seit
    Sep 2015
    Beiträge
    18
    Zitat Zitat von rischer Beitrag anzeigen
    Interessant, will aber bei mir nicht funken.

    Ich habe ein JSON-Array in meiner Datenbank das so aussieht:

    PHP-Code:
    {
    "displayinformation": {"detail": [{"name":"ZZESCD","contentdecimal":null,"contentstring":"""type":"string""colour":"GRN""visible"true"protected"false"underlined"false"highlighted"false"haserror"false"desciption"false},{"name":"ZZIITX","contentdecimal":null,"contentstring":"ÄNDERN""type":"string""colour":"GRN""visible"true"protected"false"underlined"false"highlighted"false"haserror"false"desciption"false},{"name":"Z1ZXSB","contentdecimal":null,"contentstring":"""type":"string""colour":"GRN""visible"true"protected"false"underlined"false"highlighted"false"haserror"false"desciption"false}]}} 
    Setze ich ein Select darauf ab a la:

    select
    value from tsto.wrkjson,
    table(systools.json_table(json_info,'displayinform ation.detail','s:32')) as x

    bekomme ich kein Ergebnis angezeigt (aber auch keinen Fehler).

    Mache ich es so:

    select
    cast(data1.value as varchar(20) ccsid 1141) as name,
    from
    tsto.wrkjson j, table
    (systools.json_table(j.JSON_INFO,'displayinformati on.detail.name','s
    :20')) data1

    Dann bekomme ich x (Anzahl der Elemente im Array) Records mit dem Inhalt von Name.
    Ohne Cast geht es bei mir übrigends nicht (obwohl ich CCSID 1141 im Job habe), sonst bekomme ich kryptische Zeichen angezeigt.

    Was ich bräuchte wäre die dynamische Auslesung aller Inhalte eines Array-elements also name, string, colour etc. auf einmal. Das hab ich noch nicht geschafft.....
    So funkts zumindest jetzt bei mir zufriedenstellend:

    select
    cast(value as varchar(200) ccsid 1141) from tsto.wrkjsopn,
    table(systools.json_table(json_info,'displayinform ation.detail',
    's:200')) as x

    das ist so halbwegs zufriedenstellend aber folgendes ist besser:

    select
    substr(JSON_VAL(x.value,'name','s:10'), 1, 10) as Name,
    substr(JSON_VAL(x.value,'type','s:5'), 1, 7) as Typ,
    substr(JSON_VAL(x.value,'colour','s:3'), 1, 3) as Colour
    from tsto.wrkjson,
    table(systools.json_table_binary
    (json_info,'displayinformation.detail',
    's:200')) as x

    Wobei das 's:200' die maximale Grösse eines Elements im Array abdecken muß, sonst gehts wieder nicht... ob dann aber aus diesem Element auch andere Datentypen extrahieren kann wird sich weisen...

  4. #4
    Registriert seit
    Feb 2001
    Beiträge
    20.254
    Ich denke mal, das Ergebnis kommt wieder als UTF-8 an (das sind ASCII-Zeichen).
    Für die Lesbarkeit am Terminal brauchst du natürlich EBCDIC, daher der Cast.
    Eine Weitergabe als Webservice o.ä. benötigt natürlich keine weitere Umwandlung da dort ja meist UTF-8 ausgegeben werden 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

  5. #5
    Registriert seit
    Sep 2015
    Beiträge
    18
    Danke an alle die mich mit hilfreichen Tipps unterstützt haben.
    Funkt alles zur Zeit bestens wie gewollt.

    Eine Frage hätt ich dann doch noch ;-):
    Ich bekomme vom Webservice über das Api QtmhRdStin ja den Browserstream (as JSON) in mein ILERPG rein, übersetze diesen von 1208 nach 1141 und speichere diesen via embedded SQL in meiner JSON-Datenbank via SYSTOOLS.JSON2BSON .
    Der QtmhRdStin-In-Stream kann mit einer beliebig grossen Variable definiert werden, jedoch das Embedded SQL erlaubt nur eine Host-Variable bis zu einer Höhe von ca. 32700.
    Was, wenn über den Browser mal mehr als 32700 Zeichen reinflattern - hat jemand dafür bereits eine Lösung oder eine Idee?

    Danke im Voraus!

  6. #6
    Registriert seit
    Feb 2001
    Beiträge
    20.254
    Dafür musst du mal das Thema LOB's in ILERPG nachlesen.
    Im SNGLVL-Storage kann eine Variable 16MB groß sein, im Teraspace eben auch 1 Terabyte (bis die Kiste runterfährt).
    Das Stichwort hier ist ggf. auch Lob-Locator, da normale BLOB's und CLOB's auch 32K nicht übersteigen dürfen.
    Ich denke, Birgitta sollte hier aushelfen können.
    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

  7. #7
    Registriert seit
    Feb 2001
    Beiträge
    20.254
    V7R1 ist da schon wieder besser:
    http://www-01.ibm.com/support/knowle...st.htm?lang=de

    Du kannst Variablen auch dynamisch per Pointer bearbeiten und anlegen, siehe hierzu %alloc(), %dealloc() um nicht permanent den maximal möglichen Speicher vorzuhalten.
    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

  8. #8
    Registriert seit
    Feb 2001
    Beiträge
    20.254
    Und hier gibt's auch ein paar Beispiele:
    http://www.ibmsystemsmag.com/ibmi/de...CLOBs-and-RPG/
    Vom Datum her kann man mal sehen wie lange es das schon gibt.
    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

  9. #9
    Registriert seit
    Aug 2014
    Beiträge
    179
    Das API QtmhRdStin hat folgende Parameter

    PHP-Code:
    dcl-pr readstdin    extproc('QtmhRdStin'); 
            
    tmhdata     pointer        value;  
            
    tmhdatlen   int(10)        const;  
            
    tmhavail    int(10)        const;  
            
    tmerror     like(d#apierr) const;  
    end-pr
    Die Länge der Daten ist int(10), damit können sie bis max 2.147.483.647 Byte gross sein. Ich benutze das API, um z.B. PDF's auf den Server hochzuladen.

    Ein CLOB oder BLOB-Feld kann maximal 16MB gross sein. Das sollte auch ausreichen.
    Wie Fürchau schon richtig gesagt hat, kannst Du über Locator arbeiten, oder es wie folgt definieren

    PHP-Code:
    dcl-s   s#file      sqltype(CLOB_FILE);    
    dcl-s   s#clob      sqltype(CLOB:16000000);
    dcl-s   s#loc       sqltype(CLOB_Locator); 
    Viele Grüße

    Rainer

  10. #10
    Registriert seit
    Aug 2001
    Beiträge
    2.877
    LOB-Variablen (z.B. SQLTYPE(CLOB: 10000000) können nur bis 16MB definiert werden.
    LOB Locators (z.B. SQLTYPE(CLOB) sind (versteckte) Pointer die auf ein bis 2 GB großes LOB zeigen.
    Auf LOB-Locators kann mit native RPG-OpCodes und Built-In-Functions nicht zugegriffen werden, aber mit embedded SQL können LOB-Locators mit SQL-Funktionen wie alphanumerische Felder behandelt werden, z.B. können LOBs mit LOCATE durchsucht, oder Teile mit SUBSTR herausgebrochen werden. Die Verarbeitung von LOB Locators muss unter Commitment Control erfolgen, da der Locator wieder freigegeben werden muss. Die Freigabe erfolgt über COMMIT / ROLLBACK oder FREE Locator.
    File-Referenz-Variablen (z.B. SQLTYPE(CLOB_FILE)) sind wie Locators versteckte Pointer, die jedoch auf eine Datei im IFS oder eine Teil-Datei zeigen. Auf diese File-Referenz-Variablen kann man mit SQL-Funktionen wie auf alphanumerische Felder zugreifen. Im Gegensatz zu den Locators muss die Verarbeitung von File-Referenz-Variablen nicht zwangsläufig unter COMMIT erfolgen.

    Birgitta
    Eine Anmerkung noch: Wenn mit LOB-Locators gearbeitet wird, muss die Verarbeitung unter Commitment Control erfolgen.
    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

  11. #11
    Registriert seit
    Sep 2015
    Beiträge
    18
    Zitat Zitat von Rainer Ross Beitrag anzeigen
    Das API QtmhRdStin hat folgende Parameter

    PHP-Code:
    dcl-pr readstdin    extproc('QtmhRdStin'); 
            
    tmhdata     pointer        value;  
            
    tmhdatlen   int(10)        const;  
            
    tmhavail    int(10)        const;  
            
    tmerror     like(d#apierr) const;  
    end-pr
    Die Länge der Daten ist int(10), damit können sie bis max 2.147.483.647 Byte gross sein. Ich benutze das API, um z.B. PDF's auf den Server hochzuladen.

    Ein CLOB oder BLOB-Feld kann maximal 16MB gross sein. Das sollte auch ausreichen.
    Wie Fürchau schon richtig gesagt hat, kannst Du über Locator arbeiten, oder es wie folgt definieren

    PHP-Code:
    dcl-s   s#file      sqltype(CLOB_FILE);    
    dcl-s   s#clob      sqltype(CLOB:16000000);
    dcl-s   s#loc       sqltype(CLOB_Locator); 
    Viele Grüße

    Rainer
    Ich habe ja kein Problem mit QtmhRdStin (das ich seit Jahren verwende) sondern mit der Tatsache, daß ich den von QtmhRdStin erhaltenen alpanumerischen String via embedded SQL in meiner Datenbank speichern will. Und da ist bei standard-embedded bei ca. 32700 Zeichen schluß.

  12. #12
    Registriert seit
    Feb 2001
    Beiträge
    20.254
    Wie du oben siehst, ist das bei SQLTYPE(CLOB:16000000) oder SQLTYPE(BLOB:16000000) nicht der Fall.
    Es wird eine Struktur erstellt, in der du deine Daten und Länge abgeben kannst und als CLOB/BLOB an SQL geben oder von SQL lesen kannst.

    Alternativ eben LOBLOCATOR die dann per SUBSTR o.ä. angesprochen werden können.
    Dann kannst du eben 2GB per SQL-"set " und SUBSTR die Teilstrings aneinander ketten oder auslesen.
    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

Similar Threads

  1. REST Webservices / Verwendung von SYSTOOLS
    By dschroeder in forum NEWSboard Programmierung
    Antworten: 25
    Letzter Beitrag: 14-02-18, 11:11

Tags for this Thread

Berechtigungen

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