Обзор

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

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

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

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

  • Исключены дополнительные циклы передачи и подтверждения приема данных между клиентом и сервером

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

  • Можно избежать многократного синтаксического анализа запроса

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

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



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

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

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

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

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

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

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

Конкретные примеры приведены в подразделах Объявление параметров функции и Возврат из функции.