Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Разбираемся с выполнением PL/pgSQL блоков в Delphi Rio 10.3.3: использование параметров в TFDConnection/TFDQuery

Delphi , Базы данных , SQL

Вопрос, поднятый в данной теме, заключается в выполнении функций с параметрами в PostgreSQL с использованием анонимных блоков кода в компонентах FireDAC для Delphi. Пользователь столкнулся с проблемой при попытке выполнить PL/pgSQL блок, который содержит вызов функции DoIt с параметрами, используя TFDQuery. Проблема заключалась в том, что параметры не были найдены, и это было связано с особенностями обработки параметров в FireDAC.

Описание проблемы

В базе данных PostgreSQL 11 имеется функция DoIt, которая должна быть вызвана для выполнения действия. Возврат значения не важен, главное, чтобы не было ошибок. Функция имеет аргументы, которые должны быть переданы как параметры. Прямое использование метода TFDConnection.ExecSQL невозможно, так как используется параметр типа массив, который, по мнению пользователя, не поддерживается этим методом. Поэтому используется TFDQuery.ExecSQL. Однако при выполнении кода возникает ошибка "Parameter 'id' not found".

Подтвержденное решение

При назначении значения свойству TFDQuery.SQL FireDAC выполняет предварительную обработку SQL на основе различных опций. Опция ResourceOptions.CreateParams управляет обработкой параметров, которая включена по умолчанию. Предварительный обработчик распознает строковые литералы в SQL и не пытается искать параметры внутри них. В данном случае использовались строковые литералы с двойными кавычками (dollar quoted string constant), и именно это приводило к тому, что FireDAC не распознавал параметры. Правильный способ выполнения хранимой процедуры или функции - использование TFDStoredProc. Нужно назначить свойству StoredProcName имя процедуры и вызвать метод Prepare, который получит метаданные процедуры из базы данных, таким образом, настройка ArrayType или DataType параметра не требуется.

Пример кода

procedure DoItWithStoredProc(Connection: TFDConnection; ID: Integer; const Items: TArray<Integer>);
var
  StoredProc: TFDStoredProc;
  ParamItems: TFDParam;
  Index: Integer;
begin
  StoredProc := TFDStoredProc.Create(nil);
  try
    StoredProc.Connection := Connection;
    StoredProc.StoredProcName := 'DoIt';
    StoredProc.Prepare;
    StoredProc.Params.ParamByName('id').AsInteger := ID;
    if Length(Items) > 0 then
    begin
      ParamItems := StoredProc.Params.ParamByName('items');
      ParamItems.ArraySize := Length(Items);
      for Index := Low(Items) to High(Items) do
        ParamItems.AsIntegers[Index] := Items[Index];
    end;
    StoredProc.ExecProc;
  finally
    StoredProc.Free;
  end;
end;

Альтернативные вопросы

Пользователь также задал вопросы о том, как передать значение по умолчанию для аргумента функции и что делать, если в базе данных есть две функции с одинаковыми именами. FireDAC не поддерживает параметры со значениями по умолчанию, поэтому необходимо передать значения для всех параметров хранимой процедуры. Также было отмечено, что использование перегруженных функций в базе данных может быть сложным, и рекомендуется избегать этого.

Заключение

В данной статье был рассмотрен процесс выполнения PL/pgSQL блоков с параметрами в компонентах FireDAC для Delphi Rio 10.3.3. Предоставлено подтвержденное решение с использованием TFDStoredProc, а также обсуждены альтернативные вопросы, связанные с передачей параметров и работой с перегруженными функциями.

Создано по материалам из источника по ссылке.

Пользователь столкнулся с проблемой выполнения PL/pgSQL функций в Delphi Rio 10.3.3, связанной с использованием параметров в компонентах FireDAC.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: SQL ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-02-10 16:48:32/0.0036399364471436/0