
Синтаксис
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 | TIME | TIMESTAMP)
| {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 |
Используется для объявления локальной переменной внутри процедуры. Var – имя переменной, datatype – тип переменной. Слова DECLARE VARIABLE используются для каждой переменной Заканчивается символом (;) |
statement |
Оператор на языке SQL |
BEGIN…END |
Определяет блок операторов. |
Variable = expression |
Оператор присваивания. Присваивает переменной значение. |
/*Comment text*/ |
Комментарий |
EXECUTE PROCEDURE proc_name [var [, var …]] [RETURNING_VALUES var [, var …]] |
Осуществляет вызов хранимой процедуры proc_name с заданными входными и выходными параметрами. |
EXIT |
Выход из процедуры |
FOR select_statement DO compound_statement |
Для каждой строки, полученной с помощью запроса select_statement выполняется оператор или блок операторов compound_statement |
compound_statement |
Одиночный оператор или блок операторов, в операторных скобках BEGIN…END |
IF (condition) THEN compound_statement [ELSE compound_statement] |
Конструкция условного выполнения оператора или блока операторов. |
IF (condition) THEN compound_statement [ELSE compound_statement] |
Конструкция условного выполнения оператора или блока операторов. |
Примеры
Следующая процедура 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 !!
CREATE TRIGGER