(+1) Я упомянул Pro * C, но можно вставлять / обновлять недопустимые значения DATE с любого языка, использующего OCI (Oracle Call Interface). Мне никогда не приходило в голову использовать CONVERT_RAW_VALUE для создания недопустимого значения DATE. Приятно.
емещаю некоторые данные из одной схемы / таблицы оракула в новую схему / таблицу в той же базе данных.
Скрипт миграции выполняет следующие действия:
create table newtable as select
...
cast(ACTIVITYDATE as date) as ACTIVITY_DATE,
...
FROM oldtable where ACTIVITYDATE > sysdate - 1000;
Если я посмотрю на исходные данные, это выглядит хорошо - вот одна запись:
select
activitydate,
to_char(activitydate, 'MON DD,YYYY'),
to_char(activitydate, 'DD-MON-YYYY HH24:MI:SS'),
dump(activitydate),
length(activitydate)
from orginaltable where oldpk = 1067514
Результат:
18-NOV-10 NOV 18,2010 18-NOV-2010 12:59:15 Typ=12 Len=7: 120,110,11,18,13,60,16
Переносимые данные, показывающие, что данные повреждены:
select
activity_date,
to_char(activity_date, 'MON DD,YYYY'),
to_char(activity_date, 'DD-MON-YYYY HH24:MI:SS'),
dump(activity_date),
length(activity_date)
from newtable
where id = 1067514
Результат:
18-NOV-10 000 00,0000 00-000-0000 00:00:00 Typ=12 Len=7: 120,110,11,18,13,0,16
Около 5000 из 350 тысяч записей показывают эту проблему.
Кто-нибудь может объяснить, как это произошло?