Иллюстрированный самоучитель по PostgreSQL

Передача управления

Команды передачи управления существуют практически во всех современных языках программирования, и PL/pgSQL не является исключением. С технической точки зрения сам вызов функции можно рассматривать как передачу управления последовательности команд PL/pgSQL. Тем не менее существуют и другие, более совершенные средства, определяющие последовательность выполнения команд PL/pgSQL. Речь идет об условных командах IF/THEN и циклах.

Условные команды

Условная команда указывает на то, что некоторое действие (или последовательность действий) выполняется в зависимости от результатов проверки заданного логического условия. Определение выглядит запутанно, но на самом деле условные команды весьма просты. В неформальной формулировке условная команда означает следующее: "если условие истинно, выполнить такое-то действие".

Команда IF/THEN

Команда IF/THEN задает команду (или блок команд), выполняемых в случае истинности некоторого условия. Синтаксис команды IF/THEN показан в листинге 11.34.

Листинг 11.34. Синтаксис команды IF/THEN.

CREATE FUNCTION функция (аргументы) RETURNS тип AS '
DECLARE
объявления BEGIN
IF условие THEN
команда:
[…] END IF;
END;
' LANGUAGE 'plpgsql';

В листинге 11.35 приведена функция, которая проверяет количество экземпляров книги на складе по коду и номеру издания. Код книги используется во внутренних операциях базы данных и присутствует в нескольких таблицах. Следовательно, функция stock_amount() предназначена для вызова из других функций, а не прямого вызова из клиентской программы, поскольку большинству пользователей коды книг неизвестны.

Сначала мы читаем код ISBN командой SELECT INTO. Если команда SELECT INTO не смогла найти код ISBN по заданному коду книги и номеру издания, функция stock_amount() возвращает -1. Функция, вызвавшая stock_amount(), интерпретирует это значение как признак ошибки. Если код ISBN найден успешно, то другая команда SELECT INTO получает количество экземпляров книги на складе и возвращает полученную величину. На этом работа функции завершается.

Листинг 11.35. Использование команды IF/THEN.

CREATE FUNCTION stock_amount (integer, integer) RETURNS integer AS '
DECLARE
--Объявление псевдонимов для аргументов функции.
b_id ALIAS FOR $1: b_edition ALIAS FOR $2:
--Объявление переменной для кода ISBN.
b_1sbn text:
– Объявление переменной для количества экземпляров.
stock_amount integer:.
BEGIN
– Команда SELECT INTO находит в таблице editions запись.
--у которой код книги и номер издания совпадают с аргументами
--функции. Код ISBN из найденной записи присваивается переменной.
SELECT INTO bjsbn isbn FROM editions WHERE
book_id = b_id AND edition = b_edition;
– Проверить, не был ли полученный код ISBN равен NULL.
--Значение NULL говорит о том. что в базе данных
--не существует записи книги с кодом и номером издания.
--переданными в аргументах функции. Если запись не существует.
--функция возвращает -1 и завершает работу.
IF bjsbn IS NULL THEN
RETURN -1:
END IF:
--Получить из таблицы stock количество экземпляров книги
– на складе и присвоить его переменной stock_amount.
SELECT INTO stock_amount stock FROM stock WHERE isbn = bjsbn:
--Вернуть количество экземпляров на складе. RETURN stock_amount;
END:
' LANGUAGE 'plpgsql':

В листинге 11.36 показан результат вызова функции stock_amount() для кода книги 7808 и издания 1.

Листинг 11.36. Результаты вызова функции stock_amount().

booktowrHf SELECT stock_amount(7808.1):
stock amount
22
(1 row)
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.