dey: SQL export into XML (Oracle)

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

--
-- bydey ist die Signatur und Verabschiedung, nicht der Nick --
-- Navigate all your PHP web projects with  PHP Project Browser--
  1. 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

    --
    -- bydey ist die Signatur und Verabschiedung, nicht der Nick --
    -- Navigate all your PHP web projects with  PHP Project Browser--
    1. 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

    2. 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

      --
      si vis pacem, para iustitiam
      1. 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

        --
        -- bydey ist die Signatur und Verabschiedung, nicht der Nick --
        -- Navigate all your PHP web projects with  PHP Project Browser--