Inspiracja , wiedza , realizacja
Jsystems

W przebudowie

Login



Java

Oracle

Linux

Android

PostgreSQL

Microsoft SQL Server

Wyjątki w operacjach masowych

Data dodania: Jun 20, 2016
Data aktualizacji: Jun 20, 2016

Podczas przetwarzania instrukcji FORALL w operacjach masowych mogą pojawić się wyjątki. Przypuśćmy że ładujemy do tabeli milion wierszy, a tylko jeden z nich spowoduje wyjątek. Jeśli nie obsłużę go w żaden sposób, nastąpi automatyczny rollback. Jeśli nawet obsłużę wyjątek na poziomie bloku, przetwarzanie tablicy w FORALLu i tak zostanie przerwane. W obu przypadkach nie jest to sytuacja która by nas satysfakcjonowała, zwłaszcza jeśli wytwarzanie zawartości tablicy nas kosztowało trochę czasu. W poniższym przykładzie stworzyłem tabelę której kolumna nie akceptuje nulli, a następnie usiłuję wrzucić zawartość tablicy zawierającej null w co 5 elemencie do owej tablicy.




Ta operacja kończy się wyjątkiem, a tabela pozostaje pusta. Istnieje jednak możliwość zagregowania pojawiających się wyjątków do specjalnej tablicy wyjątków bez przerywania operacji FORALL. W poniższym przykładzie pierwsza część bloku się nie zmieniła w stosunku do poprzedniej wersji. W linii 31 doszła nam klauzula SAVE EXCEPTIONS, która to właśnie powoduje nie przerywanie operacji FORALL w przypadku pojawienia się wyjątku a zagregowanie wyjątków do tablicy. Sam FORALL został umieszczony w bloku zagnieżdżonym, z własną sekcją obsługi wyjątków. W owej sekcji (linie 34-40) odwołuję się do tablicy wyjątków wygenerowanych wcześniej i iterując po niej wyświetlam przyczyny problemów.

SQL%BULK_EXCEPTIONS(INDEX).ERROR_INDEX zwraca index elementu w przetwarzanej tablicy w którym nastąpił wyjątek.

SQL%BULK_EXCEPTIONS(INDEX).ERROR_CODE zwraca kod błędu

SQLERRM(SQL%BULK_EXCEPTIONS(INDEX).ERROR_CODE) funkcja SQLERRM zwraca komunikat wyjątku którego numer zostanie mu przekazany przez parametr.



Wiersze dla których operacja wykonała się poprawnie zostały wstawione do tabeli. Moja konsola po zakończeniu bloku wygląda następująco: