Announcement

Collapse
No announcement yet.

getriggerter Export als csv

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

  • getriggerter Export als csv

    Hallo,

    da ich hier neu bin, stelle ich mich erst einmal kurz vor:

    Ich habe eine kleine Firma für Industrieverpackungen und erstellte bis Ende 2008 unsere ERP-Lösung mittel Filemaker selbst.
    Anfang 2009 bekamen wir eine professionelle ERP-Software, die mit Oracle-Datenbanken arbeitet.

    Nachdem ich nun auch schon etwas älter bin (42), bekomme ich mehr und mehr Schwierigkeiten, mal so eben neue Programmiersprachen und Strukturen zu lernen

    -------------------------------

    nun zu meinem Problem:

    Gibt es eine Möglichkeit ,einen View durch einen Trigger in eine Tab-getrennte csv-Datei zu exportieren, wobei die einzelnen Daten NICHT wie beim SQL-Developer in Anführungszeichen gesetzt werden dürfen.
    Auch eine zeitliche Steuerung (z.B. einmal am Tag) wäre möglich.

    Alternativ ist auch ein Export als .xls möglich, da ich mir gerade eine Exceldatei gebastelt habe, welche die Exportdatei einliest, als csv abspeichert und sich dann wieder schließt.
    Dieses müsste ich dann zeitgesteuert über den Aufgabenplaner vom Windows Server laufen lassen.
    So bekomme ich keine aktuelle Datendatei hin, aber zur Not geht es auch.

    Hintergrund ist der, dass wir in einer Gemeinschaft sind, auf deren Server ein Bestand aller der Gemeinschaft angeschlossenen Partner geführt wird.
    Daher habe ich einen View angelegt, in dem sich alle Artikel mit einem Eintrag in der Spalte 'Artikelnr Gem' wiederfinden.

    Als Exportdatei für den Server ist nur die o.g. Datei zulässig.
    Ich benutze ein Programm, welches sofort bei Änderung der Datei auf unserem Server einen Upload durchführt.


    Gruß aus einem norddeutschen Iglo,

    Jens
    Zuletzt editiert von jebo34; 06.02.2010, 15:00.
    -----------------------------------------------------------------------------------------------
    Oracle 10/Windows Server 2008/Crystal Reports 2008/SQL-Developer

  • #2
    Hi,

    über einen Trigger würde ich das nicht lösen, dafür gibt es das Package DBMS_SCHEDULER, mit dem man zeitgesteuerte Aktionen auslösen kann.

    Des weiteren brauchst Du noch eine kleine PL/SQL Procedure und ein Directory.
    Code:
    create or replace directory csvout as 'Verzeichnis in das die Datei geschrieben werden soll';
    
    CREATE OR REPLACE PROCEDURE UNLOAD_VIEW AS 
     l_handle UTL_FILE.file_type;
    BEGIN
     l_handle:=UTL_FILE.FOPEN ('CSVOUT','unload.csv','w',4002);
     for i in(select col1||';'||col2||';'||col3 AS csv_line from deine_view) loop
      utl_file.put_line(l_handle,i.csv_line);
     end loop;
     UTL_FILE.FCLOSE_ALL;
    END UNLOAD_VIEW;
    Und jetzt noch den Scheduler anlegen:
    Code:
    begin
    DBMS_SCHEDULER.CREATE_JOB (
       job_name=>'UNLOAD_JOB',
       job_type=>'STORED_PROCEDURE',
       job_action=>'UNLOAD_VIEW',
       start_date=>NULL,
       repeat_interval=>'FREQ=DAILY;BYHOUR=21',
       end_date=>NULL,  
       enabled=>TRUE);
    end;
    /
    Damit würde die obige Prozedur täglich um 21 Uhr ausgeführt werden und eine Datei mit dem Namen unload.csv in das angegebene Verzeichnis schreiben.

    Evtl. hast Du nicht die Berechtigung ein Directory und ein Verzeichnis anzulegen. In diesem Fall muss das dein DBA erledigen. Achte darauf, dass der User dem die Prozedur gehört dann Lese- und Schreibberechtigungen auf das Directory braucht und Du in Create_Job beim Parameter job_name SCHEMANAME.UNLOAD_JOB mitgeben musst.

    Ich benutze ein Programm, welches sofort bei Änderung der Datei auf unserem Server einen Upload durchführt.
    Nur weil sich eine Datei ändert heißt es aber nicht, dass sie auch schon fertig geschrieben ist.

    Dim
    Zitat Tom Kyte:
    I have a simple philosophy when it comes to the Oracle Database: you can treat it as a black box and just stick data into it, or you can understand how it works and exploit it as a powerful computing environment.

    Comment


    • #3
      Na mal sehn...

      Hallo Dimitri,

      danke für Deine ausführliche Antwort.
      Werde das ganze im Laufe der Woche mal ausprobieren und da Rückmeldung geben!

      Schönen Sonntag noch,

      Jens
      -----------------------------------------------------------------------------------------------
      Oracle 10/Windows Server 2008/Crystal Reports 2008/SQL-Developer

      Comment


      • #4
        Fehlermeldung

        Hi Dimitri,

        1) Ich habe Deinen Syntax wie folgt angepasst:

        ------>
        create or replace directory csvout as 'C:\Daten\User\MC Pack\Exportdatei PS';

        CREATE OR REPLACE PROCEDURE EXPORT_PS_BESTANDSKATALOG AS
        l_handle UTL_FILE.file_type;
        BEGIN
        l_handle:=UTL_FILE.FOPEN ('CSVOUT','unload.csv','w',4002);
        for i in(select col1||';'||col2||';'||col3 AS csv_line from MCP_LAGERBESTAND_PS) loop
        utl_file.put_line(l_handle,i.csv_line);
        end loop;
        UTL_FILE.FCLOSE_ALL;
        END EXPORT_PS_BESTANDSKATALOG;
        <-------

        Ich bekomme beim compilieren der Prozedur im Oracle SQL-Developer folgende Fehlermeldung: Fehler: ORA-00911: Ungültiges Zeichen


        2) Wo lege ich den Scheduler an?

        Gruß,

        Jens
        -----------------------------------------------------------------------------------------------
        Oracle 10/Windows Server 2008/Crystal Reports 2008/SQL-Developer

        Comment


        • #5
          Ich bekomme beim compilieren der Prozedur im Oracle SQL-Developer folgende Fehlermeldung: Fehler: ORA-00911: Ungültiges Zeichen
          Wenn Du im sqldeveloper auf Proceduren" gehst, dann wird dir der Fehler auch genauer angezeigt. Bei mir funktioniert es, allerdings musst Du natürlich die Spaltennamen anpassen es sei denn sie heißen wirklich col1, col2 und col3.

          Wo lege ich den Scheduler an?
          Im sqldeveloper. So wie auch die Prozedur. In der View user_scheduler_jobs kannst Du dann sehen ob's geklappt hat.

          Dim
          Zitat Tom Kyte:
          I have a simple philosophy when it comes to the Oracle Database: you can treat it as a black box and just stick data into it, or you can understand how it works and exploit it as a powerful computing environment.

          Comment


          • #6
            Immer noch Fehler

            Ich habe inzwischen herausgefunden, dass die erste Zeile die Fehlermeldung liefert. Lösche ich diese, läßt sich die Prozedur endlich kompilieren.

            Habe mal den Dateipfad vereinfacht:
            ------->
            create or replace directory csvout as 'C:\Test';
            <-------

            Ich bekomme immer noch die Fehlermeldung, kann es mir aber nicht erklären.
            Selbst
            as 'C:\T';
            und
            as '';
            liefert den Fehler.

            -----------------------------------------------------------------------------------------------
            Oracle 10/Windows Server 2008/Crystal Reports 2008/SQL-Developer

            Comment


            • #7
              Ist die Zeichenkette
              Code:
              <-------
              tatsächlich im Quelltext vorhanden ?
              Ansonsten sieht alles ok aus und sollte sich compilieren lassen...

              Comment


              • #8
                Natürlich nicht

                Ich habe mal einen Screenshot angehängt.

                Gruß,

                Jens
                Attached Files
                -----------------------------------------------------------------------------------------------
                Oracle 10/Windows Server 2008/Crystal Reports 2008/SQL-Developer

                Comment


                • #9
                  Also ich hab auch mal deine etwas seltsame Formatierung übernommen und auch die Leerzeile eingefügt. Sowohl mit F9 als auch mit F5 wird alles fehlerfrei übersetzt.

                  Ich würde mal folgendes machen:
                  - Entferne die Leerzeile
                  - Schließe den PL/SQL Block mit einem / ab. Also
                  Code:
                  END EXPORT_PS_BESTANDSKATALOG;
                  /
                  - Lass zwischen dem Kommentar und dem BEGIN eine Leerzeile.

                  Evtl. ist die alte 1.5er Version des SQLDev da etwas heikel.

                  Des weiteren musst Du bei
                  Code:
                  l_handle:=UTL_FILE.FOPEN ('CSVOUT','unload.csv','w',4002);
                  CSVOUT zwingend gross schreiben, da Oracle die Objekte standardmäßig mit Grossbuchstaben anlegt und diese Funktion laut Doku case sensitiv ist (frag nicht warum bei anderen ist es wieder anders...)

                  Des weiteren solltest Du dir die neueste SQL Developer Version runterladen.

                  Dim
                  Zitat Tom Kyte:
                  I have a simple philosophy when it comes to the Oracle Database: you can treat it as a black box and just stick data into it, or you can understand how it works and exploit it as a powerful computing environment.

                  Comment


                  • #10
                    Originally posted by jebo34 View Post
                    create or replace directory csvout as 'C:\Test';

                    Hi

                    Nur um sicher zu gehen : c:\Test *muss* auf dem Server exisitieren, der Server kann nicht auf einen beliebeigen Client schreiben


                    Gruss

                    Comment


                    • #11
                      Ich arbeite direkt auf dem Server, nicht an einem Client!
                      Neueste SQL-Developer-Version heute installiert (2.1.0.63)

                      Ich habe jetzt die erste Zeile mal als SQL ausgeführt:
                      1) Es funktioniert!
                      2) Es wird mir im SQL-Developer unter Verzeichnisse auch das Verzeichnis 'CVSOUT' angezeigt
                      3) Es wurde aber kein Verzeichnis auf dem Server angelegt!
                      4) Habe ich aber mal manuell erstellt

                      Danach habe ich noch einmal versucht die Prozedur zu kompilieren:
                      Nix, Fehler: ORA-00911: Ungültiges Zeichen

                      Im Logging-Fenster habe ich auch eine Fehlermeldung (siehe Bild).

                      Noch irgendeine Idee??

                      verzweifel,
                      Jens
                      Attached Files
                      -----------------------------------------------------------------------------------------------
                      Oracle 10/Windows Server 2008/Crystal Reports 2008/SQL-Developer

                      Comment


                      • #12
                        Originally posted by jebo34 View Post
                        3) Es wurde aber kein Verzeichnis auf dem Server angelegt!
                        4) Habe ich aber mal manuell erstellt

                        Jens
                        Ja, das ist so, das "CREATE DIRECTORY" ist nur ein Dir- Objekt in der Datenbank, das Verzeichnis im Filesystem dazu musst du selbst erstellen


                        Gruss

                        Comment


                        • #13
                          Schau dir die Prozedur doch mal im Prozedure Editor an wie ich schon mal vorgeschlagen hab.
                          Dann wird dir die fehlerhafte Zeile auch markiert.

                          Dim
                          Zitat Tom Kyte:
                          I have a simple philosophy when it comes to the Oracle Database: you can treat it as a black box and just stick data into it, or you can understand how it works and exploit it as a powerful computing environment.

                          Comment


                          • #14
                            Hi Dimitri,

                            bin doch im Editor, es wird aber keine Zeile markiert.

                            Bin mal in den Duebug-Modus gewechselt und habe die Prozedur gestartet (siehe Bild 1).

                            Weiterhin habe ich mal einen Exceptioncode zugefügt, den ich in einem Forum gefunden habe (siehe Bild 2).
                            Attached Files
                            -----------------------------------------------------------------------------------------------
                            Oracle 10/Windows Server 2008/Crystal Reports 2008/SQL-Developer

                            Comment


                            • #15
                              Es geht

                              Hi,

                              fragt mich nicht, was ich alles gemacht habe, aber jetzt geht es.

                              Zu guter letzt habe ich den gesamten Syntax als SQL als Stapelverarbeitung im SQL-Fenster ausgeführt:
                              Meldung:
                              create or replace directory erfolgreich.
                              PROCEDURE EXPORT_PS_BESTANDSKATALOG kompiliert

                              und nu gehts auch

                              Danke Euch!!
                              -----------------------------------------------------------------------------------------------
                              Oracle 10/Windows Server 2008/Crystal Reports 2008/SQL-Developer

                              Comment

                              Working...
                              X