PDA

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.

B.Hauser
16-05-17, 07:53
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

Fuerchau
16-05-17, 08:56
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.

malzusrex
16-05-17, 10:38
(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

Fuerchau
16-05-17, 10:53
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;

Fuerchau
16-05-17, 11:42
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!