В четверг 24 октября 2024 г. состоялся вебинар "Обзор продуктов компании Axiom "
Тема: импортозамещение в области корпоративной Java-разработки: JDK, сервер приложений, контейнеры Docker
Докладчик: Иван Диканев. Запись вебинара будет опубликована. Следите за нашими новстями.

Процедуры на PLPYTHON с out-параметром

«Пост-Грэс-Кью-Эл» свободная объектно-реляционная СУБД. Обмениваемся вопросами и ответами о её работе.
Ответить
Георгий
Сообщения: 3
Зарегистрирован: Пт май 17, 2024 11:49 am

Процедуры на PLPYTHON с out-параметром

Сообщение Георгий »

Написал процедуру на plpython3u, которая содержит OUT-параметр

Код: Выделить всё

PROCEDURE process_command (IN p_command character varying, OUT numeric)  
При попытке выполнить эту процедуру получаю

Error [42703]: ERROR: attribute "log_id" does not exist in Python object
Подсказка: To return null in a column, let the returned object have an attribute named after column with value None.

В документации приводится пример процедуры, в которую включен "return", хотя, казалось бы, должно быть достаточно простого присваивания OUT-параметра.

Но если не делать return, то случается ошибка SQL Error [XX000]: ERROR: procedure returned null record.

Отсюда вопрос:
Как написать процедуру (именно процедуру!) на PLPYTHON с OUT-параметром?

Вот тестовый пример (с return):

Код: Выделить всё

CREATE OR REPLACE PROCEDURE job.test_out_param (param1 varchar,  OUT Log_Id numeric)

 LANGUAGE plpython3u

AS $procedure$

import os, stat
import datetime
from random import randint
log_id = 2024

plpy.notice('log_id = ' , hint="", detail='detail')
return(log_id)
$procedure$
;
Ну и текст ошибки: SQL Error [42703]: ERROR: attribute "log_id" does not exist in Python object
Подсказка: To return null in a column, let the returned object have an attribute named after column with value None.
Где: PL/Python procedure "test_out_param"
SQL statement "CALL job.test_out_param('param1_value', res)"
PL/pgSQL function inline_code_block line 1 at CALL

Если команду return закомментировать, (но оставить присвоение), то ошибка будет такая:
SQL Error [XX000]: ERROR: procedure returned null record
Где: SQL statement "CALL job.test_out_param('param1_value', res)"
Вот текст вызова:


Заранее благодарю ответивших.
Аватара пользователя
SQL*Plus
Сообщения: 250
Зарегистрирован: Ср апр 20, 2022 1:09 pm

Re: Процедуры на PLPYTHON с out-параметром

Сообщение SQL*Plus »

Посмотрел описание языка PL/Phyton
https://www.postgresql.org/docs/current/plpython.html

Ничего не нашел в нём про процедуры.
Описание дается только про функции:

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

Может быть вся ваша проблема в том, что PL/Phython не поддерживает процедуры?!
Аватара пользователя
SQL*Plus
Сообщения: 250
Зарегистрирован: Ср апр 20, 2022 1:09 pm

Re: Процедуры на PLPYTHON с out-параметром

Сообщение SQL*Plus »

Георгий писал(а): Пт май 17, 2024 12:18 pm Вот текст вызова:

Заранее благодарю ответивших.
И текст вызова где-то потерялся в пути - до форума не дошел... :-(
roruizi
Сообщения: 5
Зарегистрирован: Ср июн 01, 2022 4:43 pm

Re: Процедуры на PLPYTHON с out-параметром

Сообщение roruizi »

Попробуйте вот такой код. Запятая после log_id имеет значение и важна в return

CREATE OR REPLACE PROCEDURE job.test_out_param (param1 varchar, OUT Log_Id numeric)
LANGUAGE plpython3u
AS $procedure$
import os, stat
import datetime
from random import randint
log_id = 2024
plpy.notice('log_id = ' , hint="", detail='detail')
return(log_id,)
$procedure$
;

CALL job.test_out_param('hello'::char,null);
Георгий
Сообщения: 3
Зарегистрирован: Пт май 17, 2024 11:49 am

Re: Процедуры на PLPYTHON с out-параметром

Сообщение Георгий »

Большое спасибо! Помогло!
Ответить