View Full Version : XML-String per SQL interpretieren
dschroeder
15-05-17, 17:19
Hallo,
die SQL-Möglichkeiten sind ja mit dem Release 7.3 erheblich erweitert worden. Deshalb dachte ich, es dürfte doch gar kein Problem sein, mit Hilfe von SQL einen XML-String zu interpretieren. Aber die Beispiele, die ich gefunden habe, sind alle sehr komplex. Geht das nicht irgendwie einfacher?
Wenn ich eine einfache XML-Struktur habe, also z.B.:
<zahlung>
<betrag>120.55</betrag>
<datum>15.05.2017</datum>
<zahlung>
Kann ich mir die Werte für betrag und datum nicht einfach mit einem SQL "select ... into" (oder wegen mir mit 2 getrennten SQL-Statements) auslesen? Ich würde der SQL-Funktion den String dann gerne als Host-Variable übergeben.
In den Beispielen sieht es immer so aus, als müsste der XML-String in einer Tabelle stehen und man müsste irgendwelche Headerinfos in der XML-Tabelle haben usw.
Ich weiß, dass ich das Problem auch mit RPG mittels xml-into lösen könnte. Das will ich hier aber nicht. Meine Frage geht in Richtung SQL.
Das musst Du schon mit der XMLTABLE Table-Funktion lösen.
Wo befindet sich denn Dein XML-Dokument?
Variable, XML-Spalte, IFS? Je nachdem musst Du beim passing unterschiedlich aufsetzten.
Sofern alle Informationen auf der gleichen Ebene sind, und Du mit dem xml-Namen zufrieden bist, könnte das SELECT-Statement etwa so aussehen.
SELECT *
From XMLTABLE('/zahlung/'
Passing XMLDOKUMENT
Columns "betrag" Dec(11, 2),
"datum" Date) x
Birgitta
Der XMLTABLE erwartet ein fertiges XML-Dokument, XMLPARSE liefert ein XML-Dokument.
XMLPARSE wiederum kann eine XML-Zeichenkette interpretieren.
Grob müsste also
select * from XMLTABLE(XMLPARSE('XML native Daten' ...) ...)
funktionieren.
dschroeder
16-05-17, 10:23
Vielen Dank für eure Antworten. Ich denke, wir sind da auf dem richtigen Weg. Aber ganz klappt es noch nicht. Ich habe mal folgende Varianten probiert: (Sorry, dass die so schlecht formatiert sind, aber seltsamerweise fehlt in meinem Browser-Editor das "Code Einfügen" Symbol).
SELECT *
From XMLTABLE('/zahlung/'
Passing xmlparse('<zahlung><betrag>123.45</betrag><datum>15.05.2016</datum></zahlung>')
Columns "betrag" Dec(11, 2),
"datum" Date) x
;
SELECT *
From XMLTABLE('/zahlung' passing xmlparse('<zahlung><betrag>123.45</betrag><datum>15.05.2016</datum></zahlung>')
Columns "betrag" Dec(11, 2),
"datum" Date) x
;
Ich werde versuchen, mich da weiter zu hangeln.
(Sorry, dass die so schlecht formatiert sind, aber seltsamerweise fehlt in meinem Browser-Editor das "Code Einfügen" Symbol).
Beim Antworten einfach auf ERWEITERT gehen, und schon steht es wieder zur Verfügung
Was soll "123.4515.05.2016" denn sein?
Das ist mit Sicherheit kein XML-String.
An dieser Stelle sollte dein obiger XML-Code stehen.
dschroeder
16-05-17, 11:03
Was soll "123.4515.05.2016" denn sein?
Das ist mit Sicherheit kein XML-String.
An dieser Stelle sollte dein obiger XML-Code stehen.
Sorry, da hat der Browser Editor beim Speichern mal wieder die spitzen Klammern weggenommen.
Ich versuche mal, den XML-String hier so so posten, dass er auch dargestellt wird:
SELECT * From XMLTABLE('/zahlung/' Passing xmlparse('<zahlung><betrag>123.45</betrag><datum>15.05.2016</datum></zahlung>') Columns "betrag" Dec(11, 2), "datum" Date) x;
SELECT * From XMLTABLE('/zahlung' passing xmlparse('<zahlung><betrag>123.45</betrag><datum>15.05.2016</datum></zahlung>') Columns "betrag" Dec(11, 2), "datum" Date) x;
SELECT * From XMLTABLE('/zahlung' passing
xmlparse(document
'<zahlung><betrag>Dein XML-String</betrag><datum></datum></zahlung>' strip whitespace)
Columns "betrag" char(20),
"datum" char(10)) x
So funktionierts schon mal vom Grundsatz. Die Feldtypen kannst du ja dann entsprechend ausprobieren da einiges von der Umgebung abhängt.
dschroeder
16-05-17, 11:51
SELECT * From XMLTABLE('/zahlung' passing
xmlparse(document
'<zahlung><betrag>Dein XML-String</betrag><datum></datum></zahlung>' strip whitespace)
Columns "betrag" char(20),
"datum" char(10)) x
So funktionierts schon mal vom Grundsatz. Die Feldtypen kannst du ja dann entsprechend ausprobieren da einiges von der Umgebung abhängt.
Klapp in der Tat!
Sehr gut.
Herzlichen Dank!