Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Fondovi-lekcii.doc
Скачиваний:
20
Добавлен:
10.11.2018
Размер:
4.09 Mб
Скачать

2. Використання збережуваних процедур в Delphi.

В Delphi використання збережуваних процедур забезпечується компонентом TStoredProc. За його допомогою програма може використовувати як виконувані процедури, так і процедури відбору. Так як компонент TStoredProc є нащадком TDBDataSet, то результатом його роботи може бути виконання модифікацій на сервері без повернення результату, одиничний результат або набір даних.

Доступ компонента до бази даних здійснюється через властивість DatabaseName. Збережувана процедура задається її іменем у властивості StoredProcName. При створенні клієнтської програми в архітектурі клієнт/сервер для з’єднання з сервером бажано використовувати компонент TDatabase.

Якщо збережувана процедура не має вхідних параметрів, то для її виконання використовується метод ЕхесPгос. Наприклад, компонент StoredРroc1 можна пов’язати з деякою збережуваною процедурою:

StoredProcl.DatabaseName := 'IBLOCAL';

StoredProc1.StoredProcName := 'GetSomeVaiue';

StoredProc1.ExecProc;

Якщо збережувана процедура має вхідні параметри, то для їх визначення використовується властивість params типу TРarams. Для збережуваної процедури вхідні параметри задаються так:

StoredProcI.Params[0].AsDateTime := Now;

StoredProcI.Params[1].As Integer := SpinEditI.Value;

StoredProcI.Params[2].AsString := Editl.Text;

StoredProcI.ExecProc;

Після завдання вхідних параметрів за допомогою властивості params необхідно підготувати процедуру до виконання. Для цього використовується метод prepare. Після виконання процедури необхідно звільнити заняті ресурси. Цю роботу виконує метод unprepare:

StoredProcI.Params[0].AsDateTime := Now;

StoredProcI.Params[1].Aslnteger := SpinEditI.Value;

StoredProcI.Params[2].AsString := Editl.Text;

StoredProcI.Prepare;

StoredProcI.ExecProc;

StoredProcI.UnPrepare;

Ці два методи має смисл використовувати лише в тому випадку, якщо після підготовки процедури вона буде викликана досить велике число разів підряд. Це пов’язано з тим, що збережувана процедура готується сервером до виконання в довільному випадку. При явному виклику метода prepare підготовка виконується лише один раз. Тому наступний багатократний виклик процедури буде виконаний швидко. Якщо в цій ситуації не вказати метод prepare, то при кожному виклику сервер буде виконувати підготовку процедури знову і знову.

Для работи з параметрами також можна використати метод paramByName, який повертає потрібний параметр зао його іменем:

StoredProcI.ParamByName('MaxDate').AsDateTime := Now;

StoredProcI.Prepare;

StoredProcI.ExecProc;

Якщо збережувана процедура повертає одиничний результат, то його можна одержати в вихідному параметрі (або декількох вихідних параметрах). Для цього можна знову скористатися методом ParamByName або властивістю Params:

with StoredProcl do begin Params[0].AsString := Edit1.Text;

Prepare ;

ExecProc;

UnPrepare;

Labell.Caption := Params[3].AsString;

end;

Зверніть увагу, що порядок слідування параметрів збережуваної процедури в програмі повинен відповідати порядку в декларації цієї процедури на сервері.

Якщо сервер підтримує виконання збережуваних процедур, що повертають набори даних, то для їх використання досить відкрити набір даних компонента TStoredРroc за допомогою метода Оpen. Якщо ця можливість не підтримується, то для одержання набору даних збережуваної процедури можна скористатися запитом SQL, який здійснює виклик процедури. Після активізації такого запиту в його наборі даних виявиться результат виконання збережуваної процедури.

Для збереження і виконання збережуваних процедур під час виконання клієнтських програм можна використовувати компонент TQuery. Продемонструємо це на прикладі збережуваної процедури для сервера InterBase, який повертає в результаті набір даних.

Для створенні збережуваної процедури використовується запит з оператором CREATE PROCEDURE.

CREATE PROCEDURE SumOrders (OrdDat DATE)

RETURNS (DocNo VARCHAR(IO), OrdSum INTEGER) AS BEGIN FOR

SELECT DocNo, SUM(ItemCount*Price)

FROM ArchOrders

WHERE OrdDat > :OrdDat

GROUP BY DOCNO

INTO :DocNo, :OrdSum DO

SUSPEND;

END

Для виконання збережуваної процедури компонент TQuery повинен містити такий запит:

SELECT * FROM SumOrders ('01.09.99')

В результаті в наборі даних запиту будуть міститися суми всіх замовлень після 1 вересня 1999 г.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]