Delphi.FireDAC. Выполнение хранимых процедур и функций

Данная статья посвящена выполнению хранимых процедур в FireDAC. Основой для данной статьи стала официальная документация.

-старая версия

-новая версия

Класс TFDStoredProc может быть использован как designtime так и в runtime. TFDStoredProc генерирует SQL команду для вызова хранимой процедуры, базирующейся на свойствах TFDStoredProc. Перед исполнением, FireDAC отправляет значения параметров к DBMS, и после этого исполняет хранимую процедуру и получает output параметры.

Замечание. FireDAC не поддерживает параметры со значениями по умолчанию. 

Настройка хранимых процедур в Design Time

Чтобы выполнить хранимую процедуру, необходимо бросить компонент TFDStoredProc на форму. Свойство TFDStoredProc.Connection будет автоматически настроено, если на форме есть FDConnection.

Опционально можно установить CatalogName, SchemaName, и PackageName или выбрать их значения из выпадающего списка. После установки StoredProcName и когда fiMeta включено в FetchOptions.Items, коллекция параметров заполняется автоматически.

Чтобы унифицировать имена параметров, можно установить ResourceOptions.UnifyParams в True. Например, это исключит префикс ‘@’ из имен параметров SQL сервера.

Настройка хранимых процедур в RunTime

Аналогично design-time можно использовать следующий код для run-time

Вызов метода Prepare заполняет коллекцию параметров, используя mkProcArgs мета данные, когда fiMeta включено в FetchOptions.Items

При этом

1) Запрос с использованием mkProcArgs может быть затратным по времени.

2) Приложение может не может менять определения параметров после того как они заполнены. Например, выражение TFDParam.AsXxxx неявно устанавливает тип данных параметра.

Чтобы избежать вышеприведенных случаев, исключите fiMeta из FetchOptions.Items, таким образом коллекция параметров не будет перестраиваться автоматически при вызове Prepare. Также, можно заполнять коллекции параметров, перед вызовом Prepare или ExexProc, используя следующий код

Или другой пример

“Запакованные процедуры” (Using Packaged Procedures)

Этот раздел пропущу так как в MySQL нет аналога Packaged Procedures

Выполнение хранимой процедуры 

Если процедура не возвращает множество

Для хранимой процедуры, которая не возвращает множество, необходимо использовать метод ExecProc. Чтобы использовать хранимую функцию, используйте методы ExecProc или ExecFunc methods, где ExecFunc возвращает значение функции. Если хранимая процедура возвращает множество, мы получим ошибку “[FireDAC][Phys][Oracl]-310. Cannot execute command returning result sets”.

Примеры использования

или более компактно

Если процедура возвращает множество

Чтобы использовать хранимую процедуру, возвращающую множество, используйте методы Open. Если хранимая процедура не возвращает множество при использовании метода Open, то мы получим ошибку [FireDAC][Phys][Oracl]-308. Cannot open / define command, which does not return result sets. Если хранимая процедура возвращает несколько множеств, то можно посмотреть раздел Command Batches

Пример использования


Использование TFDQuery

Главное различие между TFDStoredProc и TFDQuery в том, что TFDStoredProc автоматически генерирует вызов хранимой процедуры, используя информацию из параметров. SQL код, вызывающий хранимую процедуру может быть исполнен прямо, используя любой метод FireDAC для исполнения команд SQL.

Например, таким образом

 


Использование TFDCommand

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


ПРАКТИКА

Простейший пример с хранимой процедурой без параметров

Разберем несколько примеров. Начнем с простого, создадим на сервере простейшую хранимую процедуру.

Добавим её на сервер через консоль

4

Теперь проверим есть ли она там на самом деле через следующую инструкцию

Да, действительно процедура добавлена и мы видим следующее

5

Теперь далее, попробуем вызвать нашу процедуру при помощи следующего кода

6

Всё Ок, на сервере процедура работает. Теперь попробуем её вызвать в клиенте Delphi таким образом.

Построим такого клиента (новое VCL приложение)

7

В свойстве FDStoredProc1.StoredProcName укажем следующее значение

На кнопке сделаем такой код

Результат

8

 


Пример хранимой процедуры с входными параметрами

Теперь создадим на сервере простейшую хранимую процедуру с параметрами.

Добавим и проверим её…

9

Вроде все на месте, теперь пробуем в клиенте Delphi с помощью FireDAC

Немного преобразим форму, добавив пару компонент и кнопок…

11

После того как в объектном инспекторе мы выбираем свойство FDStoredProc2.StoredProcName  у нас автоматически заполняются параметры процедуры в свойстве FDStoredProc2.Params

Результат

10

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

Пример хранимой процедуры с выходным параметром

Тестируем в консоли…

12

Тестируем в Delphi, добавим пару компонентов на форму

13

Теперь код на кнопке call_sqrt

Результат

14

 

by Stanislav_Panteleev