Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лекции по бд.doc
Скачиваний:
2
Добавлен:
01.05.2025
Размер:
4.79 Mб
Скачать

Хранимые процедуры и их назначение

Хранимая процедура – отдельная программа, написанная на SQL для процедур и триггеров InterBase. Сами процедуры хранятся в базе данных. Хранимые процедуры позволяют вести поиск и обработку дан­ных непосредственно на сервере, обеспечивая максимальную независи­мость клиентской части приложений. В них могут использоваться лю­бые конструкции SQL для процедур и триггеров (см. следующий раз­дел), кроме контекстных переменных NEW.column, OLD.column, применимых только в триггерах. Они, как обычные программы, могут получать входные параметры и возвращать значения вызвавшим их приложениям. Кроме того, могут возвращать не только отдельный набор значений – строку, но и множество строк, которое можно рассмат­ривать как виртуальную таблицу.

Хранимая процедура может также вызываться непосредственно из приложения или других хранимых процедур или триггеров. Хранимые процедуры, возвращающие множество строк, можно использовать в ко­манде SELECT на месте таблиц или обзоров.

Использование хранимых процедур дает ряд преимуществ:

  • Модульность проектирования. Приложения, которые обращаются к одной базе данных, могут совместно использовать хранимые процедуры, устраняя двойной код, уменьшая размер приложений и устраняя потенциальные ошибки.

  • Локализация изменений. Если процедура модифицируется, то все внесенные изменения автоматически отражаются во всех прило­жениях, которые используют процедуру, обеспечивая их согласо­ванность. При этом нет необходимости в перетрансляции и переком­поновке приложений.

  • Ускорение обработки. Хранимые процедуры выполняются серве­ром, а не клиентом, что позволяет ускорить обработку запросов и сократить сетевой трафик. Последнее особенно важно для уда­ленного клиентского доступа.

Процедуры по своему назначению разделяются на два вида: выпол­нимые процедуры и процедуры выбора.

Выполнимая процедураэто обычная программа, которая получает несколько (возможно, и ноль) параметров, выполняет какие-либо дейст­вия в базе данных и возвращает несколько (возможно, и ноль) значений.

Процедура выбораэто программа, которая получает несколько (возможно, и ноль) параметров, выполняет какие-либо действия в базе Данных и возвращает множество (возможно, пустое) наборов значений. Другими словами, процедура выбора создает вычисляемую таблицу, хотя такая таблица никуда и не записывается. Это позволяет обращаться к процедуре, как к таблице, используя команду SELECT.

Синтаксически можно обращаться к выполнимой процедуре, как к процедуре выбора (может понадобиться включение оператора SUSPEND в тело процедуры для корректного вывода результата), получая при этом в ответ в точности одну строку, а к процедуре выбора, как к выполнимой, получая при этом в ответ пер­вую строку формируемой таблицы. Ценность такой инверсии обраще­ний в лучшем случае нулевая, поэтому, несмотря на отсутствие прямого запрета ее использования, нет оснований для практического применения инверсных вызовов хранимых процедур. Например:

SELECT RESULT FROM MODULUS (12, 5);

Или EXECUTE PROCEDURE MODULUS 12, 5;

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.

Синтаксис

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>

Входной параметр, который вызывающая программа использует, чтобы передать значения процедуре.

  • param: Имя входного параметра, уникально для переменных внутри процедуры.

  • <datatype>: Любой тип данных InterBase.

RETURNS param <datatype>

Выходной параметр, который процедура использует, чтобы вернуть значения в вызывающую программу.

  • param: Имя выходного параметра, уникально для переменных внутри процедуры.

  • <datatype>: Любой тип данных InterBase.

Процедура возвращает значения выходных параметров, когда достигает инструкции SUSPEND в теле процедуры.

AS

Ключевое слово, которое разделяет заголовок процедуры и тело процедуры.

DECLARE VARIABLE var <datatype>

Объявляет локальные переменные используемые только в процедуре. Каждому объявлению должно предшествовать DECLARE VARIABLE и должно завершатся точкой с запятой (;).

  • param: Имя локальной переменной, уникально для переменных внутри процедуры.

  • <datatype>: Любой тип данных InterBase.

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, она завершается, возвращая информацию только о Штаб-квартире Корпорации.

EXECUTE PROCEDURE

Описание.

EXECUTE PROCEDURE вызывает определенную сохраненную процедуру. Если процедура требует входных параметров, они передаются как константы.

ISQL автоматически выводит возвращаемые значения.

Синтаксис.

EXECUTE PROCEDURE name [param [, param ...]];

Аргумент

Описание

name

Имя существующей сохраненной процедуры в базе данных.

param

Входные параметры. Должны быть константами.

Примеры.

Следующая инструкция демонстрирует, как выполняемая процедура, DEPT_BUGET, вызывается:

EXECUTE PROCEDURE DEPT_BUDGET 100;

DROP PROCEDURE

Описание.

DROP PROCEDURE удаляет существующую сохраненную процедуру из базы данных.

Процедуры, используемые в других процедурах, триггерах или видах, не могут быть удалены. Процедуры, используемые в настоящие время, не могут быть удалены.

Совет: Используйте SHOW PROCEDURES для вывода списка зависимостей процедур, процедуры, триггеры, исключительные ситуаций и таблицы, которые используют процедуры.

Процедура может быть удалена ее создателем и пользователем SYSDBA.

Синтаксис.

DROP PROCEDURE name;

Аргумент

Описание

name

Имя существующей процедуры.

Примеры.

Следующая инструкция удаляет процедуру:

DROP PROCEDURE GET_EMP_PROJ;