Присваивание
Присваивание в PL/pgSQL выполняется оператором присваивания (:=) в форме левая_ переменная := правая_переменная.
Команда присваивает левой переменной значение правой переменной. Также допускается запись вида левая_переменная := выражение.
В этом случае левой переменной присваивается результат выражения, расположенного справа от оператора присваивания.
Значения по умолчанию также могут присваиваться переменным в секции объявлений программных блоков PL/pgSQL. Инициализация переменной производится оператором присваивания (:=) в одной строке с объявлением переменной. Эта тема подробно рассматривается ниже, а в листинге 6.8 приведен небольшой пример.
Листинг 6.8. Инициализация переменной
CREATE FUNCTION идентификатор (аргументы) RETURNS тип AS '
DECLARE
a_integer int4 := 10;
BEGIN
команда;
END;
' LANGUAGE ‘plpgsql’ VOLATILE
Возможен и другой вариант - присваивание переменной результата запроса командой SELECT INTO. He путайте этот вариант использования команды SELECT INTO с командой SQL SELECT INTO, которая заносит результаты запроса в новую таблицу.
ПРИМЕЧАНИЕ Для сохранения результатов запроса в новой таблице в PL/pgSQL используется альтернативный синтаксис SQL CREATE TABLE AS SELECT.
Команда SELECT INTO в основном требуется для сохранения данных записей в переменных, объявленных с типами %ROWTYPE и RECORD. Чтобы команда SELECT INTO могла использоваться с обычной переменной, тип этой переменной должен соответствовать типу поля, упоминаемому в команде SQL SELECT.
Синтаксис команды SELECT INTO:
CREATE FUNCTION идентификатор (аргументы) RETURNS тип AS '
DECLARE
команда;
BEGIN
SELECT INTO переменная [. ...] поле [, ...] секция_select;
END;
' LANGUAGE 'plpgsql':
В этом описании переменная - имя переменной, участвующей в присваивании, a ceкции select - любые поддерживаемые секции команды SQL SELECT, обычно следующие за списком целевых полей в команде SELECT.
В листинге 6.9 приведена простая функция, в которой используется команда SELECT INTO. Ключевое слово ALIAS описано в подразделе 6.1.3.4 этого раздела. Примеры выполнения команды SELECT INTO для переменных типа RECORD и ROWTYPE приведены в разделе 6.1.7.
Листинг 6.9. Использование команды SELECT INTO
CREATE OR REPLACE FUNCTION books.get_customer_id(text, text)
RETURNS integer AS
$BODY$
DECLARE
-- Объявление псевдонимов для аргументов.
l_name ALIAS FOR $1;
f_name ALIAS FOR $2;
-- Объявление переменной для хранения кода клиента.
customer_id integer;
BEGIN
-- Получение кода клиента, имя и фамилия которого
-- совпадают с переданными значениями.
SELECT INTO customer_id id FROM books.customers
WHERE last_name = l_name AND first_name = f_name;
-- Вернуть код.
RETURN customer_id;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE
В листинге 6.10 показан результат вызова функции get_customer_id() с аргументами Jackson и Annie. Возвращенное число равно коду клиента «Annie Jackson» в таблице customers.
Листинг 6.10. Вызов функции get_customer_id()
SELECT books.get_customer_id('Jackson','Annie');
Ответ: 107.
Если требуется присвоить несколько значений нескольким переменным, в команду включаются две группы, разделенные запятыми и отделенные друг от друга пробелом. В первой группе перечисляются имена переменных, а во второй - имена полей.
Функция, приведенная в листинге 6.11, решает обратную задачу по сравнению с функцией get_customer_id() из листинга 6.9 - она возвращает имя и фамилию клиента по заданному коду.
Листинг 6.11. Использование команды SELECT INTO с несколькими полями
CREATE OR REPLACE FUNCTION books.get_customer_name(integer)
RETURNS text AS
$BODY$
DECLARE
-- Объявление псевдонимов для аргументов,
customer_id ALIAS FOR $1;
-- Объявление переменных для хранения компонентов
-- полного имени клиента.
customer_fname text;
customer_lname text;
BEGIN
-- Получение имени и фамилии клиента, код которого
-- совпадает с переданным значением.
SELECT INTO customer_fname, customer_lname
first_name, last_name
FROM books.customers WHERE id = customer_id;
-- Вернуть полное имя.
RETURN customer_fname ||' '|| customer_lname;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE
В листинге 6.12 показан результат вызова функции get_customer_name() с аргументом 107.
Листинг 6.12. Вызов функции get_customer_name()
SELECT books.get_customer_name(107);
Ответ: Annie Jackson.
Чтобы узнать, успешно ли были присвоены значения переменным командой SELECT INTO, воспользуйтесь специальной логической переменной FOUND. Кроме того, можно проверить значение заданной переменной ключевыми словами ISNULL или IS NULL (в большинстве случаев положительный результат означает, что команда SE LECT INTO завершилась неудачно!).
Ключевые слова FOUND, IS NULL и ISNULL следует использовать в условных командах (IF/THEN). Условные команды PL/pgSQL описаны в разделе 6.1.7.
В листинге 6.13 приведен простейший пример использования логической переменной FOUND в функции get_customer_id().
Листинг 6.13. Использование переменной FOUND в функции get_customer_id_found()
[...]
SELECT INTO customer_id id FROM customers
WHERE last_name = l_name AND first_name = f_name;
-- Если совпадение не найдено, вернуть -1.
-- Другая функция, в которой вызывается get_customer_id(),
-- может интерпретировать -1 как признак ошибки.
IF NOT FOUND THEN
return -1;
END IF;
[...]
В листинге 6.14 показано, что теперь функция get_customer_id_found() при передаче имени несуществующего клиента возвращает -1.
Листинг 6.14. Вызов нового варианта функции get_customer_id_found()
SELECT books.get_customer_id('Jackson','Ann');
Ответ: -1.
Дата добавления: 2015-02-03; просмотров: 745;