Операторные скобки
BEGIN ... END
Оператор присваивания
Имя переменной = выражение;
7.7 Операторы циклов.
Оператор условного перехода IF... THEN ... ELSE
IF (<условие>) THEN
< оператор 1> [ELSE
< оператор 2>]
Оператор цикла FOR SELECT ... DO
FOR
<оператор SELECT>
DO
< оператор>;
Оператор условного цикла WHILE ... DO
WHILE (<условие>)
DO < оператор>
7.8 Оператор выбора SELECT.
SELECT AVG(KOLVO), SUM(KOLVO) FROM RASHOD
WHERE TOVAR = :INJTOVAR
INTO :AVG_KOLVO, :SUM_KOLVO;
Отличие в предложении INTO
Оператор SUSPEND возвращает полученные значения в приложение.
7.9 Операторы.
Оператор завершения алгоритма
EXIT
Оператор вызова EXECUTE PROCEDURE
EXECUTE PROCEDURE имя [параметр [, параметр …]]
[RETURNING_VALUES параметр [, параметр ...]];
Оператор генерации события POST _EVENT
POST_EVENT "Имя события";
7.10 Подразделы SQL.
Data Definition Language (DDL) – язык определения данных. Те операторы, которые затрагивают структуру данных. Создают, изменяют и удаляют объекты метаданных. Операторы – CREATE, ALTER, DROP.
Data Manipulation Language (DML) – язык управления данными. Операторы INSERT, UPDATE, DELETE.
Data Control Language (DCL) – управление доступом к данным. Привилегии пользователей. Операторы GRANT и REVOKE.
Transaction Control Language (TCL) – язык управления изменениями, сделанными группами пользователей. Управление транзакциями. Операторы START TRANSACTION, COMMIT, ROLLBACK.
Cursor Control Language (CCL) – язык определения и управления курсором для подготовки выполнения SQL
7.11 Алгоритмический язык.
Язык проектирования триггеров и хранимых процедур включает:
1. DML и оператор SELECT.
2. Операторы и выражения, включая UDF, связанные с БД и генераторы.
3. Инструкции присвоения,
control – flow инструкции,
контекстные переменные только для триггеров,
инструкции обработки событий,
инструкции обработки ошибок.
7.12 Проектирование ХП.
7.13 Порядок действий.
Для проектирования ХП необходимо выполнить следующие действия:
1. Выделить пункт «Процедуры».
2. Вызвать контекстное меню.
3. Выбрать пункт «Новая процедура».
4. В открывшемся окне редактора задать:
- имя новой процедуры;
- входные и выходные параметры;
- код тела процедуры;
5. Выполнить команду компиляции кода (Ctrl+F9).
7.14 Код ХП для IBConsole.
SET TERM ^ ;
CREATE PROCEDURE COL_EMP
RETURNS (NUM_D INTEGER, CNT_EMP INTEGER)
AS BEGIN
FOR SELECT EMPLOYEE.NUM_D, count(EMPLOYEE.TAB_NUM)
FROM EMPLOYEE
GROUP BY EMPLOYEE.NUM_D
INTO :NUM_D, :CNT_EMP
DO SUSPEND; END ^
SET TERM ; ^
7.15 Выполнение ХП.
Выполнение ХП действия FIND_COL учебного примера.
По заданному наименованию подразделения, подсчитывается количество телефонов в нем.
7.16 Вызов из SQL - редактора.
Для защиты лабораторной обязательно знание вызова процедуры в окне редактора SQL – запросов.
Для вызова процедур действия:
EXECUTE PROCEDURE FIND_COL
(‘Кафедра информационных систем’)
Для вызова процедур выбора:
SELECT * FROM D_ARX(2006)
7.17 Изменение ХП.
Изменение хранимой процедуры производится оператором:
ALTER PROCEDURE ИмяПроцедуры
[(входной_параметр тип_данных
[,входной_параметр тип_данных...])]
[RETURNS (выходной_параметр тип_данных
[,выходной_параметр тип_данных ...])]
AS
<тело процедуры>;
7.18 Удаление ХП.
Для удаления хранимой процедуры из базы данных используется оператор:
DROP PROCEDURE ИмяПроцедуры;
7.19 Функции агрегирования.
Для построения сложных алгоритмов проверки используются агрегатные функции:
AVG(), SUM(), COUNT(),
MAX(), MIN(),
CAST(),
UPPER(),
EXTRACT()
и оператор SELECT с использованием ключевых слов
DISTINCT, GROUP BY, HAVING, LIKE и др.
7.20 EXTRACT().
Эта функция позволяет извлекать из полей типа даты значения месяца, дня, года, часов, минут и секунд для сравнения в предложении where.
extract (year from arx_emp.dat_izm) = :d_emp
month
day
hour
minute
second
Функция позволяет вычислять интервалы времени в годах, месяцах, часах и т.д.
7.21 Вопрос.
Какой тип данных имеет переменная d_emp ?
1. DATE.
2. INTEGER.
3. TIMESTAMP.
4. NUMERIC().
5. Любой из перечисленных.
7.22 Пример.
Пример использования в операторе, извлечения года из поля даты:
for select
S_NUM, TAB_NUM, FIRST_NAME, LAST_NAME, PHONE, NUM_T, NUM_D, DEISTV
from arx_emp where
extract(year from arx_emp.dat_izm) = :d_emp
into :s_num, :tab_num, :first_name, :last_name, :phone, :num_t, :num_d, :deistv
do
7.23 Текущие параметры.
Для задания значения текущего времени используются следующие служебные операторы:
CURRENT_DATE
CURRENT_TIME
CURRENT_TIMESTAMP
Например:
UPDATE TablName SET Name Field = CURRENT_TIME;
7.24 Вопрос.
Функция EXTRACT() позволяет извлекать компоненты из полей типа?
1. DATE.
2. TIME.
3. TIMESTAMP.
4. Только DATE и TIMESTAMP.
5. Нет правильного ответа.
7.25 Привилегии пользователя.
Для вызова хранимой процедуры из приложения, пользователю или объекту требуется привилегия EXECUTE на нее, задаваемая оператором:
GRANT
EXECUTE ON PROCEDURE ИмяПроцедуры
TO {<Пользователь>} ;
На момент выполнения операторов все объекты метаданных и пользователи должны быть определены.
7.26 Приложение Delphi.
Демонстрация работы хранимых процедур при помощи вызова их в среде разработки Delphi.
Для обращения к хранимой процедуре выбора в приложении клиента используется компонент TQuery. Вызов хранимой процедуры производится в предложении FROM оператора SELECT с указанием входных параметров процедуры. Выходные параметры процедуры (все или часть) указываются в качестве возвращаемых значений оператора SELECT.
Компонент IBStoredProc предназначен для вызова хранимых процедур действия SQL - сервера. Для вызова каждой хранимой процедуры в приложении лучше использовать собственный компонент.
7.27 Технология IBExpress.
Вкладка Delphi – «InterBase». Компоненты:
7.28 Вызов ХП выбора.
Новый проект с одной формой для вызова ХП «FIND_DIV»
7.29 Соединение с БД.
Для настройки параметров соединения вызываем окно редактора (Database Editor) компонента базы данных и устанавливаем имя пользователя, пароль, кодировку символов и убираем флаг в поле Login Prompt, после чего можно активизировать соединение.
7.30 Связи компонентов.
1. IBTransaction и IBDatabase
2. IBQuery и IBDatabase
3. DataSource и IBQuery
4. DBGrid и DataSource
Демонстрация проектирования приложения.
7.31 Параметры Query.
Для задания свойства SQL используется окно редактора запросов, вызов которого осуществляется нажатием поля этого свойства или выбором функции Edit SQL всплывающего меню компонента.
SELECT * FROM FIND_DIV(:in_divis),
Свойство SQL может определяться на стадии выполнения программы, через вызов соответствующего метода. В этом случае один компонент Query может использоваться для вызова различных процедур.
Свойство Params позволяет задать в Инспекторе Объектов свойство нашего параметра in_divis:
ParamType – ptInput,
DataType – ftString.
7.32 Код вызова.
Для запуска процедуры будем использовать событие от нажатия кнопки, в обработчик которого, записываем следующий код:
procedure TForm1.Button1Click(Sender: TObject);
begin
IBQuery1.Close;
IBQuery1.ParamByName('in_divis').Value := StrToInt(Edit1.Text);
IBQuery1.Open;
end;
После выполнения всех действий проект компилируется и в запущенном приложении проверяется работа процедуры.
7.33 Ошибки.
Нет соединения с БД, не запущен сервер.
Не преобразован тип данных параметров.
Превышение лимита подключений клиентов.
Используется не тот метод, или не в той последовательности.
Выбрана не та процедура.
Работа не с тем файлом БД, копия файла в другом каталоге.
7.34 Вызов ХП действия.
Для вызова хранимой процедуры действия из приложения клиента используется специальный класс компонентов TStoredProc.
Рассмотрим последовательность действий для вызова процедуры INS_DIV, выполняющей добавление записи в таблицу DIVISION, содержащий код:
BEGIN
INSERT INTO DIVISION (NUM_DIV, NAME_DIV, "LEVEL", MAIL_DIV)
VALUES (:NUM_D, :NAME_D, :LEVELS, :e_mail);
END
В процедуре определяется четыре входных параметра
NUM_D, :NAME_D, :LEVELS, :e_mail
в соответствии с полями таблицы.
7.35 Проверка в Expert.
В среде проверка работы процедуры производится двумя способами, выполнением SQL оператора и запуском с консоли:
7.36 Приложение.
Добавляем в проект с вкладки InterBase поочередно следующие компоненты: IBTable; IBStoredProc. Для ввода значений параметров добавляем с вкладки Standard три компонента Edit. В результате форма примет вид:
7.37 Связи компонентов.
1. IBTransaction и IBDatabase
2. IBTable и IBDatabase, выбрать таблицу
3. IBStoredProc и IBDatabase, выбрать процедуру
4. DataSource и IBTable
5. DBGrid и DataSource
Демонстрация.
7.38 Параметры StoredProc.
Настройка свойств компонента хранимой процедуры заключается в выборе имени требуемой процедуры, свойство StoredProcName. После чего можно просмотреть созданные параметры:
0 – NUM_DIV;
1 – NAME_DIV;
2 – LEVELS;
3 – E_MAIL.
Определение типа данных происходит автоматически, в соответствии с типами данных Delphi, как и индексация параметров.
7.39 Код вызова.
В обработчике TForm1.Button1Click (Sender: TObject), сделаем следующие изменения:
{IBQuery1.Close;
IBQuery1.ParamByName('D_EMP').Value := StrToInt(Edit1.Text);
IBQuery1.Open;}
IBStoredProc1.ParamByName('NUM_DIV').Value:=StrToInt(Edit1.Text);
IBStoredProc1.ParamByName('NAME_DIV').Value:=(Edit2.Text);
IBStoredProc1.ParamByName('LEVELS').Value:=StrToInt(Edit3.Text);
IBStoredProc1.ParamByName('E_MAIL').Value:=(Edit4.Text);
IBStoredProc1.ExecProc;
IBTable1.Refresh;
Обратить внимание на отсутствие ограничений полей.
7.40 Вопрос.
Сколько раз в разработанном приложении можно нажать на клавишу «Button1» с введенным набором данных, без появления ошибки?
1. Один.
2. Любое количество раз.
3. По одному разу для каждого нового набора данных.