Announcement

Collapse
No announcement yet.

Insert Fehlerhafte Datensätze anzeigen

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

  • Insert Fehlerhafte Datensätze anzeigen

    Hallo,

    ich bin DB-Newbie.
    Datenbank: Oracle 9i
    Problem: Insert von ca. 500.000 Datensätzen bricht bei fehlerhaften Datensätzen ab und macht Rollback.
    Leider habe ich keine Info, welcher Datensatz der Grund ist.
    Imho sehe ich nur eine Möglichkeit: Mittels Schleife vor dem Insert jeden Datensatz überprüfen.
    Nachteil: Dauert ewig.
    Optimal wäre, wenn alle korrekten Datensätze eingelesen werden und die fehlerhaften Datensätze für die Nachbearbeitung in eine zweite Tabelle geschrieben werden.

    Kann mir jemand helfen?

    Danke
    Alex

  • #2
    Man kann das DML Error Logging ab Oracle 10g Database Release 2 ausnutzen:
    Hier ein Beispiel:
    Code:
    --  siehe auch 
    --    http://www.oracle-base.com/articles/10g/DmlErrorLogging_10gR2.php
    
    CREATE TABLE usertab (USER_NAME VARCHAR2(64), USER_GRP VARCHAR2(64), PERS_ID VARCHAR2(64), LANG_CD VARCHAR2(3));
    
    ALTER TABLE usertab ADD CONSTRAINT UNIQ_USER UNIQUE (PERS_ID) ENABLE;
    
    EXECUTE DBMS_ERRLOG.CREATE_ERROR_LOG('usertab', 'errlog');
    
    TRUNCATE TABLE errlog;
    
    SELECT * FROM errlog;
    
    INSERT INTO usertab VALUES ('user13','abcusers','user13','DE'); 
    
    INSERT INTO usertab (USER_NAME, USER_GRP, PERS_ID, LANG_CD) 
      SELECT 'user'||TRIM(TO_CHAR(rownum,'00')),
             'lgcusers ',
             'user'||TRIM(TO_CHAR(rownum,'00')),
             'DE' 
          from dual
          connect by level <= 99
      LOG ERRORS INTO errlog ('user_doppelt') REJECT LIMIT 101;
      
    SELECT * FROM errlog;

    Comment


    • #3
      Man kann das DML Error Logging ab Oracle 10g Database Release 2 ausnutzen
      Wenn er den 10g hätte

      Die Frage ist auch, was bedeutet den fehlerhaft?

      Imho sehe ich nur eine Möglichkeit: Mittels Schleife vor dem Insert jeden Datensatz überprüfen.
      Entweder das, oder Du erzeugst dir eine zweite Tabelle ohne Constraints und korrigierst dort die Daten bevor Du sie in die echte Tabelle schreibst.

      Optimal wäre, wenn alle korrekten Datensätze eingelesen werden und die fehlerhaften Datensätze für die Nachbearbeitung in eine zweite Tabelle geschrieben werden.
      Wie jum schon gezeigt hat geht das erst ab 10g.

      Wie lädst Du denn die Daten?

      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
        Au ja Oracle 9i , also sofortiges UpGrade von dieser nicht mehr supporteten Version.

        Eventuell könnte man das "verletzte" CONSTRAINT zeitweilig abschalten:

        Code:
        ALTER TABLE <tabelle>
          DISABLE CONSTRAINT <böses_constraint>;
        Dann laden, prüfen, korrigieren und wieder:
        Code:
        ALTER TABLE <tabelle>
          ENABLE CONSTRAINT <böses_constraint>;
        Vermutlich ist aber die Lösung von @dmitri einfacher.
        Zum Erzeugen der Spielgeltabelle ohne CONSTRAINTS:
        Code:
        CREATE TABLE <tab_ohne_cons> AS SELECT * FROM <tabelle> WHERE 1=2;

        Comment


        • #5
          Danke für die Info's!
          Werde wohl auf 10g wechseln.

          Gruß
          Alex

          Comment


          • #6
            Na wenn das so einfach bei dir geht, würde ich direkt auf die 11er gehen.

            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

            Working...
            X