Про науку  Про жизнь  Про IT  Про спорт  Про книги  Разное

Проекты: Эйнштейны

Ошибка 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 ) ) );
Отправить
Поделиться