Announcement

Collapse
No announcement yet.

automatischer COMMIT

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

  • automatischer COMMIT

    Hallo Zusammen,

    ich habe mich gewundert, warum in der Datenbank Änderungen commitet werden, obwohl ich kein COMMIT Statement verwendet habe.
    Nun habe ich gelesen, dass der Befehl ALTER TABLE automatisch einen COMMIT erzeugt.
    Frage : Ist dies tatsächlich der Fall ?
    Wie kann ich das verhindern ?
    Meine Idee wäre den ALTER TABLE in eine autonome Transaction auszulagern.
    Gibt es noch andere Vorschläge ?

  • #2
    Alle DDL Operationen haben ein COMMIT zur Folge. Das kann ich bestätigen.

    Comment


    • #3
      Frage : Ist dies tatsächlich der Fall ?
      Ja sogar zweimal. Einmal davor und einmal danach.

      Wie kann ich das verhindern ?
      Gar nicht.

      Meine Idee wäre den ALTER TABLE in eine autonome Transaction auszulagern.
      DDL innerhalb einer laufenden Transaktion klingt bzw. ist ziemlich verquer. Was möchtest Du denn machen?

      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


      • #4
        Ich habe n Dateien in einem Verzeichnis, die ich alle sequentiell einlesen möchte. Die Alternative ist wohl die Daten in ein CLOB zu laden ?

        Der ALTER TABLE bezieht sich auf eine externe Tabelle
        "alter table XXX location (XXX:'1.txt'"

        Comment


        • #5
          Also so eine Art BULK Insert? Hier gibs ein Beispiel wie man BULK Insert in PL/SQL programmiert. Damit kannst Du sehr schnell Daten aus einer Datei in eine Tabelle laden OHNE DDL zu verwenden.

          Comment


          • #6
            Da habe ich mich wohl falsch ausgedrückt.
            Die Dateien befinden Sie nicht in der Datenbank, sondern im File System.
            Ich kenn nur die 2 Möglichkeiten die Daten in die Datenbank zu bekommen :

            Laden in ein CLOB
            externe Tabelle

            Comment


            • #7
              Wenn Du die Dateinamen schon kennst, dann gib Sie doch in der initialen Definition einfach schon an:
              Code:
              location ('file1.dat', 'file2.dat','file3.dat')
              Mit PL/SQL geht es, wie schon vorgeschlagen auch, auch, allerdings hat das nichts mit BULK INSERTS zu tun:
              Code:
              CREATE OR REPLACE procedure loadclob(p_filename varchar2) is
                l_file CLOB;
                l_localFile BFILE;
                l_start NUMBER:=0;
                l_offset NUMBER:=0;
              begin
                insert into deinetabelle (clob_column) values(empty_clob()) returning clob_column into l_file;
                l_localFile:=BFILENAME('DEIN_DIRECTORY',p_filename);
                DBMS_LOB.LOADCLOBFROMFILE (l_file,l_localFile,DBMS_LOB.LOBMAXSIZE,l_start,l_offset);
              end;
              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


              • #8
                Hallo dimitri,

                Leider kann ich nicht alle Dateien in der LOCATION definieren, dazu muss ich etwas weiter ausholen :

                Die einzulesenden Dateien sind EDIFACT Dateien. Dabei ist es von größter Wichtigkeit, dass es sich um genau 1 physiche Datei handelt. Nur so kann ich fehlerhafte Dateien gezielt erkennen und in eine Fehlerverzeichnis verschieben, ohne das die richtigen Daten betroffen sind.

                Das mit dem CLOB ist auch nicht so einfach, da ein EDIFACT Satz immer mit dem Zeichen "´" endet. Nun kann diese Zeichen aber auch als Text verwendet werden. Ich müsste somit das CLOB BYte für Byte auslesen, bis ich erkennen kann wann das Satzende erreicht ist. Geanu dies mache ich bereits in einem Vorprogramm um genau 1 physiche Datei zu erhalten, da die Original Datei mehrere pyhsiche Dateien beinhalten kann.
                Im EDIFACT beginnt die physische Datei mit einem UNB und endet mit einem UNZ Segment.

                Comment


                • #9
                  Also wenn ich das richtig verstanden habe, läuft das wie folgt ab:
                  1. Das Vorprogramm splittet die Originaldatei auf und erzeugt fachliche korrekte Einzeldateien daraus.
                  2. Diese neu erzeugten Dateien sollen in die Datenbank gelesen werden.

                  Dazu noch eine weitere Frage:
                  Reicht es, wenn die Datei als CLOB abgelegt wird, oder soll die Dateistruktur sich auch in der Tabelle widerspiegeln?

                  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
                    Hallo dimitri,

                    soweit hast Du verstanden, wie der Abauf ist.

                    Im 2. Schritt wird dann jeder einzelner EDIFACT Satz ( Segment ) in Gruppen und Felder zerlegt. Je nach Definition sucht das Programm dann relevante Felder für die Datenbank, die dann in eine Collection zwischen gespeichert werden. Dabei werden in der Regel mehrere Eingabesätze benötigt um aus der Collection einen Datenbanksatz zu erzeugen.

                    Das Ganze ist ein EDIFACT Konverter.
                    Wir können leider keinen Standardkonverter einsetzen, da leider nicht alle Datenlieferanten sich an den "Standard" halten.

                    Comment


                    • #11
                      Ok, also ein ETL Prozess. Ist das zweite Programm ein PL/SQL Programm, oder anders gefragt: wo kommt der CLOB ins Spiel.

                      Wenn es nur darum geht Dateien 1:1 als CLOB für die weitere Verarbeitung in einer Tabelle abzuspeichern, dann wäre die PL/SQL Variante doch problemlos nutzbar.

                      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


                      • #12
                        Ich vermute Du meinst, die Daten in ein CLOB laden und danch das CLOB in eine Datenbanktabelle schreiben.

                        Comment

                        Working...
                        X