- •Работа №4 функции, определенные пользователем
- •1Типы функций PostgreSql
- •2ХранимыЕ процедурЫ
- •2.1Создание хранимых процедур
- •2.2Использование параметров в хранимых процедурах
- •Входные параметры
- •Выходные параметры
- •Задания для самостоятельной работы
- •II. Pl/pgSql-функции
- •2.3 Создание pl/pgSql-функции
- •Объявления переменных
- •Операторы управления программой
- •2.4 Обработка ошибок в pl/pgSql-функциях
- •3Триггеры
- •Задания для самостоятельной работы
- •Контрольное задание
- •Контрольные вопросы
2.2Использование параметров в хранимых процедурах
Система передачи параметров позволяет создавать более гибкие SP, поскольку значения параметров определяются в момент вызова процедуры, а не во время ее компиляции. Имена параметров подчиняются общим требованиям для идентификаторов. Параметры могут быть именованными и неименованными, входными и выходными.
Входные параметры
Входные параметры используются для передачи значений в SP. По умолчанию параметр является входным. Явно определить входной параметр можно с помощью служебного слова IN. Для использования входного параметра в теле SP достаточно сослаться на него как на обычную переменную с помощью выражения $n, где n порядковый номер параметра в списке параметров, как указано в определении функции.
Пример:
/* SP для вставки строки в таблицу Заказы БД BookShop */
CREATE OR REPLACE FUNCTION insert_order(custid character varying, bookid bigint, data_time timestamp without time zone, paid boolean)
RETURNS bigint AS $$
INSERT INTO "Заказы"("Заказчик", "Дата_время", "Оплачен", "Код_книги") VALUES($1,$3,$4,$2) RETURNING $2; $$
LANGUAGE sql VOLATILE;
В эту SP должны передаваться четыре параметра, которые используются для формирования значений, добавляемых в столбцы таблицы Заказы. SP возвращает значение одного из своих входных параметров.
Для передачи параметров в SP можно использовать константы или выражения, имеющие значения соответствующего типа (например, выражения вызова функций или переменные), соблюдая при этом соответствие типов и порядок следования параметров, объявленных в SP. SP insert_order можно вызвать, например, так
SELECT insert_orders(
'somebody'::character varying,
100::bigint,
now()::timestamp without time zone,
true::boolean );
Параметры можно передавать в SP, используя имена параметров, объявленных в самой процедуре. В этом случае параметры можно передавать в любом порядке, но должны быть использованы имена для всех параметров. Возможен также комбинированный вариант, когда часть параметров передаются без имен, но они должны быть в начале списка параметров в выражении вызова SP и их позиции должны соответствовать позициям в определении SP, а часть по именам. Еще один вариант вызова insert_orders выглядит следующим образом:
SELECT insert_orders(
'somebody'::character varying,
100::bigint,
paid := true::boolean,
data_time := now()::timestamp without time zone );
Входным параметрам при их объявлении могут быть присвоены значения по умолчанию. Тогда, если при вызове SP значения для таких параметров не указываются, то в процедуре будут использованы их значения по умолчанию. Если в SP для параметров указываются значения по умолчанию, то при вызове SP обычно используются имена параметров.
Выходные параметры
Выходные параметры используются для возврата значений клиентскому приложению из SP, и это практически эквивалентно использованию возвращаемого значения. Более того, использовать выходные параметров совместно с RETURNS TABLE недопустимо.
Для объявления выходного параметра необходимо перед его именем вставить служебное слово OUT или INOUT.
Пример:
/* SP для удаления неоплаченных заказов из таблицы Заказы БД BookShop */
CREATE OR REPLACE FUNCTION clear_unpaid_orders(
OUT custid character varying, OUT data_time timestamp without time zone, OUT paid boolean, OUT orderid integer, OUT bookid bigint)
RETURNS SETOF RECORD
AS $$
DELETE FROM "Заказы" WHERE "Оплачен" = false RETURNING *; $$
LANGUAGE sql VOLATILE;
В этой SP выходные параметры образуют столбцы набора записей, возвращаемых SP. В данном случае это удаляемые строки. Чтобы SP возвращала не одну запись, а набор записей, в качестве типа возвращаемого значения надо указать SETOF RECORD. Тогда вызов такой SP может быть использован в предложении FROM инструкции SELECT. Например, в результате выполнения следующего набора команд
CREATE TEMP TABLE deleted_orders (LIKE "Заказы") ON COMMIT DROP;
INSERT INTO deleted_orders SELECT * FROM clear_unpaid_orders();
SELECT * FROM deleted_orders;
удаляемые с помощью clear_unpaid_orders строки загружаются во временную таблицу deleted_orders, которая создается по шаблону таблицы "Заказы" и удаляется после завершения транзакции.