CREATE PROCEDURE
Описание
CREATE PROCEDURE определяет новую сохраненную процедуру в базе данных. Сохраненная процедура это отдельная программа, написанная на языке процедур и триггеров InterBase, и сохраненная как часть метаданных базы данных. Сохраненные процедуры могут принимать входные параметры из и возвращать значения в приложение.
Язык процедур и триггеров InterBase включает все инструкции SQL манипулирования данными и некоторые мощные улучшения, включающие: IF ... THEN ... ELSE, WHILE ... DO, FOR SELECT ... DO, исключительные ситуации и обработку ошибок.
Имеются два вида процедур:
- Процедуры выбора, которые приложения могут использовать вместо таблиц или видов в инструкции SELECT. Процедура выбора должна быть определена для возвращения одного или более значений, иначе результатом выполнения процедуры будет ошибка.
- Выполняемые процедуры, которые приложения могут непосредственно вызывать в инструкции EXECUTE PROCEDURE. Выполняемая процедура не требует возвращать значения вызываемой программе.
Сохраненные процедуры состоят из заголовка и тела.
Заголовок процедуры содержит:
- Имя сохраненной процедуры, которое должно быть уникальным среди имен процедур и таблиц в базе данных.
- Факультативный список входных параметров и их типов данных, которые процедура принимает из вызывающей программы.
- Следующий за ключевым словом RETURNS список выходных параметров и их типов данных, если процедура возвращает значения в вызывающую программу.
Тело процедуры содержит:
- Факультативный список локальных переменных и их типов данных.
- Блок инструкций на языке процедур и триггеров InterBase, ограниченный BEGIN и END. Блок может включать в себе другие блоки, так, чтобы имелось несколько уровней вложения.
Важно: Так как каждая инструкция в теле сохраненной процедуры должна завершатся точкой с запятой, вы должны определить другой символ для завершения инструкции CREATE PROCEDURE в ISQL. Используйте SET TERM пред CREATE PROCEDURE чтобы определить терминатор отличный от точки с запятой. После инструкции CREATE PROCEDURE, включите SET TERM, что бы изменить терминатор обратно к точке с запятой.
InterBase не позволяет изменения базы данных, которые воздействуют на поведение существующих процедур (т.к. DROP TABLE, DROP EXCEPTION). Для просмотра, всех процедур определенных для текущей базы данных или текста и параметров именованной процедуры, используйте внутренние команды ISQL, SHOW PROCEDURES или SHOW PROCEDURES procedure.
Язык процедур и триггеров InterBase это полный язык программирования для сохраненных процедур и триггеров. Он включает:
- Инструкции SQL манипулирования данными: INSERT, UPDATE, DELETE и singleton SELECT.
- Операторы и выражения SQL, включая UDF's связанные с базой данных и генераторы.
- Мощно расширяет SQL, включая инструкции присвоения, control-flow инструкции, контекстные переменные (для триггеров), even-posting инструкции, исключительные ситуации и инструкции обработки ошибок.
Следующая таблица суммирует расширения языка для сохраненных процедур:
Инструкция | Описание |
---|---|
BEGIN ... END |
Определяет блок инструкций, которые выполняются как одно. Ключевое слово BEGIN начинает блок; ключевое слово END завершает блок. Не должен сопровождаться точкой с запятой. |
variable = expression |
Инструкция присвоения, которая присваивает значение выражения переменной, локальной переменной, входному параметру или выходному параметру. |
/* comment_text */ |
Комментарий к программы, где comment_text может быть текстом содержащим любое количество сток. |
EXCEPTION exception_name |
Поднимает именованную исключительную ситуацию. Исключительная ситуация - определенная пользователем ошибка, которая может быть обработана инструкцией WHEH. |
EXECUTE PROCEDURE
|
Выполняет сохраненную процедуру proc_name с входными аргументами следующими за именем процедуры, возвращаемыми значениями в выходных аргументах перечисленных следом за RETURNING_VALUES. |
EXIT |
Переходы к завершающей инструкции END в процедуре. |
FOR <select_statement>
|
Повторение инструкции или блока, который следует за DO, для каждой допустимой
строки возращенной <select_statement>.
|
IF (<condition>)
|
Проверяет <condition>, и если оно TRUE, выполняет
инструкцию или блок, следующий за THEN; иначе, выполняет инструкцию или блок
следующий за ELSE, если он существует.
|
POST event_name |
Отправляет сообщение event_name. |
SUSPEND |
В проседуре выбора SUSPEND возвращает выходные значения, если любой, вызываемому приложению. Не рекомендуется для исполняемых процедур |
WHILE (<condition>)
|
Пока <condition> TRUE, выполняется <compound_statement> Первое <condition> проверяется и если оно TRUE, то выполняется <compound_statement>. Эта последовательность повторяется пока <condition> не перестанет быть TRUE. |
WHEN
|
Инструкция обработки ошибок. Когда одна из определенных ошибок
происходит, выполняется <compound_statement>.
Инструкция WHEN, если присутствует, должна находится в конце блока,
непосредственно перед END.
|
|
Синтаксис
CREATE PROCEDURE name [(param <datatype> [, param <datatype> ...])] [RETURNS <datatype> [, param <datatype> ...])] AS <procedure_body> [terminator] <procedure_body> = [<variable_declaration_list>] <block> <variable_declaration_list> = DECLARE VARIABLE var <datatype>; [DECLARE VARIABLE var <datatype>; ...] <block> = BEGIN <compound_statement> [<compound_statement> ...] END <compound_statement> = {<block> | statement;} <datatype> = { {SMALLINT | INTEGER | FLOAT | DOUBLE PRECISION} | {DECIMAL | NUMERIC} [(precision [, scale])] | DATE | {CHAR | CHARACTER | CHARACTER VARYING | VARCHAR} [(int)] [CHARACTER SET charname] | {NCHAR | NATIONAL CHARACTER | NATIONAL CHAR} [VARYING] [(int)]}
Аргумент | Описание |
---|---|
name |
Имя процедуры. Должно быть уникальным среди процедур, таблиц и видов. |
param <datatype> |
Входной параметр, который вызывающая программа использует, чтобы передать
значения процедуре.
|
RETURNS param <datatype> |
Выходной параметр, который процедура использует, чтобы вернуть значения в
вызывающую программу.
|
AS |
Ключевое слово, которое разделяет заголовок процедуры и тело процедуры. |
DECLARE VARIABLE var <datatype> |
Объявляет локальные переменные используемые только в процедуре. Каждому
объявлению должно предшествовать DECLARE VARIABLE и должно завершатся точкой с
запятой (;).
|
statement |
Любая одиночная инструкция в языке процедур и триггеров InterBase. Каждая инструкция (исключая BEGIN и END) должна завершатся точкой с запятой (;). |
terminator |
Терминатор определенный SET TERM, который указывает завершение тела процедуры. Используется только в ISQL |
Примеры
Следующая процедура SUB_TOT_BUGET берет номер отдела в качестве входного параметра и возвращает сумму бюджетов, средний, минимальный и максимальный бюджет департаментов с определенным HEAD_DEPT:
/* Compute total, average, smallest, and largest department budget. *Parameters: * department id * *Returns: * total budget * average budget * min budget * max budget */ SET TERM !! ; CREATE PROCEDURE sub_tot_budget (head_dept CHAR(3)) RETURNS (tot_budget DECIMAL(12, 2), avg_budget DECIMAL(12, 2), min_budget DECIMAL(12, 2), max_budget DECIMAL(12, 2)) AS BEGIN SELECT SUM(budget), AVG(budget), MIN(budget), MAX(budget) FROM department WHERE head_dept = :head_dept INTO :tot_budget, :avg_budget, :min_budget, :max_budget; EXIT; END !! SET TERM ; !!
Следующая процедура ORG_CHART выводит диаграмму организации:
/*Display an org-chart. * * Parameters: * -- * Returns: * parent department * department name * department manager * manager's job title * number of employees in the department */ CREATE PROCEDURE org_chart RETURNS (head_dept CHAR(25), department CHAR(25), mngr_name CHAR(20), title CHAR(5), emp_cnt INTEGER) AS DECLARE VARIABLE mngr_no INTEGER; DECLARE VARIABLE dno CHAR(3); BEGIN FOR SELECT h.department, d.department, d.mngr_no, d.dept_no FROM department d LEFT OUTER JOIN department h ON d.head_dept = h.dept_no ORDER BY d.dept_no INTO :head_dept, :department, :mngr_no, :dno DO BEGIN IF (:mngr_no IS NULL) THEN BEGIN mngr_name = "--TBH--"; title = ""; END ELSE SELECT full_name, job_code FROM employee WHERE emp_no = :mngr_no INTO :mngr_name, :title; SELECT COUNT(emp_no) FROM employee WHERE dept_no = :dno INTO :emp_cnt; SUSPEND; END END !!
Когда ORG_CHART вызвана, например, следующей инструкцией:
SELCT * FROM ORG_CHART
Она выведет для каждого отдела: название отдела, отдел которому подчинен, имя начальника отдела и его должность, и количество служащих в отделе.
ORG_CHART должна быть использована как процедура выбора для вывода информации о всей организации. Если будет вызвана с помощью инструкции EXECUTE PROCEDURE, то в первый раз, когда процедура сталкивается с инструкцией SUSPEND, она завершается, возвращая информацию только о Штаб-квартире Корпорации.
Смотри так же:
- ALTER EXCEPTION
- ALTER PROCEDURE
- CREATE EXCEPTION
- DROP EXCEPTION
- DROP PROCEDURE
- EXECUTE PROCEDURE
- SELECT
- SET TERM