Типичные процедуры.
Хранимые процедуры представляют собой подпрограммы, реализованные на языке SQL.
Пример процедуры добавления данных для таблицы «Предприятия»:
ALTER PROCEDURE P_ENTR_INSERT
(
PNAME VARCHAR(60) CHARACTER SET WIN1251, /*Название предприятия*/
PADDRESS VARCHAR(60) CHARACTER SET WIN1251, /*Адрес предприятия*/
PPHONE VARCHAR(30) CHARACTER SET WIN1251, /*Телефон предприятия*/
PCOMMENT VARCHAR(300) CHARACTER SET WIN1251 /*Комментарий*/
)
AS
BEGIN
INSERT INTO ENTERPRISES (NAME,ADDRESS,PHONE,COMMENT,ENTKEY) //добавление
данных в таблицу
VALUES (:PNAME, :PADDRESS, :PPHONE, :PCOMMENT, 0);
END
В данной процедуре поступающие на вход данные добавляются в таблицу «Предприятия». При добавлении данных происходит автоматическое обращение к соответствующему генератору, и в поле ключа заносится уникальное значение.
Пример хранимой процедуры выдачи информации о количестве связанных записей с каждой записью таблицы «Предприятия», хранящихся в её подчинённых таблицах (т. е. выполняющей проверку на полноту):
ALTER PROCEDURE CHECK_FOR_FULL_ENTR
RETURNS
(
ENTK INTEGER, /*Ключ записи в таблице «Предприятия»*/
ECPARS INTEGER, /*Количество записей в таблице «Экономические показатели»*/
MBASE INTEGER, /*Количество записей в таблице «Материальная база»*/
SEC INTEGER, /*Количество записей в таблице «Режимы предприятия»*/
ARCH INTEGER, /*Количество записей в таблице «Архив»*/
IZD INTEGER /*Количество записей в таблице «Изделия»*/
)
AS
BEGIN
FOR SELECT ENTKEY FROM ENTERPRISES /*Для каждой записи из таблицы «Предприятия»…*/
INTO :ENTK /*Выдаём ключ*/
DO
BEGIN
SELECT COUNT(NUMBER) FROM ECONOMICPARAMS
WHERE ENTKEY=:ENTK /*Выдаём кол-во связанных записей в таблице «Экономические показатели»*/
INTO :ECPARS;
SELECT COUNT(NUMBER) FROM MATHERIALBASE
WHERE ENTKEY=:ENTK /*Выдаём кол-во связанных записей в таблице «Материальная база»*/
INTO :MBASE;
SELECT COUNT(SECKEY) FROM SECURITY
WHERE ENTKEY=:ENTK /*Выдаём кол-во связанных записей в таблице «Режимы предприятия»*/
INTO :SEC;
SELECT COUNT(NUMBER) FROM ARCHIVE
WHERE ENTKEY=:ENTK /*Выдаём кол-во связанных записей в таблице «Архив»*/
INTO :ARCH;
SELECT COUNT(IZDKEY) FROM IZDELIE
WHERE ENTKEY=:ENTK /*Выдаём кол-во связанных записей в таблице «Изделия»*/
INTO :IZD;
SUSPEND; /*Передаём параметры (т. е. строку таблицы) клиенту */
END
END
При обращении к процедуре для каждой записи таблицы предприятия производится подсчёт связанных с ней записей в подчинённых таблицах. На выходе процедуры – таблица с числовыми значениями.
Аналогично выполняется подсчёт в таблицах, связанных с таблицей «Изделия».
Пример процедуры проверки на полноту знаний в таблицах, связанных с таблицей «Предприятия»:
erez:=false;//Признак неполноты. Устанавливается в true, если нашли неполноту.
EntrDataModule.CheckEntrQuery.FindFirst;//Переходим на первую запись информации с сервера
repeat
j:=0;//Счётчик внутреннего цикла
repeat
if EntrDataModule.CheckEntrQuery.Fields[j].AsInteger=0 then
erez:=true;//Если нашли неполноту, устанавливаем признак.
inc(j);
until (j=EntrDataModule.CheckEntrQuery.FieldCount) or (erez=true);//Оканчиваем
просмотр, если //просмотрели всю строку или нашли неполноту
if erez=false then //Если неполнота не найдена, переходим к следующей строке
EntrDataModule.CheckEntrQuery.FindNext;
until (EntrDataModule.CheckEntrQuery.RecNo=EntrDataModule.CheckEntrQuery.RecordCount-1) or (erez=true);//Заканчиваем работу, если просмотрели всю таблицу или нашли неполноту.
На вход процедуры проверки полноты знаний поступает информация с сервера, представленная в виде таблицы, в каждой строке которой занесено количество записей, связанных с записью таблицы «Предприятия», номер которой соответствует номеру строки, в каждой из подчинённых таблиц. Если присутствует нулевое значение, то в данном случае это означает, что о предприятии не занесены какие-либо данные, например, производимые изделия, режимы, экономические показатели или показатели материальной базы. Поэтому каждое нулевое значение обозначает неполноту, которую необходимо устранить для того, чтобы модуль логического вывода мог делать адекватные заключения, обращаясь к этой базе знаний.
III. ТЕХНОЛОГИЧЕСКАЯ ЧАСТЬ