PL/pgSQL является процедурным языком для СУБД Digital Q.DataBase. Цели разработки PL/pgSQL заключались в создании загружаемого процедурного языка, который:
может использоваться для создания функций, процедур и триггеров,
добавляет управляющие конструкции в SQL язык,
позволяет выполнять сложные вычисления,
наследует все пользовательские типы данных, функции, процедуры и операторы,
может быть определен как доверенный сервером,
удобен в использовании.
Функции, созданные с помощью PL/pgSQL можно использовать везде, где применимы встроенные функции. Например, можно создавать функции со сложными условными вычислениями и в дальнейшем использовать их для определения операторов или в индексных выражениях.
В версиях Digital Q.DataBase 9.0 и более поздних PL/pgSQL устанавливается по умолчанию. Тем не менее, он остается подгружаемым модулем, поэтому администраторы, уделяющие особое внимание вопросам безопасности, могут принять решение о его удалении.
SQL является языком, который Digital Q.DataBase и большинство других реляционных баз данных используют в качестве языка запросов. Он переносим и прост в изучении. Однако каждый SQL оператор должен выполняться сервером базы данных индивидуально.
Это означает, что клиентское приложение должно отправить каждый запрос серверу базы данных, дождаться его завершения, получить и обработать результаты, произвести вычисления, а затем отправить последующие запросы серверу. Все это влечет за собой издержки на межпроцессное взаимодействие, а также сетевые накладные расходы, если клиент находится на компьютере, отличном от сервера базы данных.
С помощью PL/pgSQL можно сгруппировать блок вычислений и последовательность запросов внутри сервера базы данных, сочетая мощь процедурного языка и простоту использования SQL, что обеспечивает значительную экономию на издержках обмена данными между клиентом и сервером.
Исключаются дополнительные циклы приема-передачи данных между клиентом и сервером
Промежуточные результаты, не требующиеся клиенту, не нужно подготавливать для передачи или пересылать между сервером и клиентом
Появляется возможность избежать многократного синтаксического анализа запросов
Это может привести к значительному повышению производительности по сравнению с приложением, в котором не используются хранимые функции.
Кроме того, в PL/pgSQL допускается использование всех типов данных, операторов и функций SQL.
Функции, написанные на PL/pgSQL могут принимать в качестве аргументов любые скалярные типы данных или массивы, поддерживаемые сервером, а также возвращать результат любого из этих типов. Они также могут принимать или возвращать любой составной тип (тип строки), указанный по имени. Кроме того, можно объявить PL/pgSQL
функцию принимающей тип данных record, что означает допустимость любого составного типа в качестве входного параметра, или возвращающей тип данных record, что означает, что результатом является тип строки, столбцы которой определяются спецификацией в вызывающем запросе, как описано в Раздел 2.4.2.1.4.
PL/pgSQL функции могут быть объявлены как принимающие переменное число аргументов с помощью VARIADIC маркера. Это
работает точно так же, как и для функций SQL, описание которых приведено в
Раздел 5.1.5.6.
PL/pgSQL функции также могут быть объявлены как принимающие и возвращающие полиморфные типы данных, описанные в Раздел 5.1.2.5, что позволяет фактическим типам данных, обрабатываемым функцией, меняться от вызова к вызову. Примеры приведены в Раздел 5.6.3.1.
PL/pgSQL функции также могут быть объявлены как возвращающие «набор» (или таблицу) любого типа данных, который может быть возвращен в виде одного экземпляра. Такая функция формирует результат своего выполнения путем вызова команды
RETURN NEXT для каждого требуемого элемента результирующего
набора или путем использования команды RETURN QUERY для вывода результата
выполнения запроса.
Наконец, PL/pgSQL функция может быть объявлена с типом возвращаемого значения
void если она не возвращает полезного значения. (В этом случае её также можно определить как процедуру.)
PL/pgSQL функции также могут быть объявлены с выходными параметрами вместо явного указания возвращаемого типа данных. Это не добавляет языку принципиально новых возможностей, но часто оказывается удобным, особенно для возврата нескольких значений. RETURNS TABLE запись также может использоваться вместо RETURNS SETOF.
Конкретные примеры приведены в Раздел 5.6.3.1 и Раздел 5.6.6.1.