[NEWSboard IBMi Forum]

Hybrid View

  1. #1
    Registriert seit
    Mar 2011
    Beiträge
    94

    SQL HTTPPOSTCLOB in Verbindung mit XMLTABLE

    <trac sq="164"><esr d="2021-03-23T13:42:23" tn="900000041">Hallo,

    ich bekomme über ein SQL Webservice Anfrage (HTTPPOSTCLOB) eine Antwort als XML String. Den würde ich gerne in der selben Anfrage parsen und als Tabelle ausgeben. Geht das? Wenn ja wie stelle ich das an. <tag>
    Das ist die Antwort vom Webservice. Mit interessierung nur die mit TAG
    Code:
    <trac sq="164"> <result rc="OK">
      <usermessage>Summe falsch: 528.9</usermessage>
      <warning>w-#T_DIFF 8.50 PayA[].Amt-ESR.T</warning>
     </result>
     <esr d="2021-03-23T13:42:23" tn="900000041">
     <fis tid="16">
      <code>V0;7831130;Kassenbeleg-V1;Beleg^528.90_0.00_0.00_0.00_0.00^537.40:Bar;16;9;2021-03-23T12:42:23.000Z;2021-03-23T12:42:23.000Z;ecdsa-plain-SHA256;unixTime;O9q2KbD0LlUrsLPlXl8gv9hOXwB829VM7ILhr6e2rFFgyil5VP7IAupwVcuExDh0q1Gk5pBapdEUY19z42IXLeEVVbX18w==;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==</code>
      <tag label="TrNr:" value="16" name="FN">
      <tag label="Beg.:" value="2021-03-23 13:42:23" name="StartD">
      <tag label="Ende:" value="2021-03-23 13:42:23" name="FinishD">
      <tag label="TSE :" value="0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" name="Serial">
      <tag label="SigZ:" value="9" name="SignCnt">
      <tag label="Sign:" value="O9q2KbD0LlUrsLPlXl8gv9hOXwB829VM7ILhr6e2rFFgyil5VP7IAupwVcuExDh0q1Gk5pBapdEUY19z42IXLeEVVbX18w==" name="Sign">
     </tag></tag></tag></tag></tag></tag></fis>
    </esr></trac>

    Gruss Olaf</tag></esr></trac>

  2. #2
    Registriert seit
    Feb 2001
    Beiträge
    20.243
    Wer hat denn sowas verbrochen.
    Dein Problem ist, dass die tag-Einträge geschachtelt sind.
    Per SQL mit XPath musst du dann einen Union bauen, der alle tag-Elemente selektiert:

    /trac/esr/fis/tag
    /trac/esr/fis/tag/tag
    /trac/esr/fis/tag/tag/tag
    /trac/esr/fis/tag/tag/tag/tag
    /trac/esr/fis/tag/tag/tag/tag/tag
    /trac/esr/fis/tag/tag/tag/tag/tag/tag

    Was willst du machen, wenn mal mehr als 6 Stufen vorkommen?
    Besser wäre es, wenn jeder tag auch einen /tag hätte.
    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 2011
    Beiträge
    94
    Besser wäre es, wenn jeder tag auch einen /tag hätte.
    Ja das wäre besser. Aber der Webservice mach das halt so. Vorteil ist es ist immer die gleiche Anzahl . Wie lese ich aber die Attribute aus? Mit Path @Value ?

  4. #4
    Registriert seit
    Nov 2020
    Beiträge
    331
    Genau beim PATH '/trac/esr/fis/tag@value'.
    Wie genau das mit XMLTABLE gemacht wird, gibt es hier viele Beispiele.

    Tust mir aber leid, dass du mit so einer Struktur arbeiten musst.
    Ist so als ob man 10 Geschirrspüler kauft um 10 Teller zu waschen ... k.a. warum mir gerade dieses Beispiel einfällt :-)

    lg Andreas

  5. #5
    Registriert seit
    Feb 2001
    Beiträge
    20.243
    Nun, wenn die Teller so groß sind, dass nur einer rein passt aber alle gleichzeitig gereinigt werden müssen, hast du keine andere Chance. Oder du stellst eben 10 Leute ein und schickst sie den Rest des Tages in Kurzarbeit.
    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
    Mar 2011
    Beiträge
    94
    ist das dann so korrekt:

    SELECT *
    FROM XMLTABLE('/TraC'
    PASSING XMLPARSE(
    DOCUMENT mylib.xml_var
    )
    COLUMNS
    Fis varchar(256) PATH 'TraC/Fis/Tag/@SQ',
    Tag varchar(256) PATH 'TraC/Fis/Tag/@Label'
    ) AS RESULT;

  7. #7
    Registriert seit
    Feb 2001
    Beiträge
    20.243
    Wo ist denn @SQ versteckt;-)?
    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
    Mar 2011
    Beiträge
    94
    Ganz oben im XML.
    Das kann auch auch weg. Ich brauchen nur die TAG und davon das Label und Value.
    Das klappt auch. Was mir noch fehlt es der Union.
    Ich habe mir einen kleinen Test gebaut. Der funktioniert aber nur mit 1 Satz. Habe Problem den XML code ins Forum zustellen deswegen mit -

    create or replace variable mylib.xml_var varchar(10000) ccsid 1208;

    values mylib.xml_var;

    set mylib.xml_var =
    '-TraC>
    -Fis>
    -Tag Value="16" Label="122844488845"/>
    -Tag Value="20" Label="11122888845"/>
    -/Fis>
    -/TraC>'
    ';


    SELECT *
    FROM XMLTABLE('/TraC'
    PASSING XMLPARSE(
    DOCUMENT mylib.xml_var
    )
    COLUMNS
    Wert1 varchar(256) PATH '/TraC/Fis/Tag/@Label[1]'
    ,Wert2 varchar(256) PATH '/TraC/Fis/Tag/@Value[1]'
    ) AS RESULT
    ;


  9. #9
    Registriert seit
    Aug 2001
    Beiträge
    2.875
    Wofür brauchst Du denn einen Union?
    Welche Informationen willst Du denn auslesen?

    Das folgende Beispiel bringt Dir sq und die Label, Werte und Namen von allen 6 Leveln zurück

    Code:
    Select *
       From Xmltable('/trac' 
                     Passing Xmlparse(Document YourSchema.Gblxmlvar) 
                     Columns SQ VarChar(10)  Path '@sq',
                             Label1 VarChar(25)  Path './esr/fis/tag/@label', 
                             Value1 VarChar(125) Path './esr/fis/tag/@value',
                             Name1  VarChar(25)  Path './esr/fis/tag/@name',
                             Label2 VarChar(25)  Path './esr/fis/tag/tag/@label',
                             Value2 VarChar(125) Path './esr/fis/tag/tag/@value',
                             Name2  VarChar(25)  Path './esr/fis/tag/tag/@name',
                             Label3 VarChar(25)  Path './esr/fis/tag/tag/tag/@label', 
                             Value3 VarChar(125) Path './esr/fis/tag/tag/tag/@value',
                             Name3  VarChar(25)  Path './esr/fis/tag/tag/tag/@name',
                             Label4 VarChar(25)  Path './esr/fis/tag/tag/tag/tag/@label',
                             Value4 VarChar(125) Path './esr/fis/tag/tag/tag/tag/@value',
                             Name4  VarChar(25)  Path './esr/fis/tag/tag/tag/tag/@name',
                             Label5 VarChar(25)  Path './esr/fis/tag/tag/tag/tag/tag/@label', 
                             Value5 VarChar(125) Path './esr/fis/tag/tag/tag/tag/tag/@value',
                             Name5  VarChar(25)  Path './esr/fis/tag/tag/tag/tag/tag/@name',
                             Label6 VarChar(25)  Path './esr/fis/tag/tag/tag/tag/tag/tag/@label',
                             Value6 VarChar(125) Path './esr/fis/tag/tag/tag/tag/tag/tag/@value',
                             Name6  VarChar(25)  Path './esr/fis/tag/tag/tag/tag/tag/tag/@name')
                     As Result;
    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

  10. #10
    Registriert seit
    Feb 2001
    Beiträge
    20.243
    Den Union benötige ich dann, wenn ich die Werte zeilenweise verarbeiten will.
    Von den Zeiten der Pseudoarrays (sprich Denormalisierung) sind wir doch eigentlich schon weg;-).

    Allerdings könnte man nun deinen SQL mit dem hier schon mal veröffentlichten

    select ...
    cross join lateral (
    ) as tabelle(...)

    ergänzen um doch wieder Zeilenzu bekommen.
    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

  11. #11
    Registriert seit
    Mar 2011
    Beiträge
    94
    Ich habe das Bsp. mal etwas vereinfacht. Mit nur einem TAG funktioniert es. Bei zwei TAG gib es eine Fehlermeldung aus der ich aber nicht schlau werden.

    Click image for larger version. 

Name:	24.03.png 
Views:	9 
Size:	60,7 KB 
ID:	602


    Code:
    create or replace variable mylib.xml_var varchar(10000) ccsid 1208;
    
    
    values mylib.xml_var;
    
    
    set mylib.xml_var =
    '#TraC>    #Fis>
           #Tag Label="Label1" Value="16" Name="FN"/> 
             #/Fis>
    #/TraC>
    ';
    
    
    SELECT *
       FROM XMLTABLE('/TraC' 
          PASSING XMLPARSE(
             DOCUMENT mylib.xml_var
          ) 
             COLUMNS
                            Label1 varchar(256) PATH './Fis/Tag/@Label'
                           ,Value1 varchar(256) PATH './Fis/Tag/@Value'  
                           ,Name1  varchar(256) PATH './Fis/Tag/@Name'   
                           ,Label2 varchar(256) PATH './Fis/Tag/Tag/@Label'
                           ,Value2 varchar(256) PATH './Fis/Tag/Tag/@Value'  
                           ,Name2  varchar(256) PATH './Fis/Tag/Tag/@Name'                        
       ) AS RESULT;
    
    
    
    
    select mylib.xml_var from sysibm.sysdummy1

Similar Threads

  1. SQL HTTPPOSTCLOB SQLSTATE 38000 - HTTPP0013 Vorzeitiges Dateiende???
    By oulbrich in forum NEWSboard Programmierung
    Antworten: 3
    Letzter Beitrag: 22-03-21, 13:37
  2. XML einlesen mit XMLTABLE: übergeordnete Werte zu Gruppen hinzufügen.
    By dholtmann in forum NEWSboard Programmierung
    Antworten: 4
    Letzter Beitrag: 30-03-18, 13:15
  3. AS/400 Verbindung
    By WoessnerA in forum IBM i Hauptforum
    Antworten: 1
    Letzter Beitrag: 09-03-03, 15:15
  4. SNA Verbindung
    By PS in forum IBM i Hauptforum
    Antworten: 1
    Letzter Beitrag: 12-10-01, 10:16
  5. PPP Verbindung PC AS/400
    By K_Tippi in forum IBM i Hauptforum
    Antworten: 1
    Letzter Beitrag: 20-02-01, 13:58

Berechtigungen

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