-
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>
-
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.
-
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 ?
-
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
-
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.
-
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;
-
Wo ist denn @SQ versteckt;-)?
-
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
;
-
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
-
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.
-
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.
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
-
By oulbrich in forum NEWSboard Programmierung
Antworten: 3
Letzter Beitrag: 22-03-21, 13:37
-
By dholtmann in forum NEWSboard Programmierung
Antworten: 4
Letzter Beitrag: 30-03-18, 13:15
-
By WoessnerA in forum IBM i Hauptforum
Antworten: 1
Letzter Beitrag: 09-03-03, 15:15
-
By PS in forum IBM i Hauptforum
Antworten: 1
Letzter Beitrag: 12-10-01, 10:16
-
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
-
Foren-Regeln
|
Erweiterte Foren Suche
Google Foren Suche
Forum & Artikel Update eMail
AS/400 / IBM i
Server Expert Gruppen
Unternehmens IT
|
Kategorien online Artikel
- Big Data, Analytics, BI, MIS
- Cloud, Social Media, Devices
- DMS, Archivierung, Druck
- ERP + Add-ons, Business Software
- Hochverfügbarkeit
- Human Resources, Personal
- IBM Announcements
- IT-Karikaturen
- Leitartikel
- Load`n`go
- Messen, Veranstaltungen
- NEWSolutions Dossiers
- Programmierung
- Security
- Software Development + Change Mgmt.
- Solutions & Provider
- Speicher – Storage
- Strategische Berichte
- Systemmanagement
- Tools, Hot-Tips
Auf dem Laufenden bleiben
|
Bookmarks