Jedynym sposobem (wiem o tym), aby dowiedzieć się, który wiersz powoduje problem, jest użycie funkcji „logowania błędów do” Oracle. W ten sposób insert
nie zgłosi wyjątku, a każdy wiersz naruszający jakiekolwiek ograniczenie zostanie zapisany w określonej tabeli błędów.
Aby to zrobić, musisz najpierw utworzyć tabelę dziennika, która zawiera odrzucone wiersze:
EXECUTE DBMS_ERRLOG.CREATE_ERROR_LOG('BD_VEHICLES_TEMP');
Spowoduje to utworzenie tabeli o nazwie ERR$_BD_VEHICLES_TEMP
Następnie uruchom zmień swoje oświadczenie na to:
insert into bd_vehicles_temp
select *
from bd_vehicles_temp_1
LOG ERRORS REJECT LIMIT UNLIMITED;
Instrukcja będzie kontynuowana, nawet jeśli wiersz nie sprawdzi poprawności ograniczeń. Po zakończeniu wyciągu możesz sprawdzić zawartość tabeli ERR$_BD_VEHICLES_TEMP
dla wierszy, które naruszyły ograniczenie, w tym komunikat o błędzie i wartości.
(Edytuj):Jeśli chcesz zatrzymać się przy pierwszym błędzie (i zobaczyć to w tabeli dziennika), pomiń REJECT LIMIT UNLIMITED
klauzula.
Więcej szczegółów znajduje się w instrukcji:
- dla DBMS_ERRLOG http://docs. oracle.com/cd/B28359_01/appdev.111/b28419/d_errlog.htm#CEGBBABI
- dla klauzuli LOG ERRORS INTO:http ://docs.oracle.com/cd/B28359_01/server.111/b28286/statements_9014.htm#BGBEIACB