Передача управления
Листинг 11.40. Команда IF/THEN/ELSE/IF.
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() с аргументом аll (признак того, что пользователь хочет получить список книг по всем темам). Затем следуют результаты, полученные при вызове функции с аргументом Computers (получение списка книг, посвященных компьютерам).
Листинг 11.41. Результаты вызова функции books_by_subject().
booktown=# SELECT books_by_subject('al1');
books_by_subject
Arts:
Dynamic Anatomy
Business:
Children's Books:
The Cat in the Hat
Bartholomew and the Oobleck
Franklin in the Dark
Goodnight Moon
[…]
Science:
Science Fiction:
Dune
2001: A Space Odyssey
(1 row)
booktown=# SELECT books_by_subject('Computers');
books by_subject
Computers:
Learning Python
Perl Cookbook
Practical PostgreSQL
Programming Python
(1 row)
