To jest błąd Oracle.
Jest wyzwalany przez dodanie kolumny z NOT NULL
ograniczenie i DEFAULT
wartość do istniejącej tabeli.
Aby szybko dodać kolumnę, Oracle 11g przechowuje wartość domyślną w słowniku danych. Oracle nazywa to „optymalizacją dodawania kolumn”.
Jest to szybsze niż zapisywanie wartości domyślnej w każdym wierszu tabeli. Silnik zapytań powinien wtedy zastąpić dowolną wartość NULL w wierszu tabeli wartością domyślną ze słownika danych. Niestety jest z tym kilka błędów. Twój wydaje się być przykładem:
Możesz sprawdzić, które kolumny zostały dodane w ten sposób:
select owner, object_name, name
from dba_objects, col$
where bitand(col$.PROPERTY,1073741824)=1073741824
and object_id=obj#;
W naszym przypadku zostaliśmy ukąszeni przez inny błąd, który zwrócił nieprawidłowe wyniki dla SELECT FOR UPDATE
.
Ustawiamy parametr _add_col_optim_enabled=FALSE
aby wyłączyć tę "optymalizację". Alternatywnie możesz dokonać aktualizacji do nowszej wersji Oracle, w której te błędy zostaną naprawione.
Aktualizacja lub ustawienie powyższego parametru nie naprawi istniejącej tabeli, która jest uszkodzona. Musisz odtworzyć tę tabelę.