- PL/pgSQL
-
PL/pgSQL (Procedural Language/PostGres Structured Query Language — процедурное расширение языка СУБД
- добавляет управляющие конструкции к стандарту SQL;
- допускает сложные вычисления;
- может использовать все объекты БД, определенные пользователем;
- прост в использовании.
Содержание
Преимущества использования
Стандартный SQL используется в PostgreSQL и других реляционных БД как основной язык для создания запросов. Он переносим и прост, как для изучения, так и для использования. Однако слабое его место — в том, что каждая конструкция языка выполняется сервером отдельно. Это значит, что клиентское приложение должно отправлять каждый запрос серверу, получить его результат, определенным образом согласно логике приложения обработать его, посылать следующий запрос и т. д. В случае, если клиент и сервер БД расположены на разных машинах, это может привести к нежелательному увеличению задержек и объема пересылаемых от клиента серверу и наоборот данных.
При использовании PL/pgSQL все становится проще. Появляется возможность сгруппировать запросы и вычислительные блоки в единую конструкцию, которая будет размещаться и выполняться на сервере, а клиент будет получать отправлять запрос на её выполнение и получать результат, минуя все промежуточные пересылки данных взад—вперед, что в большинстве случаев очень позитивно сказывается на производительности.
Поддерживаемые типы аргумента и возвращаемого значения
Функции, написанные на PL/pgSQL, могут принимать в качестве аргумента и возвращать как результат значения любого скалярного или составного типа, допустимые для сервера БД, включая определенные пользователем, строковые типы и записи.
Допускается также аргументы и возвращаемые значения, относящиеся к псевдотипам
anyelement
,anyarray
,anynonarray
иanyenum
. Благодаря этому появляется возможность определять полиморфные функции, принимаемый и возвращаемый которыми тип может изменяться от вызова к вызову. Функции на PL/pgSQL могут возвращать не одно значение, а целый набор значений, либо вообще не возвращать никакого значения (применяя типvoid
).Структура кода на PL/pgSQL
Любая программная конструкция (функция, триггер или правило), написанная на PL/pgSQL, имеет блочную компоновку и выглядит вот так:
[ <<метка>> ] [ DECLARE объявления переменных ] BEGIN тело программы END [ метка ]; /* Многострочный комментарий */ -- Однострочный комментарий
Как и принято, квадратными скобками выделены фрагменты, которые опциональны и могут не присутствовать в конкретном варианте.
Каждое отдельное объявление и каждая конструкция внутри тела программы должна заканчиваться точкой с запятой. Блок, находящийся внутри другого блока, также должен иметь точку с запятой после завершающего
END
, однако самое «внешнее»END
в точке с запятой не нуждается.Любая конструкция внутри тела программы также может быть выделена в отдельный блок, с собственным разделом объявлений переменных.
Синтаксис языка
Формат объявления переменных
Любая переменная в PL/pgSQL должна быть объявлена перед использованием, неявное объявление не поддерживается; единственным исключением является цикл
FOR
— в нем переменная цикла по умолчанию объявляется какINTEGER
. Возможно сразу же присваивать переменной значение либо объявлять её как константу:имя [ CONSTANT ] тип [ NOT NULL ] [ { DEFAULT | := } значение ];
Ключевое слово
DEFAULT
применяется для задания значения по умолчанию, ключевое словоCONSTANT
защищает переменную от дальнейшего изменения, определяя её как константу.Передача аргументов
По умолчанию переданные параметры обозначаются как
$1
,$2
и так далее. Однако, если желательно увеличить читабельность кода, то можно обозначить эти параметры с помощью псевдонимов. Возможны два способа.Можно задавать имя параметра непосредственно в определении функции:
CREATE FUNCTION sales_tax(subtotal REAL) RETURNS REAL AS $$ BEGIN RETURN subtotal * 0.06; END; $$ LANGUAGE plpgsql;
Иначе, можно объявить псевдоним для параметра непосредственно в разделе объявлений переменных:
CREATE FUNCTION sales_tax(REAL) RETURNS REAL AS $$ DECLARE subtotal ALIAS FOR $1; BEGIN RETURN subtotal * 0.06; END; $$ LANGUAGE plpgsql;
Ссылки
Wikimedia Foundation. 2010.