Anmelden

View Full Version : SQL XML_CLOB_FILE CCSID



dabeda
02-03-18, 10:55
Hallo Forum!

Ich habe einige XMLs in einer Tabelle gespeichert, nun möchte ich diese wieder ins IFS schreiben, was auch funktioniert, jedoch steht im Header immer
?xml version="1.0" encoding="IBM850"
Da ich die Dokumente verschicken soll, hätte ich gerne UTF-8 da drinnen stehen.
Habe versucht die XML_CLOB_FILE Variable anders zu deklarieren, aber das ändert nichts.
In der QAQQINI steht auch *DEFAULT drinnen.

Wie bekomme ich utf-8 ins Dokument rein??

Danke!

LG Peter
[/COLOR]

Fuerchau
02-03-18, 11:11
SQL ändert nichts am Inhalt eines XML-Dokuments, da dies reine Textinformation ist.
Hier hilft nur, den Inhalt der XML erst mal in eine UCS2-Variable ins Programm einzulesen (CLOB), den gewünschten Text ändern und anschließend die Datei per CLOB_FILE-Variable dann zu schreiben.

dabeda
02-03-18, 11:40
Nicht am Inhalt, aber am Header. Im Typ XML in der Datenbank ist keine Headerinformation drinnen und wird beim Schreiben in eine Filevariable eingefügt. Ich lese das XML mit GET_XML_FILE() ein, der Header im IFS ist xml version="1.0" encoding="UTF-8", wenn ich es dann wieder rausschreibe, steht IBM850 anstelle von UTF-8 drinnen.

B.Hauser
02-03-18, 12:09
Wenn der Datentyp der Spalte in der Tabelle XML ist, und bei der Spalten-Definition keine CCSID angegeben wurde, wird die CCSID aus der QAQQINI verwendet, d.h. die Daten sind per Default UTF-8.

Wenn Du mit embedded SQL und XML_CLOB_FILE das Dokument ins IFS schreibst erfolgt die Ausgabe als UTF-8 Daten.

Sofern Deine XML-Daten alphanumerisch (EBCDIC) oder auch Double Byte z.B. UCS2 sind, kannst Du das XML-Dokument, mit XMLPARSE und XMLSERIALIZE in ein UTF-8 Daten konvertieren.
XMLPARSE prüft ob es sich um gültige XML-Daten handelt und konvertiert diese in ein internes Format.
XMLSERIALIZE konvertiert aus dem internen Format in einen alphanumerischen String.

Beispiel:


Values(XMLSerialize(
XMLParse(Document '<root><Fld1>ABCDE</Fld1><Fld2>Der Bär frißt öfter grüne Äpfel</Fld2></root>')
as VarChar(1024) ccsid 1208 including XMLDeclaration));

Including XMLDeclaration bewirkt an dieser Stelle nur, dass noch eine XML-Deklaration hinzugefügt wird. Wird es nicht angegeben, wird keine Deklaration hinzugefügt.

UCS2 ist übrigens ein Double Byte Character Set und verlangt folglich einen DBCLOB (Double Byte Large Object)!

Birgitta

Fuerchau
02-03-18, 13:09
Gute Erklärung, geht am Problem aber vorbei.
In der XML steht eine Encoding-Anweisung, z.B.:

?xml version="1.0" encoding="ISO-8859-1" ?

Bei der Ausgabe der XML-Datei ins IFS mit UTF8 soll genau diese Anweisung nun angepasst werden:

<!--?xml version="1.0" encoding="utf-8" ?-->?xml version="1.0" encoding="UTF-8" ?

Und genau dies passiert eben nicht, da SQL ja den textlichen Inhalt nicht verfälschen darf.
Wenn also eine Codewandlung durchgeführt wird, so ist die Process-Anweisung eben manuell (also per Code) selber durchzuführen.

dabeda
02-03-18, 13:59
Also wenn ich das Dokument mit xmlserialize und xmlparse in ein XML_CLOB_FILE zu schreiben versuche, sagt der Compiler, dass die Variable nicht kompatibel ist.
Mach ich
select xmlserialize(xmlparse(Document xml_document ....
Kommt Argument 1 der Funktion xmlparse ungültig.
Wenn ich
select xmlserialize(xmlparse(Document xmlserialize(xml_document as varchar(1024) ccsid 1208) from file
mache, dann steht wieder IBM850 im File.

Das original XML hat im Header UTF-8 stehen.

Ich möchte eigentlich nur das original XML wieder zurück. :(

Fuerchau
02-03-18, 15:33
"Ich möchte eigentlich nur das original XML wieder zurück."
Warum speicherst du dieses nicht einfach separat in einem BLOB?

dabeda
05-03-18, 08:04
Ok, ich hatte da beim Testen einen Fehler.
Es ist genauso wie Birgitta geschrieben hat und funktioniert jetzt.

Verzeihung...

Danke!