CREATE FUNCTION books_by_subject (text) RETURNS text AS '
DECLARE
-- Объявление псевдонима для аргумента, содержащего либо
-- строку all. либо тему.
sub_tnie ALIAS FOR $1;
-- Объявление целочисленной переменной для хранения кода темы
- и текстовой переменной для хранения списка найденных книг.
- Текстовая переменная инициализируется пустой строкой.
suD_id integer:
found_text text :
BEGIN
-- Получить код темы, описание которой передано в аргументе.
SELECT INTO subjd id FROM subjects WHERE subject = sub_title:
-- Проверить, запросил ли пользователь информацию обо всех темах
- (строка all). В этом случае вызвать функцию extract_all_titles()
- и вернуть полученную текстовую переменную.
IF sub_t1tle = ' 'all'' THEN
found_text extract_all_titles();
RETURN found text:
-- Если в аргументе НЕ БЫЛА передана строка "all", проверить.
-- входит ли код темы в интервал допустимых значений.
-- Если это так, вызвать функцию extract_title() с кодом темы
-- и присвоить результат переменной found_text.
ELSE IF subjd >
= 0 THEN
found_text :- extract_title(sub_id):
RETURN "\n" || sub_title || ":\n" | found_text;
-- Если код темы равен NULL, вернуть сообщение о том. что
-- заданная тема не найдена.
ELSE IF subjd IS NULL THEN
RETURN "Subject not found.";
END IF:
END IF;
END IF;
RETURN "An error occurred. .";
END;
' LANGUAGE 'plpgsql':
В листинге 11.41 сначала приведен результат вызова функции books_by_subject() с аргументом а! 1 (признак того, что пользователь хочет получить список книг по всем темам). Затем следуют результаты, полученные при вызове функции с аргументом Computers (получение списка книг, посвященных компьютерам).