Announcement

Collapse
No announcement yet.

oracle to xml to harddisk

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • oracle to xml to harddisk

    Hallo zusammen!

    Wieder eine Frage :-)

    Folgendes habe ich gemacht:
    Code:
    Procedure Create_XML is
      
      cXmlFile clob;
      
      Begin
      
        select 
         xmlserialize
         (
          content
           xmlelement
           (
            "XML_Upload",
              xmlelement
              (
               "head_node",
                 xmlelement
                 (
                 "adresse",
                   xmlelement("stadt", 'Köln'),
                   xmlelement("strasse", 'Domstrasse'),
                  ),
                             
                 xmlelement
                 (
                 "person",       
                   xmlelement("name", 'schmitz'),
                   xmlelement("vorname", 'theo')
                  ),
                  
                   xmlelement
                 (
                 "person",       
                   xmlelement("name", 'nagel'),
                   xmlelement("vorname", 'lena')
                  )
               )
            )
           
           indent
          ) 
         as xml
         into cXmlFile
         from ADRESSEN
         where DATE = (SELECT   MAX (DATE) FROM ADRESSEN)
        ;
    Frage: Wie kann eine fertigerstellte XML Datei, die ja in der Variable cXmlFile vorliegt, auf die Festplatte geschrieben werden? Finde nicht den passenden Befehl dafür.

    Vielen Dank im Voraus!

  • #2
    Das SELECT funktioniert so nicht (Leerzeilen, Komma zuviel) und
    Code:
     xmlelement("strasse", 'Domstrasse'),
                  ),
    macht für mich keinen Sinn, da nicht auf die Tabelle ADRESSEN referenziert wird, das Ergebnis von XMLSERIALIZE ist kein XML (erst recht keine XML Datei), sondern String oder LOB (hier CLOB)

    Vermutlich ist das Problem:
    Wie schreibe ich eine CLOB-Variable in eine OS-Datei, hier der Kern:
    Code:
     -- ----------------
        -- GET CLOB LOCATOR
        -- ----------------
        SELECT xml_file INTO clob_loc
        FROM   test_clob
        WHERE  id = 0;
    
    
        -- --------------------------------
        -- OPEN NEW XML FILE IN WRITE MODE
        -- --------------------------------
        file_handle := UTL_FILE.FOPEN(
            location     => dir_name,
            filename     => new_xml_filename,
            open_mode    => 'w',
            max_linesize => buffer_size);
    
        amount := buffer_size;
        offset := 1;
    
        -- ----------------------------------------------
        -- READ FROM CLOB XML / WRITE OUT NEW XML TO DISK
        -- ----------------------------------------------
        WHILE amount >= buffer_size
        LOOP
    
            DBMS_LOB.READ(
                lob_loc    => clob_loc,
                amount     => amount,
                offset     => offset,
                buffer     => buffer);
    
            offset := offset + amount;
    
            UTL_FILE.PUT(
                file      => file_handle,
                buffer    => buffer);
    
            UTL_FILE.FFLUSH(file => file_handle);
    
        END LOOP;
    
        UTL_FILE.FCLOSE(file => file_handle);
    Viel Erfolg!

    Comment


    • #3
      Hallo jum,

      du verstehst mein Problem anscheinend besser als ich.

      Was ich machen möchte ist, aus einer Tabelle Inhalte auslesen und diese in eine XML Form bzw. eine XML Datei (je nachdem, was die richtige Bezeichnung ist) packen und diese auf der Festplatte im XML Format abspeichern. Nehmen wir an, es handelt sich um Personendaten, wie oben angegeben und die Tabelle heisst "adressen".

      Ich muss auch zugeben, ich habe Schwierigkeiten deinen Vorschlag umzusetzen. Könntest du diesen bitte etwas ausführlicher (für Anfänger) kommentieren?

      Vielen Dank für deine Mühe!

      Comment


      • #4
        Ich habe das Prinzip mal maximal an Deine Vorgaben angepasst und wenn möglich vereinfacht... Dazu wird z.B. zunächst keine CLOB verwendet, sondern VARCHAR2.
        Das Beispiel sollte "sofort" laufen, wenn Du die passenden Rechte hast und es ein Server-Verzeichnis C:\TEMP gibt.
        Zu den einzelnen Befehlen und den Grenzen solltest Du aber die Dokumentationen lesen...

        Code:
        DROP DIRECTORY DC_DATA_DIR;
        
        CREATE OR REPLACE DIRECTORY DC_DATA_DIR AS 'C:\TEMP'; 
        
        DROP   TABLE test_xml;
        
        CREATE TABLE test_xml 
          (id       NUMBER,
           xml_file XMLTYPE);
           
        INSERT INTO test_xml VALUES 
          (1, XMLELEMENT (
            "head_node",
              XMLELEMENT ("adresse",
                XMLELEMENT ("stadt",   'Koeln'),
                XMLELEMENT ("strasse", 'Domstrasse')),
              XMLELEMENT ("person",
                XMLELEMENT ("name",    'Schmitz'),
                XMLELEMENT ("vorname", 'Theo')),
              XMLELEMENT ("person",
                XMLELEMENT ("name",    'Nagel'),
                XMLELEMENT ("vorname", 'Lena'))));        
        
        COMMIT;      
        /
        
        SET SERVEROUTPUT ON SIZE 100000;
        
        DECLARE  
        
          xml_content       VARCHAR2(32000);
          file_handle       UTL_FILE.FILE_TYPE;
          dir_path          VARCHAR2(4000);
          dir_name          CONSTANT VARCHAR2(80) := 'DC_DATA_DIR';
          xml_filename      CONSTANT VARCHAR2(80) := 'test_xml_file.xml';
        
        BEGIN
        
            --Test if the DIRECTORY is set correctly
            SELECT min(directory_path) INTO dir_path FROM all_directories WHERE directory_name = dir_name;
        
            IF dir_path IS NOT NULL
            THEN
              SELECT directory_path INTO dir_path FROM all_directories WHERE directory_name = dir_name;
              DBMS_OUTPUT.put_line('DIRECTORY "'||dir_name||'" exists as "'||dir_path||'"');
            ELSE		
              raise_application_error(-20001, 'DIRECTORY "'||dir_name||'" does not exists');
            END IF;
        
            -- ----------------
            -- GET XML AS STRING
            -- ----------------
            SELECT 
              XMLSERIALIZE (CONTENT xml_file)
              INTO xml_content
              FROM test_xml
             WHERE id = 1;
        
        
            -- --------------------------------
            -- OPEN NEW XML FILE IN WRITE MODE
            -- --------------------------------
            file_handle := UTL_FILE.FOPEN(
                location     => dir_name,
                filename     => xml_filename,
                open_mode    => 'w');
        
        
            -- ----------------------------------------------
            -- WRITE OUT XML TO DISK
            -- ----------------------------------------------
        
            UTL_FILE.PUT(
              file      => file_handle,
              buffer    => xml_content);
        
            UTL_FILE.FFLUSH(file => file_handle);
        
            UTL_FILE.FCLOSE(file => file_handle);
        
        END;

        Comment


        • #5
          Wow! Es funktioniert :-)

          Vielen Dank! Ich lese dann mal fleißig die Doku dazu! Jetzt, da ich weiß, wo es hingehen soll, müsste ich es verstehen :-)

          Danke noch einmal!

          Comment

          Working...
          X