Этот случай возникает в реальной ситуации, когда недопустимые данные находились (и продолжают поступать) в базу данных Oracle, которая извлекается в систему обработки данных в Focus. В некоторых строках с недопустимыми временными отрезками фокус задыхался и умирал. Затем администратор баз данных Oracle копирует дату и время в соответствующий столбец из исправного столбца, чтобы процесс продолжился (да, я знаю).
Я помогал в устранении проблемы и обнаружил, что в Oracle в затронутой строке:
DUMP(START_TIME)
дает:
'Typ=12 Len=7: 100,99,255,255,0,0,0'
Пока:
TO_CHAR(START_TIME, 'YYYY/MM/DD HH24:MI:SS')
дает:
ORA-01801: date format is too long for internal buffer
Глядя на результаты DUMP(), 'Typ=12 Len=7: 100,99,255,255,0,0,0' и соглашения о хранении, кажется, что они могут обойти семантические ограничения столбца и вставить эквивалент 0, -1, -1, -1, -1, -1, -1 или 0x00 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF
Это имеет «смысл», поскольку 0xFF = 255 = -1 потенциально может привести к 0000/255/255 255:255:255 в зависимости от того, как вы интерпретируете байты, знаки и переполнения.
При каких условиях (механизм подключения и т. д.) Oracle разрешает ввод недопустимых данных в столбцы datetime?


Кажется, я не могу найти ошибку в быстром поиске в Metalink (если вы еще не открыли SR с Oracle, я бы предложил это сделать), но я знаю, что на уровне OCI (Oracle Call Interface) были ошибки, которые позволяли ошибочный код для вставки недопустимых дат. Тем не менее, по большей части эти ошибки были исправлены в течение некоторого времени, поэтому я готов поспорить, что если вы примените последний набор исправлений к клиентским машинам, которые делают вставки, проблема исчезнет.
Нужны ли вам администраторы баз данных для исправления установки клиента Oracle? В некоторых организациях для этого должны быть задействованы администраторы баз данных, в других организациях это позволяет владельцам / администраторам клиентской системы.
Oracle обычно этого не допускает. Уровень OCI может обойти проверку типа данных - Oracle в основном полагает, что то, что вы помещаете в эти семь байтов, составляет действительную дату. Точно так же на уровне OCI Oracle может вернуть семь байтов даты, и клиентское программное обеспечение должно делать с этими байтами все, что пожелает (оставить их как есть, преобразовать в строку или номер эпохи ... ) Возможно, лучший подход - выяснить, что загружает туда данные, и посмотреть, что это делает с датами.
Если вы чувствуете себя крайне извращенным, вы можете использовать недокументированную функцию REVERSE для свидания и сделать ее недействительной.
Я бы стал, но на самом деле это не моя система, и человек, которому я помогал обойти ее, не получает должного внимания со стороны администраторов баз данных Oracle.