Insert-Cursor-Schleife und Ausnahmebehandlung - Oracle

Ich habe eine Tabelle namens KLAMOTTE, die so ziemlich Statisch (das heißt, sobald die Daten eingefügt werden, es ändert sich nie). Ich Abfrage von Daten aus KLAMOTTE und ausfüllen einer staging-Tabelle AUTO von dem Webmethods Umfragen jeden Tag.

In der Regel ist es 10 Einträge für jede Transaktion. Es gibt zwei Transaktionen pro Tag.

Ich geschrieben habe, einen Cursor, um dies zu tun, und ich bin glücklich mit der Logik.

Die Ausgabe Aussehen wird:

TRANSID   A    B    C   cnt
------   ---  ---   --  ---
A123     JIM  NY   ACT   1
A123     BOB  CA   ACT   2
A123     PIN  GA   ACT   3
--------------------------
A124     MIK  CA   ACT   1
A124     JON  MA   ACT   2
A124     CON  MY   ACT   3
A124     JIB  CA   ACT   4

Was mich wirklich besorgt, und die Frage ist:

  1. Wenn das insert in der Schleife ausfällt, sollte es rollback alle Einsätze, die Sie in dieser Transaktion, und nicht am Ende mit teilweise eingefügten Datensätze oder verwaiste Datensätze für eine Transaktion. Ich verpflichte mich, nur nach der Schleife abgeschlossen ist, wurde keine Ausnahme ausgelöst.
  2. Als Ausnahme geschieht, will ich auch wissen, welcher Datensatz konnte nicht eingefügt werden. Ich hoffe, Sie zu fangen, diese in meine Ausnahme und rufen eine Funktion in der exception-handler fügen Sie diese Informationen in eine Fehler-Tabelle für weitere Untersuchungen.
  3. Dem auto commit deaktiviert ist, in der DB. Aber oracle berücksichtigen Sie ALLE legen durch eine Schleife als eine Transaktion oder unabhängige Transaktionen und legen Sie es sofort?

Code

  DECLARE  TYPE message_info 
  IS 
    RECORD 
    ( 
      message_code INTEGER, 
      message      VARCHAR2(500)); 
    msg MESSAGE_INFO; 
    tranid  NUMBER; 
    p_error EXCEPTION; 
    CURSOR b1 IS 
      SELECT * 
      FROM   dud 
      WHERE  dud.DATE = SYSDATE 
      AND    dud.status='ACTIVE'; 

  BEGIN 
    IF *CHECK SOME condition* 
      BEGIN 
        tranid = seq_transid.NEXTVAL; 
        --- Transaction id is unique per transaction. 
        --- All 10 records will have same transaction id. 
        FOR b1 IN c1 
        LOOP 
          i=b1%rowcount; 
          INSERT INTO car 
                      ( 
                                  transid, 
                                  a, 
                                  b, 
                                  c, 
                                  cnt 
                      ) 
                      VALUES 
                      ( 
                                  tranid, 
                                  b1.a, 
                                  b1.b, 
                                  b1.c, 
                                  i 
                      ); 

        END LOOP; 
      EXCEPTION 
      WHEN OTHERS THEN 
        ROLLBACK; 
        msg.message := 'Unable to insert into CAR Table'; 
        RAISE p_error; 
      END; 
      COMMIT; 
    EXCEPTION 
    WHEN p_error THEN 
      error.post_msg (msg.message, SQLCODE,SQLERRM,USER); 
    END IF; 
  END;

InformationsquelleAutor user547453 | 2012-02-19

Schreibe einen Kommentar