Передача управления
Команда IF/THEN/ELSE
В команде IF/THEN/ELSE задаются два блока команд. Первый блок выполняется в том случае, если условие истинно, а второй – если оно ложно. Синтаксис команды IF/THEN/ELSE приведен в листинге 11.37.
Листинг 11.37. Синтаксис команды IF/THEN/ELSE.
CREATE FUNCTION функция (аргументы) RETURNS тип AS ' DECLARE объявления BEGIN IF условие THEN команда: […] ELSE команда: […] END IF: END: ' LANGUAGE 'plpgsql':
Функция в листинге 11.38 делает практически то же, что и функция в листинге 11.35: она также определяет код ISBN по коду книги и номеру издания, сохраняет его в переменной и получает количество экземпляров книги на складе.
Затем команда IF/THEN/ELSE проверяет, является ли количество книг на складе положительной величиной. Если число положительно, функция возвращает TRUE – признак наличия книг на складе. В противном случае функция возвращает FALSE. Стоит напомнить, что функция in_stock() предназначена для вызова из других функций, а возвращаемое значение должно интерпретироваться той функцией, из которой она была вызвана.
Листинг 11.38. Команда IF/THEN/ELSE.
CREATE FUNCTION in_stock (integer.integer) RETURNS boolean AS ' 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_sbn isbn FROM editions WHERE bookjd = b_id AND edition – b_edition: --Проверить, не был ли полученный код ISBN равен NULL. --Значение NULL говорит о тон. что в базе данных --не существует записи книги с кодом и номером издания. --переданными в аргументах функции. Если запись не существует. --функция возвращает FALSE и завершает работу. IF b_sbn IS NULL THEN RETURN FALSE: END IF: --Получить из таблицы stock количество экземпляров книги --на складе и присвоить его переменной stock_amount. SELECT INTO stock_amount stock FROM stock WHERE isbn = bjsbn: --Проверить, является ли количество книг на складе --положительной величиной. Если количество положительно, --функция возвращает TRUE, а если отрицательно --или равно нулю – FALSE. IF stock_amount <= 0 THEN RETURN FALSE: ELSE RETURN TRUE: END IF: END: ' LANGUAGE 'plpgsql':
В листинге 11.39 показан результат вызова in_stock() для кода книги 4513 и издания 2.
Листинг 11.39. Результат вызова функции in_stock().
booktown=# SELECT in_stock(4513.2); in stock t (1 row)
Функция вернула значение TRUE – признак наличия книги на складе.