Иллюстрированный самоучитель по PostgreSQL

Переменные

Если требуется присвоить несколько значений нескольким переменным, в команду включаются две группы, разделенные запятыми и отделенные друг от друга пробелом. В первой группе перечисляются имена переменных, а во второй – имена полей. Функция, приведенная в листинге 11.17, решает обратную задачу по сравнению с функцией get_customer_id() из листинга 11.15 – она возвращает имя и фамилию клиента по заданному коду.

Листинг 11.17. Использование команды SELECT INTO с несколькими полями.

CREATE FUNCTION get_customer_name (integer) RETURNS text AS '
DECLARE
--Объявление псевдонимов для аргументов,
customerjd ALIAS FOR $1:
--Объявление переменных для хранения компонентов
--полного имени клиента.
customer_fname text: customer_lname text:
BEGIN
--Получение имени и фамилии клиента, код которого
--совпадает с переданным значением.
SELECT INTO customer_fname .customersname
firstname, last_name
FROM customers WHERE id = customer_id:
--Вернуть полное имя.
RETURN customer_fname | '' '' | customerj name:
END;
' LANGUAGE 'plpgsql1:

В листинге 11.18 показан результат вызова функции get_customer_name() с аргументом 107.

Листинг 11.18. Вызов функции get_customer_name().

booktown=# SELECT get_customer_name(107);
get_customer_name
Annie Jackson
(1 row)

Чтобы узнать, успешно ли были присвоены значения переменным командой SELECT INTO, воспользуйтесь специальной логической переменной FOUND. Кроме того, можно проверить значение заданной переменной ключевыми словами ISNULL или IS NULL (в большинстве случаев положительный результат означает, что команда SELECT INTO завершилась неудачей!).

Ключевые слова FOUND, IS NULL и ISNULL следует использовать в условных командах (IF/THEN). Условные команды PL/pgSQL описаны в разделе "Передача управления" этой главы. В листинге 11.19 приведен простейший пример использования логической переменной FOUND в функции get_customer_1d().

Листинг 11.19. Использование логической переменной FOUND в функции get_customer_id().

[…]
SELECT INTO customerjd id FROM customers
WHERE last_name = l_name AND firstname = f_name;
--Если совпадение не найдено, вернуть -1.
--Другая функция, в которой вызывается
get_customer_id().
--может интерпретировать – 1 как признак ошибки.
IF NOT FOUND THEN
return -1;
END IF;
[…]

В листинге 11.20 показано, что теперь функция get_customer_id() при передаче имени несуществующего клиента возвращает -1.

Листинг 11.20. Вызов нового варианта функции get_customer_id().

booktown=# SELECT get_customer_id('Schmoe','Joe');
get_customer_id
-1
(1 row)
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.