SQL export into XML (Oracle)
dey
- datenbank
Hallo,
ich versuche einen Export aus einer Oracle Datenbank in eine XML-Text-Datei hinzubekommen. Dabei plagen mich 2 - 3 Probleme.
1. Zeilenlänge
Ich bekomme trotz set long 180 (ergo >80) keine Zeile länger als 80 Zeichen hin. Es scheint irgendwie am CMD-Fenster von MS zu liegen. Behalte ich dieses Fenster sichtbar (ohne exit;) sehe ich die gleiche Darstellung, wie in der XML-Datei.
Lasse ich mir xmlelement.... allerdings im SQL+ zeigen sind die Zeilen vollständig.
2. Tabellenname
Im moment kann ich nur Zeilen darstellen aber kein XML Rahmenkonstrukt.
Ich will die XML weiterverarbeiten mit <xsl:value-of select="document(
... Die Angabe der XML version scheint hierbei nicht notwendig zu sein; könnte ich also darauf verzichten.
Aber ein, die Zeilen umgebendes Wurzelelement scheint notwedig zu sein:
<tabelle>
<zeile>...</zeile>
<zeile>...</zeile>
</tabelle>
Wie bekomme ich das hin?
3. Mehrere Tabellen auslesen
Ich würde gerne 3 Tabellen in eine XML zusammenfassen. Scheint mir zum Weiterverarbeiten einfacher.
Mit diesen Codeschnipseln probiere ich gerade rum:
set heading off
set long 180
--set feedback off
set trimspool on
connect xxxx/xxxx@db
spool T_DID.xml
select xmlelement("T_DID",xmlattributes(DIDDID,DIDBAR,DIDQTY,DIDLOQ,DIDVND,DIDLOT,DIDDTE,DIDLOC)) from T_DID;
select xmlelement("T_DID",xmlattributes(DIDDID),xmlforest(DIDBAR,DIDQTY)) from T_DID;
--set echo on
--set echo off
spool off
-- exit;
bydey
Hallo,
mit viel Recherche und gefrickel habe ich eine Lösung gefunden. Wie häufig bei mir der Fall bin ich mir zwar nicht sicher, ob der Stil sauber ist aber es funktioniert bei ersten Tests.
set heading off
set long 180
set linesize 180
set trimspool on
connect xxx/xxx@xxdb
spool test.xml
REPHEADER left "<?xml version='1.0'?>" skip left "<DB>" skip left "<Table1>"
REPFOOTER left "</Table1>"
select xmlelement("rows",xmlforest(col1,col2,col3,col4)) from table1;
REPHEADER left "<Table2>"
REPFOOTER left "</Table2>" skip left "</DB>"
select xmlelement("rows",xmlforest(col1,col2,col3)) from table2;
spool off
exit;
Heraus kommt eine XML-Datei mit zwei Tabellen.
<?xml version='1.0'?>
<DB>
<Table1>
<rows><col1>wert1</col1><col2>wert1</col2><col3>wert1</col3><col4>wert1</col4></rows>
<rows><col1>wert2</col1><col2>wert2</col2><col3>wert2</col3><col4>wert2</col4></rows>
</Table1>
<Table2>
<rows><col1>wert1</col1><col2>wert1</col2><col3>wert1</col3></rows>
</Table2>
</DB>
Ich hatte wirklich Probleme etwas zu googeln was auch nur halbwegs alle meine Fragen beantwortet: ca. 10 Abfragen mit unterschiedliche Suchbegriffen gestartet, ca. 50 Seiten geöffnet und aus ca. 8 - 10 sinnvollen Treffern die Lösung gebastelt.
Da Einträge hier im Forum bei Google immer sehr gut gelistet werden werde ich versuchen hier noch ein paar hilfreiche Schlagwörter für Google zu listen.
Oracle sql export spool in into xml write output text ausgeben mehrere Tabellen valide
bydey
Hallo!
Auch wenn ich zu Deinem Problem leider nichts beitragen konnte (ich hatte es gelesen, aber ich kenne mich mit den Oracle-XML-Features leider nicht aus), möchte ich mich für Deine Mühe, dass Du hier noch ein Posting für andere mit ähnlichen Problemen verfasst, bedanken.
Viele Grüße,
Christian
Hallo,
du scheinst die Antwort schon gefunden zu haben, trotzdem möchte ich das entsprechende Oracleforum erwähnen
XML-DB
Bisher musste ich dort noch keine Frage stellen, es gab für alles schon eine Antwort im Archiv ;-)
Grüße
Marcus
Hallo Marcus,
du scheinst die Antwort schon gefunden zu haben, trotzdem möchte ich das entsprechende Oracleforum erwähnen
XML-DB
Danke für den Link. So etwas hatte ich gesucht. Allerdings ist da eine Anfrage vom 3. Nov, die meinem Problem sehr ähnlich und nicht eine Antwort hat. Ich denke, dass ist ein Forum mit Spezialisten, wie XML in Oracle abgelegt werden kann.
@Christian
War mir eine Freude und Selbstverständlichkeit. Das Selfforum hat mir so oft weitergeholfen (sowohl der aktive Part als auch das Archiv), dass ich gerne meinen Beitrag leiste.
Ich habe noch ein zusätzliches Problem gelöst, welches ich so auch nicht googlen konnte. Einen Zeitstempel innerhlb der XML ausgeben, um
a) die Aktualität des Exports anzugeben und
b) die zeitliche Belastung der DB auszuwerten
set heading off
set long 180
set linesize 180
set trimspool on
connect xxx/xxx@xxdb
COLUMN start_time new_val start_tag
SELECT '<start_time>'||TO_CHAR(SYSDATE,'YYYYMMDDHH24MISS')||'</start_time>' start_time from dual;
spool test.xml
REPHEADER left "<?xml version='1.0'?>" skip left "<DB>" skip left "<Table1>"
REPFOOTER left "</Table1>"
select xmlelement("rows",xmlforest(col1,col2,col3,col4)) from table1;
REPHEADER left "<Table2>"
REPFOOTER left "</Table2>"
select xmlelement("rows",xmlforest(col1,col2,col3)) from table2;
prompt &start_tag
REPHEADER left "<end_time>"
REPFOOTER left "</end_time>" skip left "</DB>"
COLUMN end_time new_val todaysdate
SELECT TO_CHAR(SYSDATE,'YYYYMMDDHH24MISS') end_time from dual;
spool off
exit;
Heraus kommt eine XML-Datei mit zwei Tabellen.
<?xml version='1.0'?>
<DB>
<Table1>
<rows><col1>wert1</col1><col2>wert1</col2><col3>wert1</col3><col4>wert1</col4></rows>
<rows><col1>wert2</col1><col2>wert2</col2><col3>wert2</col3><col4>wert2</col4></rows>
</Table1>
<Table2>
<rows><col1>wert1</col1><col2>wert1</col2><col3>wert1</col3></rows>
</Table2>
<start_time>20081104180551</start_time>
<end_time>
20081104180551
</end_time>
</DB>
Google Suchwöter: Oracle sql export spool in into xml write output text ausgeben mehrere Tabellen valide time stamp Zeitstempel variable zeitvergleich
bydey