<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://wiki.dzmuh.com/index.php?action=history&amp;feed=atom&amp;title=PL%2FpgSQL</id>
	<title>PL/pgSQL - История изменений</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.dzmuh.com/index.php?action=history&amp;feed=atom&amp;title=PL%2FpgSQL"/>
	<link rel="alternate" type="text/html" href="https://wiki.dzmuh.com/index.php?title=PL/pgSQL&amp;action=history"/>
	<updated>2026-05-06T06:46:06Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.38.4</generator>
	<entry>
		<id>https://wiki.dzmuh.com/index.php?title=PL/pgSQL&amp;diff=12429&amp;oldid=prev</id>
		<title>Dzmuh: Новая страница: «'''PL/pgSQL''' ({{lang-en|Procedural Language/PostGres Structured Query Language}}) — процедурное расширение языка SQL, используемое в СУБД PostgreSQL. Этот язык предназначен для написания функций, триггеров и правил и обладает следующими особенностями: *...»</title>
		<link rel="alternate" type="text/html" href="https://wiki.dzmuh.com/index.php?title=PL/pgSQL&amp;diff=12429&amp;oldid=prev"/>
		<updated>2023-05-04T22:31:35Z</updated>

		<summary type="html">&lt;p&gt;Новая страница: «&amp;#039;&amp;#039;&amp;#039;PL/pgSQL&amp;#039;&amp;#039;&amp;#039; ({{lang-en|Procedural Language/PostGres Structured Query Language}}) — процедурное расширение языка &lt;a href=&quot;/index.php?title=SQL&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;SQL (страница не существует)&quot;&gt;SQL&lt;/a&gt;, используемое в &lt;a href=&quot;/index.php?title=%D0%A1%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0_%D1%83%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%B1%D0%B0%D0%B7%D0%B0%D0%BC%D0%B8_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;Система управления базами данных (страница не существует)&quot;&gt;СУБД&lt;/a&gt; &lt;a href=&quot;/index.php/PostgreSQL&quot; title=&quot;PostgreSQL&quot;&gt;PostgreSQL&lt;/a&gt;. Этот язык предназначен для написания функций, триггеров и правил и обладает следующими особенностями: *...»&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;'''PL/pgSQL''' ({{lang-en|Procedural Language/PostGres Structured Query Language}}) — процедурное расширение языка [[SQL]], используемое в [[Система управления базами данных|СУБД]] [[PostgreSQL]]. Этот язык предназначен для написания функций, триггеров и правил и обладает следующими особенностями:&lt;br /&gt;
* добавляет управляющие конструкции к стандарту SQL;&lt;br /&gt;
* допускает сложные вычисления;&lt;br /&gt;
* может использовать все объекты БД, определенные пользователем;&lt;br /&gt;
* прост в использовании.&lt;br /&gt;
&lt;br /&gt;
== Преимущества использования ==&lt;br /&gt;
Стандартный SQL используется в PostgreSQL и других реляционных БД как основной язык для создания запросов. Он переносим и прост, как для изучения, так и для использования. Однако слабое его место — в том, что каждая конструкция языка выполняется сервером ''отдельно''. Это значит, что клиентское приложение должно отправлять каждый запрос серверу, получить его результат, определенным образом согласно логике приложения обработать его, посылать следующий запрос и т. д. В случае, если клиент и сервер БД расположены на разных машинах, это может привести к нежелательному увеличению задержек и объема пересылаемых от клиента серверу и наоборот данных.&lt;br /&gt;
&lt;br /&gt;
При использовании PL/pgSQL появляется возможность сгруппировать запросы и вычислительные блоки в единую конструкцию, которая будет размещаться и выполняться ''на сервере'', а клиент будет отправлять запрос на её выполнение и получать результат, минуя все промежуточные пересылки данных назад—вперед, что в большинстве случаев позитивно сказывается на производительности. Также функциональность анонимных блоков позволяет писать запросы не на SQL, а на любом существующем процедурном языке сервера, в том числе pl/pgSQL, без создания хранимых функций на сервере СУБД.&lt;br /&gt;
&lt;br /&gt;
== Поддерживаемые типы аргумента и возвращаемого значения ==&lt;br /&gt;
Функции, написанные на PL/pgSQL, могут принимать в качестве аргумента и возвращать как результат значения любого скалярного или составного типа, допустимые для сервера БД, включая определенные пользователем, строковые типы и записи.&lt;br /&gt;
&lt;br /&gt;
Допускаются также аргументы и возвращаемые значения, относящиеся к псевдотипам &amp;lt;code&amp;gt;anyelement&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;anyarray&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;anynonarray&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;anyenum&amp;lt;/code&amp;gt;. Благодаря этому появляется возможность определять полиморфные функции, принимаемый и возвращаемый которыми тип может изменяться от вызова к вызову. Функции на PL/pgSQL могут возвращать не одно значение, а целый набор значений, либо вообще не возвращать никакого значения (применяя тип &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
== Структура кода на PL/pgSQL ==&lt;br /&gt;
Любая программная конструкция (функция, триггер или правило), написанная на PL/pgSQL, имеет блочную компоновку и выглядит вот так:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;postgresql&amp;quot;&amp;gt;&lt;br /&gt;
[ &amp;lt;&amp;lt;метка&amp;gt;&amp;gt; ]&lt;br /&gt;
[ DECLARE&lt;br /&gt;
    объявления переменных ]&lt;br /&gt;
BEGIN&lt;br /&gt;
    тело программы&lt;br /&gt;
END [ метка ];&lt;br /&gt;
/*  Многострочный&lt;br /&gt;
    комментарий */&lt;br /&gt;
--  Однострочный комментарий&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Как и принято, квадратными скобками выделены фрагменты, которые опциональны и могут не присутствовать в конкретном варианте.&lt;br /&gt;
&lt;br /&gt;
Каждое отдельное объявление и каждая конструкция внутри тела программы должна заканчиваться точкой с запятой. Блок, находящийся внутри другого блока, также должен иметь точку с запятой после завершающего &amp;lt;code&amp;gt;END&amp;lt;/code&amp;gt;, однако самое «внешнее» &amp;lt;code&amp;gt;END&amp;lt;/code&amp;gt; в точке с запятой не нуждается.&lt;br /&gt;
&lt;br /&gt;
Любая конструкция внутри тела программы также может быть выделена в отдельный блок, с собственным разделом объявлений переменных.&lt;br /&gt;
&lt;br /&gt;
== Синтаксис языка ==&lt;br /&gt;
&lt;br /&gt;
=== Формат объявления переменных ===&lt;br /&gt;
Любая переменная в PL/pgSQL должна быть объявлена перед использованием, неявное объявление не поддерживается; единственным исключением является цикл &amp;lt;code&amp;gt;FOR&amp;lt;/code&amp;gt; — в нем переменная цикла по умолчанию объявляется как &amp;lt;code&amp;gt;INTEGER&amp;lt;/code&amp;gt;. Возможно сразу же присваивать переменной значение либо объявлять её как константу:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;postgresql&amp;quot;&amp;gt;&lt;br /&gt;
имя [ CONSTANT ] тип [ NOT NULL ] [ { DEFAULT | := } значение ]; &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ключевое слово &amp;lt;code&amp;gt;DEFAULT&amp;lt;/code&amp;gt; применяется для задания значения по умолчанию, ключевое слово &amp;lt;code&amp;gt;CONSTANT&amp;lt;/code&amp;gt; защищает переменную от дальнейшего изменения, определяя её как константу.&lt;br /&gt;
&lt;br /&gt;
=== Передача аргументов ===&lt;br /&gt;
По умолчанию переданные параметры обозначаются как &amp;lt;code&amp;gt;$1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;$2&amp;lt;/code&amp;gt; и так далее. Однако, если желательно увеличить читабельность кода, то можно обозначить эти параметры с помощью псевдонимов. Возможны два способа.&lt;br /&gt;
&lt;br /&gt;
Можно задавать имя параметра непосредственно в определении функции:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;postgresql&amp;quot;&amp;gt;CREATE FUNCTION sales_tax(subtotal real) RETURNS real AS $$&lt;br /&gt;
BEGIN&lt;br /&gt;
    RETURN subtotal * 0.06;&lt;br /&gt;
END;&lt;br /&gt;
$$ LANGUAGE plpgsql;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Иначе, можно объявить псевдоним для параметра непосредственно в разделе объявлений переменных:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;postgresql&amp;quot;&amp;gt;CREATE FUNCTION sales_tax(real) RETURNS real AS $$&lt;br /&gt;
DECLARE&lt;br /&gt;
    subtotal ALIAS FOR $1;&lt;br /&gt;
BEGIN&lt;br /&gt;
    RETURN subtotal * 0.06;&lt;br /&gt;
END;&lt;br /&gt;
$$ LANGUAGE plpgsql;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[PL/SQL]] — близкий язык от [[Oracle]]&lt;br /&gt;
* [[языки программирования, встраиваемые в PostgreSQL|Другие встраиваемые в PostgreSQL языки]]: &lt;br /&gt;
*: [[PL/Java]]&lt;br /&gt;
*: [[PL/Lua]]&lt;br /&gt;
*: [[PL/Perl]]&lt;br /&gt;
*: [[PL/PHP]]&lt;br /&gt;
*: [[PL/Python]]&lt;br /&gt;
*: [[PL/R]]&lt;br /&gt;
*: [[PL/Ruby]]&lt;br /&gt;
*: [[PL/Scheme]]&lt;br /&gt;
*: [[PL/Sh]]&lt;br /&gt;
*: [[PL/Tcl]]&lt;br /&gt;
*: [[PL/V8]]&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;br /&gt;
{{википедия|PL/pgSQL}}&lt;br /&gt;
* [http://www.postgresql.org/docs/current/static/plpgsql.html PL/pgSQL — SQL Procedural Language] {{ref-en}}&lt;br /&gt;
* {{статья|автор=Сергей Супрунов|заглавие=PostgreSQL: функции и триггеры|ссылка=http://samag.ru/archive/article/353|издание=[[Системный администратор (журнал)|Системный администратор]]|год=2004|номер=10 (23)}}&lt;br /&gt;
&lt;br /&gt;
[[Категория:Процедурные расширения SQL]]&lt;br /&gt;
[[Категория:PostgreSQL]]&lt;/div&gt;</summary>
		<author><name>Dzmuh</name></author>
	</entry>
</feed>