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

Функции PL/Python

примечание

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

Функции в PL/Python объявляются с помощью стандартного синтаксиса CREATE FUNCTION :

CREATE FUNCTION funcname (argument-list)
RETURNS return-type
AS $$
# PL/Python function body
$$ LANGUAGE plpython3u;

Тело функции – это просто сценарий Python. Когда функция вызывается, ее аргументы передаются как элементы списка args. Именованные аргументы также передаются как обычные переменные сценарию Python. Использование именованных аргументов обычно более читаемо. Результат возвращается из кода Python обычным способом с помощью return или yield (в случае оператора результирующего набора). Если не предоставляется возвращаемое значение, Python возвращает значение по умолчанию None. PL/Python преобразует значение None Python в нулевое значение SQL. В процедуре результат от кода Python должен быть None (обычно достигается путем завершения процедуры без оператора return или использования оператора return без аргумента), в противном случае будет вызвано исключение.

Например, функцию для возврата большего из двух целых чисел можно определить следующим образом:

CREATE FUNCTION pymax (a integer, b integer)
RETURNS integer
AS $$
if a > b:
return a
return b
$$ LANGUAGE plpython3u;

Код Python, который указан в качестве тела определения функции, преобразуется в функцию Python. Например, вышеупомянутое приводит к следующему:

def __plpython_procedure_pymax_23456():
if a > b:
return a
return b

Предполагая, что 23456 – это идентификатор объекта, присвоенный функции PostgreSQL.

Аргументы устанавливаются как глобальные переменные. Из-за правил области видимости Python это имеет тонкий побочный эффект, заключающийся в том, что переменная аргумента не может быть повторно назначена внутри функции значению выражения, которое включает имя самой переменной, если только переменная не будет объявлена глобальной в блоке. Например, следующий код не сработает:

CREATE FUNCTION pystrip(x text)
RETURNS text
AS $$
x = x.strip() # error
return x
$$ LANGUAGE plpython3u;

Потому что присвоение значения x делает x локальной переменной для всего блока, и поэтому x справа от оператора присваивания ссылается на еще не присвоенную локальную переменную x, а не на параметр функции PL/Python. Используя оператор global, можно заставить этот код работать:

CREATE FUNCTION pystrip(x text)
RETURNS text
AS $$
global x
x = x.strip() # ok now
return x
$$ LANGUAGE plpython3u;

Но рекомендуется не полагаться на эту деталь реализации PL/Python. Лучше рассматривать параметры функции как доступные только для чтения.