![](https://cv01.studmed.ru/view/289720eb7b8/bg88.png)
– 136 –
В листинге 6.33 приведен практический пример применения функции с ко-
мандой
IF/ THEN/ELSE/IF. Функция books_by_subject() сначала использует пе-
реданный аргумент (тему книги) для выборки кода темы. Затем первая команда
IF проверяет, не содержит ли переданный аргумент строку all.
Если при вызове был передан аргумент
all, команда IF/THEN вызывает
функцию
extract_all_titles() и присваивает полученный список книг и тем
(возвращаемый в виде текстовой переменной) переменной
found_text.
Если аргумент отличен от
all, следующая команда ELSE IF проверяет, яв-
ляется ли код темы нулем или положительным числом. Если значение
sub_id
больше либо равно нулю, выполняются команды, содержащиеся в теле конст-
рукции
ELSE IF сначала вызывается функция extract_title(), которая воз-
вращает список всех существующих книг по заданной теме, после чего тема
возвращается вместе с полученным списком.
Затем другая команда
ELSE IF сравнивает код темы с псевдозначением NULL.
Если значение
sub_id равно NULL, значит, переданная при вызове функции тема
не встречается в базе данных
booktown, а выполненная в самом начале команда
SELECT INTO завершилась неудачей. В этом случае функция возвращает строку
«subject not found».
ПРИМЕЧАНИЕ Функции extract_all_titles() и extract_title(), используемые в листинге 11.40, бу-
дут рассмотрены ниже, когда речь пойдет о циклах.
Листинг 6.33. Команда IF/THEN/ELSE/IF
CREATEFUNCTIONbooks_by_subject(text)RETURNStextAS'
DECLARE
‐‐Объявлениепсевдонимадляаргумента,содержащеголибо
‐‐строкуall,либотему.
sub_titleALIASFOR$1;
‐‐Объявлениецелочисленнойпеременнойдляхранениякодатемы
‐‐итекстовойпеременнойдляхранениясписканайденныхкниг.
‐‐Текстоваяпеременнаяинициализируетсяпустойстрокой.
sub_idinteger;
found_texttext;
BEGIN
‐‐Получитькодтемы,описаниекоторойпередановаргументе.
SELECTINTOsub_ididFROMsubjectsWHEREsubject=sub_title;
‐‐Проверить, запросил ли пользователь информацию обо всехтемах
‐‐ (строка
all). В этом случае вызвать функцию
extract_all_titles()ивернутьполученнуютекстовуюпеременную.
IFsub_title=''all''
THEN
found_textextract_all_titles();
RETURNfoundtext;
‐‐ЕсливаргументеНЕБЫЛАпереданастрока"all",проверить,
‐‐входитликодтемывинтервалдопустимыхзначений.
‐‐Еслиэтотак,вызватьфункциюextract_title()скодомтемы
‐‐иприсвоитьрезультатпеременнойfound_text.
ELSEIFsub_id>=0
THEN
found_text:=extract_title(sub_id);
RETURN"\n"||sub_title||":\n"|found_text;