Ошибка ORA-03113 при использовании ODAC и Variant
Неожиданно столкнулись с проблемой появления ошибки ORA-03113: end-of-file on communication channel при использовании компонентов ODAC в приложениях, написанных с помощью Delphi XE5. Режим Direct Mode, база данных Oracle 11g, вызов серверных хранимых процедур.
По-русски, это означает, что была прервана связь между клиентом и сервером. Ошибку можно было исправить только переподключением. Непонятным оставался механизм ошибки и соответственно ее источник.
После нескольких дней поиска выяснилось следующее. Среди входных параметров вызываемой хранимой процедуры был один параметр типа VARCHAR. В Delphi в этот параметр данные передавались из переменной типа Variant. Тип Variant удобен тем, что может принимать значение NULL, чего не могут типы Integer или String.
Так вот, при передачи параметра в компонент TStoredProc тип Variant передавался без всяческих преобразований. Вот так:
parameters.Add ( _provider.CreateParameter ( 'datum_level_in', section.DatumLevel ) );Как раз это и являлось причиной ошибки. По так и невыясненной причине вызов метода Execute напрочь валил текущую сессию.
Достаточно было добавить VarToStr () и все заработало. Замечу, что такое поведение было замечено лишь в том случае, когда реципиентом был именно тип VARCHAR. С типом NUMBER такого не наблюдалось.
parameters.Add ( _provider.CreateParameter ( 'datum_level_in', VarToStr ( section.DatumLevel ) ) );