40.1. Обзор#

40.1. Обзор

40.1. Обзор #

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

  • Можно использовать для создания функций, процедур и триггеров.

  • Добавляет управляющие структуры в язык SQL.

  • Может выполнять сложные вычисления.

  • Сохраняются все пользовательские типы, функции, процедуры и операторы.

  • может быть определено как доверенное сервером,

  • легко использовать.

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

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

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

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

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

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

  • Все дополнительные обращения между клиентом и сервером устраняются.

  • Промежуточные результаты, которые клиент не нуждается, не обязательно маршализовывать или передавать между сервером и клиентом

  • Можно избежать множественных раундов разбора запроса

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

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

40.1.2. Поддерживаемые типы данных аргументов и результатов #

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

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

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

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

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

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

Специфичные примеры приведены в Раздел 40.3.1 и Раздел 40.6.1.