Announcement

Collapse
No announcement yet.

Stored Procedure mit INSERT INTO SELECT * FROM... wie fehlerhaften Datensatz abfangen

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

  • Stored Procedure mit INSERT INTO SELECT * FROM... wie fehlerhaften Datensatz abfangen

    Hallo,

    ich habe eine Frage zu Oracle, vielleicht kann mir ja jemand einen Tipp geben?
    Es existieren 2 Tabellen:

    table1 -> ohne Schlüssel, einige doppelte Datensätze
    table2 -> mit Schlüssel, leer


    Nun habe ich eine kleine Stored Procedure, die alles aus table1 selektiert und in table2 schreibt.
    Sollten dabei Fehler auftreten (durch KEyverletzung), werden diese Fehler in eine fehler_log-Tabelle geschrieben.
    Das ganze funktioniert wunderbar, aber: Die protokollierten Fehler sind sehr allgemein, eben Oracle Fehlercodes/ MEssages.
    Ich bräuchte genau diesen Datensatz, der nicht geschrieben werden konnte in meiner log-Tabelle.
    Ist das irgendwie möglich von einem normalen INSERT INTO table2 select * from table1; die fehlerhaften Datensätze abzufangen und rauszuschreiben?



    Code:
    create or replace procedure SP_Test as
    
    BEGIN
    
    DECLARE 
            SZSQL varchar2(2000);
          
    BEGIN            
          insert into table2
          select * from table1
          Commit;
          
    EXCEPTION
          when others then
    
                rollback;
                SZSQL := sqlerrm;
                insert into log_table(tbname, code, iden) values('abc', '123', SZSQL);
    
    END;
    END;




    Vielleicht hat irgendwer einen Tipp oder einen Hinweis, was noch fehlt?
    Viele Grüße,


    Tim

  • #2
    Originally posted by timb83 View Post
    Hallo,

    ich habe eine Frage zu Oracle, vielleicht kann mir ja jemand einen Tipp geben?
    Es existieren 2 Tabellen:

    table1 -> ohne Schlüssel, einige doppelte Datensätze
    table2 -> mit Schlüssel, leer


    Nun habe ich eine kleine Stored Procedure, die alles aus table1 selektiert und in table2 schreibt.
    Sollten dabei Fehler auftreten (durch KEyverletzung), werden diese Fehler in eine fehler_log-Tabelle geschrieben.

    Tim
    Hallo,

    Ich würde mir mal den MERGE Befehl näher anschauen :

    http://download.oracle.com/docs/cd/B...htm#SQLRF01606


    Gruss

    Comment


    • #3
      Hallo,

      vielen Dank mit dem Tipp bzgl. MERGE. Ich habe mein Script jetzt so umgeschrieben, nun wird per MERGE entweder geinserted und bei schon vorhandenen Datensätzen ein UPDATE gemacht.

      Sogar ein EXCEPTION mit Fehlerausschrift ist möglich, leider aber viel zu allgemein :-(
      Ich würde am liebsten genau den fehlerhaften Datensatz rausschreiben, bei dem der Fehgler aufgetreten ist, aber irgendwie kann ich nur den allgemeinen Oracle-Fehler rausschreiben... :-(

      Comment


      • #4
        Hi,

        wenn Du die LOG ERRORS Option verwendest, dann kannst Du den Satz auch in eine extra Logtabelle wegschreiben lassen. Beachte aber, dass LOG ERRORS keine Uniqueconstraint Verletzungen abfängt, da die Eindeutigkeitsprüfung etwas komplizierter ist. Ich hab hierzu auch mal eine Frage auf Asktom gestellt.

        Des weiteren benötigt der MERGE eine eindeutige Quellmenge, da Du ansonsten einen ORA-30926: unable to get a stable set of rows in the source tables bekommst.

        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