Ausnahmebedingungsbehandlung bei heterogenen Aktualisierungen im Stapelbetrieb

Wenn beim Ausführen einer heterogenen Aktualisierung im Stapelbetrieb ein Fehler auftritt, wird die Ausnahmebedingung com.ibm.pdq.runtime.exception.UpdateManyException ausgelöst. Zu den Ausnahmebedingungen und zu den SQL-Anweisungen, die die Ausnahmebedingungen auslösen, können Sie Informationen abrufen. Die SQL-Fehlerinformationen sind in com.ibm.pdq.runtime.exception.HeteroBatchSQLException enthalten.

Sie können ein zweidimensionales int-Array abrufen, das den Aktualisierungszähler für die heterogene Aktualisierung im Stapelbetrieb enthält, indem Sie die Methode UpdateManyException.getUpdateCounts() aufrufen. Das Array enthält den Stand des Aktualisierungszählers, so wie er bei einem erfolgreichen Abschluss des Stapelbetriebs zurückgegeben würde.

Die Werte im Array sind entweder Aktualisierungszähler oder die Java™-Fehlermeldung EXECUTE_FAILED. Mithilfe der Informationen im Array können Sie ermitteln, wo die Fehler aufgetreten sind.

Sie können die Ausnahmebedingungen auf folgende Weisen abrufen:

Beispiel

Im folgenden Beispiel für heterogene Aktualisierung im Stapelbetrieb werden sechs Aktualisierungen ausgeführt. Wenn Sie den Stapelbetrieb ausführen, geschieht Folgendes:
  1. Die mit der Methode updateMany() ausgeführte Aktualisierung im Stapelbetrieb nimmt in Tabelle A drei Einfügungen vor.
  2. Eine einzelne UPDATE SQL-Anweisung, die fünf Zeilen von Tabelle F modifiziert.
  3. Eine einzelne INSERT SQL-Anweisung in Tabelle B, die mit der Ausnahmebedingung SqlIntegrityConstraintViolationException fehlschlägt, da sie versucht, einen vorhandenen Primärschlüssel einzufügen.
  4. Eine einzelne DELETE SQL-Anweisung, die fünf Zeilen aus Tabelle G löscht.
  5. Eine mit der Methode updateMany() ausgeführte Aktualisierung im Stapelbetrieb, die zwei Einfügungen in Tabelle H vornimmt. Beide Einfügungen schlagen mit der Ausnahmebedingung SqlIntegrityConstraintViolationException fehl, weil sie versuchen, einen vorhandenen Primärschlüssel einzufügen.
  6. Eine einzelne INSERT SQL-Anweisung in Tabelle 1.
Die Ausnahmebedingung UpdateManyException wird ausgelöst:

com.ibm.pdq.runtime.exception.UpdateManyException: [pdq][10363][3.200.401] Mindestens eine Ausnahmebedingung ist aufgetreten, als pureQuery den Stapel heterogener SQL-Anweisungen ausführte.

Sie rufen die Methode getHeterogeneousUpdateCounts () auf, damit ein zweidimensionales int-Array von Aktualisierungszählern zurückgegeben wird, mit dessen Hilfe die fehlgeschlagenen SQL-Anweisungen ermittelt werden können. In der folgenden Tabelle ist der Arrayinhalt aufgelistet:

Tabelle 1. Tabelle mit heterogenen Aktualisierungszählern im Stapelbetrieb
Arrayindex Anzahl1
[0][0] 1
[0][1] 1
[0][2] 1
[1][0] 5
[2][0] EXECUTE_FAILED
[3][0] 5
[4][0] EXECUTE_FAILED
[4][1] EXECUTE_FAILED
[5][0] 1
Anmerkung:
  1. EXECUTE_FAILED ist die JDBC-definierte Konstante java.sql.Statement.EXECUTE_FAILED.
Sie können die Ausnahmebedingungen mit den folgenden Methoden abrufen:
  • UpdateManyException.getHeteroBatchSQLExceptionArray () gibt ein Array zurück, das zeilenspezifische HeteroBatchSQLExceptions enthält. Wenn mehrere Ausnahmebedingungen für eine Zeile vorhanden sind, werden die Ausnahmebedingungen miteinander verkettet.
  • UpdateManyException.getBatchNonSpecificExceptions() gibt nicht zeilenspezifische HeteroBatchSQLExceptions zurück.

In der folgenden Tabelle ist das von UpdateManyException.getHeteroBatchSQLExceptionArray() zurückgegebene Array aufgelistet:

Tabelle 2. Array mit zeilenspezifischen HeteroBatchSQLExceptions
Arrayindex Wert
[0][0] null
[0][1] null
[0][2] null
[1][0] null
[2][0] HeteroBatchSQLException, die die folgenden Informationen enthält:

com.ibm.db2.jcc.am.SqlIntegrityConstraintViolationException: Fehler für Stapelelement #1: in stmt #3: Mindestens ein Wert in der Anweisung INSERT, der Anweisung UPDATE oder in der von einer DELETE-Anweisung verursachten Fremdschlüsselaktualisierung ist ungültig, weil der Primärschlüssel, die eindeutige Integritätsbedingung oder der mit "1" gekennzeichnete eindeutige Index nicht zulässt, dass die Tabelle "DB2ADMIN.G" doppelte Werte für den Indexschlüssel enthält.

[3][0] null
[4][0] HeteroBatchSQLException, die die folgenden Informationen enthält:

com.ibm.db2.jcc.am.SqlIntegrityConstraintViolationException: Fehler für Stapelelement #1: in stmt #5: Mindestens ein Wert in der Anweisung INSERT, der Anweisung UPDATE oder in der von einer DELETE-Anweisung verursachten Fremdschlüsselaktualisierung ist ungültig, weil der Primärschlüssel, die eindeutige Integritätsbedingung oder der mit "1" gekennzeichnete eindeutige Index nicht zulässt, dass die Tabelle "DB2ADMIN.H" doppelte Werte für den Indexschlüssel enthält.

[4][1] HeteroBatchSQLException, die die folgenden Informationen enthält:

com.ibm.db2.jcc.am.SqlIntegrityConstraintViolationException: Fehler für Stapelelement #2: in stmt #5: Mindestens ein Wert in der Anweisung INSERT, der Anweisung UPDATE oder in der von einer DELETE-Anweisung verursachten Fremdschlüsselaktualisierung ist ungültig, weil der Primärschlüssel, die eindeutige Integritätsbedingung oder der mit "1" gekennzeichnete eindeutige Index nicht zulässt, dass die Tabelle "DB2ADMIN.H" doppelte Werte für den Indexschlüssel enthält.

[5][0] null

UpdateManyException.getBatchNonSpecificExceptions() gibt null zurück, weil keine nicht zeilenspezifischen SQL-Ausnahmebedingungen vorhanden sind.

Sie können die Methode UpdateManyException.getCause() und die Methode UpdateManyException.getNextException() aufrufen, um die verketteten HeteroBatchSQLExceptions abzurufen. Die folgende Liste enthält die HeteroBatchSQLExceptions, die durch einen Aufruf von getCause() und getNextException() zurückgegeben werden.

  1. Ein Aufruf von getCause() gibt die Ursache zurück:

    com.ibm.db2.jcc.am.BatchUpdateException: [jcc][102][10040][3.63.46] Batch fehlgeschlagen. Der Batch wurde übergeben, aber für ein einzelnes Batch-Member ist mindestens eine Ausnahmebedingung aufgetreten. Verwenden Sie getNextException(), um die Ausnahmebedingungen für bestimmte stapelorientierte Elemente abzurufen.

  2. Der erste Aufruf von getNextException() gibt die Ausnahmebedingung HeteroBatchSQLException zurück, die die folgenden Informationen enthält:

    com.ibm.db2.jcc.am.SqlIntegrityConstraintViolationException: Fehler für Stapelelement #1: in stmt #3: Mindestens ein Wert in der Anweisung INSERT, der Anweisung UPDATE oder in der von einer DELETE-Anweisung verursachten Fremdschlüsselaktualisierung ist ungültig, weil der Primärschlüssel, die eindeutige Integritätsbedingung oder der mit "1" gekennzeichnete eindeutige Index nicht zulässt, dass die Tabelle "DB2ADMIN.G" doppelte Werte für den Indexschlüssel enthält.

  3. Der zweite Aufruf von getNextException() gibt die Ausnahmebedingung HeteroBatchSQLException zurück, die die folgenden Informationen enthält:

    com.ibm.db2.jcc.am.SqlIntegrityConstraintViolationException: Fehler für Stapelelement #1: in stmt #5: Mindestens ein Wert in der Anweisung INSERT, der Anweisung UPDATE oder in der von einer DELETE-Anweisung verursachten Fremdschlüsselaktualisierung ist ungültig, weil der Primärschlüssel, die eindeutige Integritätsbedingung oder der mit "1" gekennzeichnete eindeutige Index nicht zulässt, dass die Tabelle "DB2ADMIN.H" doppelte Werte für den Indexschlüssel enthält.

  4. Der dritte Aufruf von getNextException() gibt die Ausnahmebedingung HeteroBatchSQLException zurück, die die folgenden Informationen enthält:

    com.ibm.db2.jcc.am.SqlIntegrityConstraintViolationException: Fehler für Stapelelement #2: in stmt #5: Mindestens ein Wert in der Anweisung INSERT, der Anweisung UPDATE oder in der von einer DELETE-Anweisung verursachten Fremdschlüsselaktualisierung ist ungültig, weil der Primärschlüssel, die eindeutige Integritätsbedingung oder der mit "1" gekennzeichnete eindeutige Index nicht zulässt, dass die Tabelle "DB2ADMIN.H" doppelte Werte für den Indexschlüssel enthält.

  5. Der vierte Aufruf von getNextException() gibt Folgendes zurück:

    null


Feedback