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

6Хранимые процедуры и Триггеры

6.1Хранимые процедуры

В серверах БД возможно создание процедур, использующих язык SQL и дополнительные операторы структурного программирования, принадлежащие языку создания хранимых процедур. В СУБД PostrgeSQL одним из таких языков является PL/pgSQL [8].

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

Преимущество хранимых процедур состоит в том, что они выполняются в среде сервера БД.

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

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

Замечание: Хранимая процедура в PostrgeSQL называется функцией.

6.1.1Оператор Create Function языка pl/pgSql

Программы PL/pgSQL состоят из блоков. Такой метод организации программного кода обычно называется блочной структурой. Программные блоки вводятся в командах SQL CREATE FUNCTION, которые используются для определения функций PL/pgSQL в базах данных PostgreSQL. Команда CREATE FUNCTION определяет имя функции, типы ее аргументов и возвращаемого значения.

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

После объявления переменных следует ключевое слово BEGIN, обозначающее начало основного программного блока. За ключевым словом BEGIN находятся операторы, входящие в блок. Конец программного блока обозначается ключевым словом END. Основной блок функции PL/pgSQL должен вернуть значение заданного типа, а все вложенные блоки (блоки, начинающиеся внутри других блоков) должны быть завершены до достижения ключевого слова END.

Синтаксис описания функции PL/pgSQL приведен ниже:

CREATE [OR REPLACE] FUNCTION <имя_функции> ([<параметры> <тип данных> , ])

RETURNS <тип_данных_результата> AS $$

[DECLARE объявление; ...]

BEGIN

<блок_операторов>; [...]

RETURN <имя_переменной>;

END;

$$

LANGUAGE 'plpgsql';

Пример 1. Добавить сведения о новом студенте. Эта функция c несколькими входными параметрами и не возвращает значений. Особенностью является то, что в качестве типа возвращаемого значения задается void.

CREATE OR REPLACE FUNCTION "insStudent"( st_no integer, st_name character varying, …)

--Определение типа результата функции

RETURNS void AS $$ // Указывается тип возвращаемого результата void

--Основной блок оператора Create Function

BEGIN

INSERT INTO Students(StNo, StName, …)

VALUES(st_no, st_name, …)

RETURN;

END; $$

LANGUAGE 'plpgsql';

Вызов этой функции в прикладной программе выглядит следующим образом:

SELECT * FROM public."setStudent"(958977, 'Иванов', …);

Далее средствами языка программирования следует подготовить входные параметры и отправить запрос на выполнение, ….

Пример 2. Функция без входных параметров и возвращает одно значение: Подсчитать сумму затрат на стипендию всех студентов.

CREATE OR REPLACE FUNCTION "getSumStipAll"()

--Определение типа результата функции

RETURNS real AS $$ // Указывается тип возвращаемого результата real

--Блок определения переменных

DECLARE summa real;

--Основной блок оператора Create Function

BEGIN

summa = ( SELECT sum ("StStipend") FROM public."Students" );

RETURN summa;

END; $$

LANGUAGE 'plpgsql';

Вызов этой функции в прикладной программе выглядит следующим образом:

SELECT * FROM public."getSumStipAll"();

Далее средствами конкретного языка программирования по работе с SQL‑запросами следует отправить запрос на выполнение, а затем выделить единственное поле оператора Select.

Пример 3. Функция с входным параметром и возвращает одно значение: Подсчитать сумму затрат на стипендию всех студентов группы Х, где Х – параметр, задающий название группы.

CREATE OR REPLACE FUNCTION "getStipGroup"(gr_name character varying)

RETURNS real AS

$$

DECLARE s real;

BEGIN

s = (SELECT SUM("Students"."StStipend")

FROM public."Students", public."Groups"

WHERE ("Students"."GrNo" = "Groups"."GrNo") AND

("Groups"."GrName" = gr_name));

RETURN s;

END;

$$

LANGUAGE 'plpgsql';

Вызов этой функции в прикладной программе выглядит следующим образом:

SELECT * FROM public."getStipGroup"('КС-071');

Далее средствами языка программирования следует подготовить 1-н входной параметр, отправить запрос на выполнение, а затем выделить возвращаемое поле оператора Select.

Пример 4. Функция с одним входным параметром и возвращает множество элементов (записей) таблицы. Вывести информацию о студентах группы Х, где Х – параметр, задающий название группы.

CREATE OR REPLACE FUNCTION "getStudGroup"(gr_name character varying)

--SETOF указывает на то, что возвращаемым результатом будет множество

--элементов (записей) таблицы "Students"

RETURNS SETOF "Students" AS

$$

BEGIN

--Чтобы вернуть множество записей необходимо после ключевого слова

-- return указать ключевое слово query, за которым следует текст запроса

RETURN QUERY SELECT "Students"."StNo", "Students"."GrNo", "Students"."StName",

"Students"."StCity", "Students"."StBrthDate","Students"."StSex",

"Students"."StStipend", "Students"."SrBall"

FROM public."Students", public."Groups"

WHERE (("Students"."GrNo" = "Groups"."GrNo") AND

("Groups"."GrName" = gr_name));

END;

$$

LANGUAGE 'plpgsql';

Вызов этой функции в прикладной программе выглядит следующим образом:

SELECT * FROM public."getStudGroup"('КС-071');

Далее средствами языка программирования следует подготовить 1-н входной параметр, отправить запрос на выполнение, а затем выделить возвращаемые поля оператора Select.

Пример 5. Функция с 2-мя входными параметрами и возвращает множество элементов (записей) таблицы: Добавить новую запись в таблицу Regions и вывести все записи из этой таблицы.

CREATE OR REPLACE FUNCTION "insRegion"(num_reg integer,

name_reg character varying)

RETURNS SETOF "Regions" AS

$$

BEGIN

INSERT INTO public."Regions" ("RgNo", "RgName")

VALUES (num_reg, name_reg);

RETURN QUERY SELECT "RgNo", "RgName" FROM public."Regions";

END;

$$

LANGUAGE 'plpgsql'

Как видно из примера 4, помимо оператора Select в основном блоке функции можно использовать и другие операторы языка SQL, а также операторы языка Pl/pgSQL.

Вызов этой функции в прикладной программе выглядит следующим образом:

SELECT * FROM public."insRegion"(4, 'Львовская');

Далее средствами конкретного языка программирования по работе с SQL‑запросами следует подготовить 2-ва входных параметра, а затем выделить поочередно возвращаемые значения полей оператора Select.

Следующий пример демонстрирует возможность функции возвращать несколько значений. В функцию передается три параметра: один входной (режим IN), и два выходных (режим OUT), через которые функция вернет результаты. Следует обратить внимание на то, что тип возвращаемого значения в этом случае – record.

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

CREATE OR REPLACE FUNCTION "getCntAndSrBallGr" (IN "nameGr" character varying,

OUT "cntStud" integer, OUT "srBall" real)

RETURNS record AS

$$

begin

"cntStud" = (select count("Students"."StNo")

from public."Students", public."Groups"

where ("Students"."GrNo"="Groups"."GrNo") and

("Groups"."GrName"="nameGr"));

"srBall" = (select avg("Students"."SrBall")

from public."Students", public."Groups"

where ("Students"."GrNo"="Groups"."GrNo") and

("Groups"."GrName"="nameGr"));

end;

$$

LANGUAGE 'plpgsql'

Вызов этой функции в прикладной программе выглядит следующим образом:

SELECT * FROM public." getCntAndSrBallGr "('КС-071');

Далее средствами конкретного языка программирования по работе с SQL‑запросами следует подготовить входной параметр, а затем выделить поочередно возвращаемые значения полей оператора Select.