Компонент TStoredProc
Процедура действия возвращает один экземпляр значения выходного параметра или группы параметров. Этим она отличается от хранимой процедуры выбора, которая за одно выполнение способна возвратить несколько экземпляров выходных параметров.
В утилите WISQL InterBase хранимую процедуру действия можно вызвать при помощи оператора
EXECUTE PROCEDURE имя [параметр [, параметр ...|];
Например, вызов процедуры STOIM с указанием двух входных параметров приведет к выдаче значения выходного параметра в окне результатов WISQL (рис. 28.3).
При помощи WISQL удобно отлаживать хранимые процедуры действия, а также производить пробные запуски хранимых процедур выбора, которые в этом случае возвращают только первую строку результирующего для процедуры набора данных (то есть первый экземпляр выходных параметров). После отладки синтаксиса и получения правдоподобных результатов последующую отладку процедур выбора следует производить в приложении клиента.
Из приложения клиента процедуру действия вызывают при помощи компонента TStoredProc. Для этого в его свойство DatabaseName помещают псевдоним удаленной БД, в которой расположена хранимая процедура. Затем выбирают имя соответствующей хранимой процедуры из выпадающего списка в свойстве StoredProcNawe компонента TStoredProc. При этом происходит считывание имен входных и выходных параметров и их типов. Их можно увидеть, нажав кнопку (...) в свойстве Params или вызвав редактор определения параметров компонента TStoredProc. Для этого необходимо сделать компонент текущим, нажать правую кнопку мыши и в появившемся меню выбрать опцию Define Parameters. Вид представления параметров в редакторе определения параметров компонента TStoredProc показан на рисунке 28.4.
В окне Parameter Name указываются имена параметров. Поле Parameter Type устанавливает тип параметра (Input, Output). Поле Data Type определяет тип данных параметра. Поле Value устанавливает значение параметра по умолчанию.
ЗАМЕЧАНИЕ.
При считывании характеристик параметров непосредственно из хранимой процедуры Delphi блокирует кнопки Add, Delete, Clear, предназначенные для добавления, удаления, очистки характеристик параметра. Для других случаев параметры можно определять явно. При этом необходимо заботиться о соответствии типов данных параметров процедуры и компонента TStoredProc. Имена параметров и порядок их следования могут не совпадать с именами и порядком следования параметров в хранимой процедуре на сервере. В этом случае указать соответствие параметров компонента и процедуры на сервере можно, используя свойство компонента TStoredProcproperty ParamBindMode: TParamBindMode;
для которого допустимы значения
pbByName
- (по умолчанию) соответствие параметров ведется по именам (имена одинаковых параметров в компоненте и процедуре на сервере должны совпадать);pbByNumber
- соответствие параметров производится по их порядковым номерам: производится попытка первый по порядку параметр компонента соотнести с первым по порядку параметром процедуры на сервере, второй - со вторым и т.д.Установить значения входных параметров и получить значения выходных параметров процедуры можно, используя метод
function ParamByName(const Value: string): TParam;
Например,
// входной параметр StoredProc2.ParamByName('IN_TOVAR').Value :=
Table1.FieldByName('TOVAR').Value;
// выходной параметр
Label5.Caption := IntToStr(StoredProc2.ParamByName('MAX_KOLVO').Value) ;
Перед выполнением процедуры нужно произвести связывание параметров компонента TStoredProc и параметров хранимой процедуры при помощи метода
procedure Prepare;
Вызов хранимой процедуры действия осуществляется методом procedure ExecProc;
Пример.
Пусть на сервере определены хранимые процедуры действия FIND_MAX_KOLVO и STOIM. Осуществим их вызов из клиентского приложения, написанного на Delphi.Процедура FIND_MAX_KOLVO возвращает в выходном параметре MAX_KOLVO максимальную партию отгруженного товара, наименование которого передается во входном параметре IN_TOVAR:
CREATE PROCEDURE FIND_MAX_KOLVO (IN_TOVAR VARCHAR(20))
RETURNS(MAX_KOLVO INTEGER) AS
BEGIN
SELECT MAX(KOLVO) FROM RASHOD WHERE TOVAR = : IN_TOVAR INTO : MAX_KOLVO;
SUSPEND;
END
Процедура STOIM возвращает стоимость количества товара. Параметр IN_KOLVO определяет число единиц товара; IN_TOVAR определяет название товара.
CREATE PROCEDURE STOIM (IN_TOVAR VARCHAR (20) , IN_KOLVO INTEGER)
RETURNS(OUT_STOIM INTEGER) AS
DECLARE VARIABLE ZENA_ED INTEGER;
BEGIN
SELECT ZENA FROM TOVARY WHERE TOVAR = :IN_TOVAR INTO : ZENA_ED;
OUT_STOIM = ZENA_ED * IN_KOLVO;
END
Расположим в форме:
1. компонент TTable, ассоциированный с таблицей TOVARY, для выбора названия товара для его передачи в хранимую процедуру как входного параметра;
2. компонент TStoredProc (имя StoredProc!) для выполнения процедуры STOIM;
3. компонент TStoredProc (имя StoredProc2) для выполнения процедуры FIND_MAX_KOLVO;
4. компонент TButton для инициации выполнения хранимых процедур;
5. два компонента TLabel для визуализации результатов выполнения процедуры.
Напишем обработчик нажатия кнопки, в котором происходит присваивание значений входных параметров и получение значений выходных параметров процедур:
procedure TForm1.Button1Click(Sender: TObject);
begin
StoredProc2.UnPrepare;
StoredProc1.UnPrepare;
StoredProc1.ParamByName('IN_TOVAR').Value := Table1.FieldByName('TOVAR').Value;
StoredProc1.ParamByName('IN_KOLVO').Value := StoredProc2.ParamByName('MAX_KOLVO').Value;
StoredProc1.Prepare;
StoredProc1.ExecProc;
Label3.Caption :=IntToStr(StoredProc!.ParamByName('OUT_STOIM').Value) ;
StoredProc2.ParamByName('IN_TOVAR').Value := Table1.FieldByName('TOVAR').Value;
StoredProc2.Prepare;
StoredProc2.ExecProc;
Label5.Caption := IntToStr(StoredProc2.ParamByName('MAX_KOLVO').Value) ;
end;
Результат работы приложения приведен на рисунке 28.5.
Рис. 28.5. Значения максимального отпуска товара (количество и стоимость) возвращаются хранимой процедурой выбора как выходные параметры