Передача управления
Команда IF/THEN/ELSE/IF
Команда IF/THEN/ELSE/IF предназначена для последовательной проверки нескольких условий. Сначала проверяется первое условие; если оно окажется равным FALSE, проверяется следующее условие и т. д. Последняя секция ELSE содержит команды, выполняемые в том случае, если пи одно из проверенных условий не было истинным. Синтаксис команды IF/THEN/ELSE/IF:
CREATE FUNCTION функция (аргументы) RETURNS тип AS ' DECLARE объявление BEGIN IF условие THEN команда; […] ELSE IF условие команда; […] END IF: END: ' LANGUAGE 'plpgsql ':
В листинге 11.40 приведен практический пример применения функции с командой 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. Если значение subjd равно NULL, значит, переданная при вызове функции тема не встречается в базе данных booktown, а выполненная в самом начале команда SELECT INTO завершилась неудачей. В этом случае функция возвращает строку "subject not found".
Примечание
Функции extract_all_titles() и extract_title(), используемые в листинге 11.40, будут рассмотрены ниже, когда речь пойдет о циклах.