Перейти к основному содержимому

Обзор

примечание

Эта страница переведена при помощи нейросети GigaChat.

PL/pgSQL - это загружаемый процедурный язык для системы баз данных PostgreSQL. Целями проектирования PL/pgSQL были создание загружаемого процедурного языка, который:

  • может использоваться для создания функций, процедур и триггеров;
  • добавляет структуры управления к языку SQL;
  • может выполнять сложные вычисления;
  • наследует все пользовательские типы, функции, процедуры и операторы;
  • может быть определен как доверенный язык;
  • легко использовать.

Функции, созданные с использованием PL/pgSQL, могут использоваться везде, где могли бы использоваться встроенные функции. Например, можно создавать сложные условные вычислительные функции, а затем использовать их для определения операторов или использовать их в выражениях индекса.

В PostgreSQL версии 9.0 и выше, PL/pgSQL установлен по умолчанию. Однако это все еще загружаемый модуль, поэтому особенно обеспокоенные безопасностью администраторы могут удалить его при необходимости.

Преимущества использования PL/pgSQL

SQL – это язык, который использует PostgreSQL и большинство других реляционных баз данных в качестве языка запросов. Он портативный и легкий для изучения. Но каждый оператор SQL должен выполняться индивидуально сервером базы данных.

Это означает, что клиентское приложение должно отправлять каждый запрос на сервер базы данных, ждать его обработки, получать и обрабатывать результаты, выполнять некоторые вычисления, а затем отправлять дополнительные запросы на сервер. Все это влечет за собой межпроцессное взаимодействие и также повлечет накладные расходы сети, если клиент находится на другом компьютере, чем сервер базы данных.

С помощью PL/pgSQL можно объединить блок вычислений и серию запросов внутри сервера базы данных, тем самым обладая мощностью процедурного языка и простотой использования SQL, но с значительной экономией накладных расходов на связь между клиентом и сервером.

  • дополнительные обращения туда и обратно между клиентом и сервером устранены;
  • промежуточные результаты, которые клиенту не нужны, не нужно преобразовывать или передавать между сервером и клиентом;
  • можно избежать нескольких раундов синтаксического анализа запроса.

Это может привести к значительному увеличению производительности по сравнению с приложением, которое не использует сохраненные функции.

Кроме того, с помощью PL/pgSQL можно использовать все типы данных, операторы и функции SQL.

Поддерживаемые типы данных аргументов и возвращаемых значений

Функции, написанные на PL/pgSQL, могут принимать в качестве аргументов любые скалярные типы данных или массивы, поддерживаемый сервером, и возвращать в качестве результата любой из этих типов. Они также могут принимать или возвращать любой составной тип (тип строки), указанный по имени. Также возможно объявить функцию PL/pgSQL как принимающую record, что означает, что любой составной тип подойдет для ввода, или как возвращающую record, что означает, что результатом является тип строки, столбцы которого определяются спецификацией в запросе вызова, как обсуждалось в разделе «Табличные функции».

Функции PL/pgSQL могут быть объявлены для принятия переменного количества аргументов с использованием маркера VARIADIC. Это работает точно так же, как и для SQL-функций, как обсуждается в разделе «SQL-функции с переменным количеством аргументов».

Функции PL/pgSQL также могут быть объявлены для приема и возврата полиморфных типов, описанных в разделе «Полиморфные типы», что позволяет фактическим типам данных, обрабатываемые функцией, изменяться от вызова к вызову. Примеры приведены в разделе «Объявление параметров функции».

Функции PL/pgSQL также могут быть объявлены для возвращения набора (или таблицы) любого типа данных, который может быть возвращен как отдельный экземпляр. Такая функция генерирует свой вывод путем выполнения RETURN NEXT для каждого желаемого элемента результирующего набора или с помощью RETURN QUERY для вывода результата вычисления запроса.

Наконец, функция PL/pgSQL может быть объявлена для возврата void, если у нее нет полезного значения возврата. (В качестве альтернативы его можно было бы написать как процедуру в этом случае.)

Функции PL/pgSQL также могут быть объявлены с выходными параметрами вместо явного указания типа возвращаемого значения. Это не добавляет никаких фундаментальных возможностей к языку, но часто удобно, особенно для возврата нескольких значений. Обозначение RETURNS TABLE также может использоваться вместо RETURNS SETOF.

Конкретные примеры приведены в разделе «Объявление параметров функции» и «Команды, возвращающие значения из функции».