Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
work_4.doc
Скачиваний:
4
Добавлен:
09.11.2019
Размер:
158.72 Кб
Скачать

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, которая создается по шаблону таблицы "Заказы" и удаляется после завершения транзакции.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]