Функции 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. Лучше рассматривать параметры функции как доступные только для чтения.