Этот случай возникает в реальной ситуации, когда недействительные данные находились (и продолжают поступать) в базу данных 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 допускает попадание недопустимых данных в столбцы даты и времени?