При работе с базами данных Oracle и разработке приложений на Delphi может возникнуть проблема, связанная с некорректным определением типов данных при импорте хранимой процедуры из Oracle XE. Особенно это касается случаев, когда в параметрах хранимой процедуры используются целые числа.
Описание проблемы
Пользователь столкнулся с проблемой, когда при импорте хранимой процедуры из Oracle XE 11g в Delphi XE2, параметры, содержащие целые числа, отображались в компоненте tSQLStoredProc как ftFMTBcd, вместо ожидаемого ftInteger. Это приводило к ошибке ORA-05602 при вызове процедуры, если параметры были объявлены как IN. При этом, если параметры были объявлены как OUT, передача данных происходила корректно.
Проблема заключалась в том, что сервер Datasnap не мог корректно преобразовать поле ftFMTBcd в целое число и отправлял в Oracle пустую строку вместо ожидаемого числа или числа с плавающей точкой.
Пример кода хранимой процедуры
CREATE TABLE achristo_adm.paalogget(
paaloggetID NUMBER(38, 0) NOT NULL,
utstyrID NUMBER(38, 0),
BrukerID NUMBER(38, 0),
sist_paalogget TIMESTAMP(6),
CONSTRAINT PK22 PRIMARY KEY (paaloggetID)
USING INDEX
LOGGING)
LOGGING;
PROCEDURE registrer_paalogget(
FUTSTYRID IN INTEGER,
FBRUKERID IN INTEGER,
FSIST_PAALOGGET IN TIMESTAMP,
fpaaloggetID OUT INTEGER) AS paaloggetC hl_recur_typ;
BEGIN
-- Код процедуры
END registrer_paalogget;
Потенциальные решения проблемы
Изменить параметры соединения TSQLConnection перед его использованием, добавив следующие строки в обработчик события AfterConnect:
pascal
SQLConnection.Params.Values['EnableBCD'] := 'true';
SQLConnection.Params.Values['IntegerPrecision']:= '10';
Также можно изменить типы параметров хранимой процедуры с INTEGER на NUMBER(10,0).
Переписать все методы хранимой процедуры так, чтобы использовать строки в качестве параметров, а затем преобразовывать их в целые числа перед вызовом оригинальной процедуры.
Использовать тип данных NUMBER(19, 0) в Oracle, что соответствует BIGINT, вместо NUMBER(38, 0), который в реальности представляет собой 128-битное целое, не поддерживаемое в 32-битной версии Delphi.
Убедиться, что все файлы клиента Oracle (oci.dll и т.д.) являются последними версиями и не используются устаревшие версии из установки сервера.
Подтвержденное решение
Проблема может быть связана с использованием устаревших файлов клиента Oracle, которые активируются из-за неправильного указания пути к исполняемому файлу сервера Oracle. Убедитесь, что все файлы клиента Oracle обновлены до последней версии.
Заключение
При работе с импортом хранимой процедуры из Oracle в Delphi важно тщательно проверять типы данных и параметры соединения. В случае возникновения проблем, рекомендуется обратить внимание на версии клиентских библиотек Oracle и правильность их конфигурации.
Пользователь столкнулся с проблемой несоответствия типов данных при импорте хранимой процедуры из Oracle XE в Delphi XE2, что вызывало ошибку при выполнении процедуры.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS