В команде IF/THEN/ELSE задаются два блока команд. Первый блок выполняется в том случае, если условие истинно, а второй - если оно ложно. Синтаксис команды IF/THEN/ELSE приведен в листинге 6.30.
Листинг 6.30. Синтаксис команды IF/THEN/ELSE
CREATE FUNCTION функция (аргументы) RETURNS тип AS '
DECLARE
объявления
BEGIN
IF условие THEN
команда;
[...]
ELSE
команда;
[...]
END IF;
END;
' LANGUAGE ‘plpgsql’ VOLATILE
Функция в листинге 6.31 делает практически то же, что и функция в листинге 6.28: она также определяет код ISBN по коду книги и номеру издания, сохраняет его в переменной и получает количество экземпляров книги на складе.
Затем команда IF/THEN/ELSE проверяет, является ли количество книг на складе положительной величиной. Если число положительно, функция возвращает TRUE - признак наличия книг на складе. В противном случае функция возвращает FALSE. Стоит напомнить, что функция in_stock() предназначена для вызова из других функций, а возвращаемое значение должно интерпретироваться той функцией, из которой она была вызвана.
Листинг 6.31. Команда IF/THEN/ELSE
|
|
CREATE OR REPLACE FUNCTION books.in_stock(integer, integer)
RETURNS boolean AS
$BODY$
DECLARE
-- Объявление псевдонимов для аргументов функции.
b_id ALIAS FOR $1;
b_edition ALIAS FOR $2;
-- Объявление текстовой переменной для найденного кода ISBN.
b_isbn text;
-- Объявление целочисленной переменной для количества экземпляров.
stock_amount integer;
BEGIN
-- Команда SELECT INTO находит в таблице editions запись.
-- у которой код книги и номер издания совпадают с аргументами
-- функции. Код ISBN из найденной записи присваивается переменной.
SELECT INTO b_isbn isbn FROM books.editions WHERE
book_id = b_id AND edition = b_edition;
-- Проверить, не был ли полученный код ISBN равен NULL.
-- Значение NULL говорит о тон. что в базе данных
-- не существует записи книги с кодом и номером издания.
-- переданными в аргументах функции. Если запись не существует.
-- функция возвращает FALSE и завершает работу.
IF b_isbn IS NULL THEN
RETURN FALSE;
END IF;
-- Получить из таблицы stock количество экземпляров книги
-- на складе и присвоить его переменной stock_amount.
SELECT INTO stock_amount stock FROM books.stock
WHERE isbn = b_isbn;
-- Проверить, является ли количество книг на складе
-- положительной величиной. Если количество положительно,
-- функция возвращает TRUE, а если отрицательно
-- или равно нулю - FALSE.
IF stock_amount <= 0 THEN
RETURN FALSE;
ELSE
RETURN TRUE;
END IF;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE
В листинге 6.32 показан результат вызова in_stock() для кода книги 4513 и издания 2.
Листинг 6.32. Результат вызова функции in_stock()
SELECT books.in_stock(4513,2);
Ответ: t.
Функция вернула значение TRUE - признак наличия книги на складе.