PDA

View Full Version : DB2 xml-file läßt sich nicht im IFS speichern



msost
10-03-17, 12:59
Hallo zusammen,

ich habe per SQL eine XML-Datei erstellt. Normaler Create Table mit diversen SQL-XML-Anweisungen, Zeile als Clob ausgegeben. Läßt sich normal handhaben. Allerdings bekomme ich sie nicht ins IFS gespeichert.

CPYTOIMPF z.B. findet das Member nicht (ist aber beim DSPFD da), FTP tut's auch nicht.

Woran kann das liegen?

Fuerchau
10-03-17, 13:08
Was willst du mit CPYTOIMPF erreichen?
Eine XML in eine Datei schreiben?
Dann solltest du deinen 1 SQL so ändern, dass der Umweg über IFS entfällt.

insert into .... select .....

msost
10-03-17, 13:37
Das Ergebnis soll auf der AS/400 zur Verfügung stehen und auf einer anderen Anwendung die mit AS/400 nichts zu tun hat. Da wir mehrere Environments (Bibliotheken) und Maschinen haben, war es für mich easy das SQL in jedem Environment laufen zu lassen. Die XML-Daten stehen dann in der Datei. Ich muß sie nur für die andere Anwendung ins IFS stellen.

Fuerchau
10-03-17, 14:05
Nachfrage:
"Die XML-Daten stehen dann in der Datei:"
Ich nehme an, du meinst die XML-Daten stehen in der PF in einem entsprechend großen Feld (CLOB)?
Es könnte sein, dass CLOB von CPYTOIMPF gar nicht unterstützt wird!

Also:
Welche Fehlermeldung gibt es genau?
Kannst du den embedded SQL nicht einfach wiederholen, diesmal als Ziel in eine CLOB_FILE-Variable?

msost
10-03-17, 14:34
Zur Nachfrage:
Ich glaube da liegst Du richtig. Hab rumprobiert, und lande jetzt bei folgendem Fehler:
" CPF428A - open of Member xxxx File xxx in xxx failed. Reason Code 1: File conains one or more large object fields..."

Hab jetzt zuletzt übrigens den CPY-Befehl genommen.

Das ist kein embedded SQL, sondern ein SQL Statement das im IFS abgelegt wird (ruf ich einfach per RUNSQLSTM).
Der Aufbau ist grob:

CREATE TABLE
SELECT
XMLSERIALIZE(
XMLROW(...) as CLOB(2G) )
as XMLDOCUMENT

FROM...
) with Data

Was würdest Du anders machen?

B.Hauser
10-03-17, 14:36
Verstehe ich das richtig?
Erstellst eine Tabelle mit einer XML-Spalte, in die Du dann über einen Insert das XML-Statement schreibst.
Im Anschluss willst Du diese Tabelle bzw. das XML-Dokument im IFS speichern?

Wenn das Deine Idee ist, warum der Umweg über eine Tabelle und warum nicht direkt ins IFS schreiben. Mit (embedded) SQL ist das ein 3-Zeiler. Das komplizierteste ist das SQL-Statment zu generieren.

In dem folgenden Beispiel wird ein XML-Dokument generiert und direkt ins IFS geschrieben.

DCL-S MyXMLDoc SQLType(XML_CLOB_File);

Exec SQL Set Option Commit=*None, DatFmt=*ISO, TimFmt=*ISO,
Naming=*SYS, CloSQLCsr=*EndActGrp;
//************************************************** **************************
Clear MyXMLDoc;

MyXMLDoc_Name = '/home/YourDir/YourXML.xml';
MyXMLDoc_NL = %Len(%Trim(MyXMLDoc_Name));
MyXMLDoc_FO = SQFOVR; //Neue IFS Datei oder vorh. ersetzen

Exec SQL
Select XmlDocument
(xmlgroup(EmployeeNo as "PersNo",
Trim(Trim (FirstName) concat ' ' concat
Trim(Name)) as "PersName",
Address as "Street",
ZipCode as "ZipCode",
City as "City"
Order By City Desc, Name
Option Row "Employee"
Root "Staff"))
into :MyXMLDoc
From LobStaff;

If SQLCODE < *Zeros;
Dsply 'Fehler';
else;
Dsply 'XML Document erstellt';
EndIf;

*InLR = *On;

msost
10-03-17, 15:01
Es gibt nur dieses eine SQL Statement, welches den Select in XML-Formatierung in ein CLOB-Feld stellt und daraus eine Tabelle schreibt.
Mit den Daten kann ich dann die AS/400 basierte Anwendung schon mal füttern, soweit so gut.
Da ich aber die gleichen Daten auch noch für eine andere Anwendung brauche, dachte ich: Datei kopieren und ab dafür.

Aber die Large-Object Felder wie CLOB und BLOB scheinen bei CPYTOIMPF & Co Probleme zu verursachen. Auch QSH (cp Command) streikt.

Dein Ansatz, per embedded RPG gleich ins IFS zu schreiben ist natürlich naheliegend. Werd ich dann auch so machen.

Aber irgendwie dann doch befremdlich, das offensichtlich keiner der "out-of-the-box"-Kopierbefehle damit klarkommt. Es sei denn Dir fällt noch einer ein?

Ansonsten erstmal: Schönes Wochenende und danke!

Fuerchau
10-03-17, 15:10
@Birgitta
Nun, vielleicht weil er geschrieben hat, dass er beides braucht?
Und ich ihm bereits gesagt habe, dass er dann beides per SQL machen soll?

@MSOST

D myfile SQLTYPE(CLOB_FILE) CCSID(1208)
myfile_name = '/Pfad/Name.xml'; // StreamFile
myfile_nl = %len(%trim(myfile_name)); // NameLength
myfile_fo = SQFOVR; // FileOverwrite

SELECT
into : myfile
XMLSERIALIZE(
XMLROW(...) as CLOB(2G) )
as XMLDOCUMENT

FROM...

Ich finde das schon einfach genug.

msost
10-03-17, 15:18
Ich kenn zwar Birgitta's Frage nicht, aber: Jupp, ich dachte ans kopieren weil ich beides brauche. Und bei gut 150 Environments stellt sich schon mal die Frage ob ein einfaches Kopieren nicht schneller geht als 150x den SQL zweimal laufen zu lassen... ;)

Vielleicht geh ich das am Montag einfach andersrum an: Den SQL ins IFS schreiben lassen, und dem Import auf der AS/400 dann einfach beibringen aus dem IFS zu lesen.

Erstmal: Schönes WE!

B.Hauser
10-03-17, 15:41
D myfile SQLTYPE(CLOB_FILE) CCSID(1208)


XMÖ sollte in eine XML_CLOB_FILE ausgegeben werden, CCSID lässt sich bei CLOB_FILEs nicht so einfach setzen, bzw. wird ignoriert.

XML_CLOB_FILEs werden per Default in UTF-8 erstellt, bzw. die Daten in UTF-8 konvertiert.

Birgitta