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:
- 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.
- 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.
- 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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie FORALL-Anweisung auch in dieser situation....
sind Sie mit dem cursor und in der Schleife, die Sie einfügen in Tabellen..
Sie können direkt fügen Sie alle Transaktionen in einem einzigen Schuss. dies erhöht die performance Ihres Codes, und dieser wird Ihnen mit Gewissheit auch, dass alle Transaktion eingefügt oder keiner von Ihnen eingefügt haben...
Ich Stimme mit beiden von Cade und Praktisch. Ich möchte eine for-Schleife verwenden und cursor-da möchte ich auch einfügen, eine Sequenz/Reihenfolge der Datensätze eingefügt, die Transaktion, indem Sie die variable, die ich in meinem code bekommt der Zeilenanzahl. Bitte sehen Sie sich meine hinzugefügten Ausgabe in meinem post oben:
InformationsquelleAutor pratik garg
Grundsätzlich in der situation, die Sie beschreiben, sollte es kein problem sein, da Sie verpflichten sich, nur nach dem rollback.
Aber vielleicht wäre es besser, AUTONOMOUS_TRANSACTION für die Funktion, die den Fehler protokolliert. Im Allgemeinen sollte man es vermeiden, es zu verwenden, aber da müssen Sie einige Atomare Transaktion (für die Protokollierung der Aufzeichnung) es könnte besser sein, so dass Sie sicher sein, dass diese übergabe nicht verpflichtet, die Einsätze in der Schleife.
InformationsquelleAutor A.B.Cade