powered by simpleCommunicator - 2.0.40     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Запуск процедуры через переменную
10 сообщений из 10, страница 1 из 1
Запуск процедуры через переменную
    #40108371
Сотрудник Главного Управления
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте, уважаемые форумчане.

В MS SQL SERVER можно сделать такой финт, например, в некоторой таблице содержатся имена хранимых процедур.
Все хранимые процедуры имеют одну и ту же сигнатуру (т.е. количество и типы аргументов одинаковые у всех).
Если в строковую переменную получить имя этой процедуры, тогда можно запустить процедуру, указав имя переменной.

Код: sql
1.
2.
3.
4.
5.
DECLARE @StoredProcedure VARCHAR(200)

SELECT @StoredProcedure = StoredProcedure FROM T_PROCEDURES WHERE IdObject = 123

EXEC @StoredProcedure @arg1, @arg2, @arg3



Как можно сделать аналогичный трюк в plpgSQL (PostgreSQL 14) ?
...
Рейтинг: 0 / 0
Запуск процедуры через переменную
    #40108374
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сотрудник Главного Управления
Здравствуйте, уважаемые форумчане.

В MS SQL SERVER можно сделать такой финт, например, в некоторой таблице содержатся имена хранимых процедур.
Все хранимые процедуры имеют одну и ту же сигнатуру (т.е. количество и типы аргументов одинаковые у всех).
Если в строковую переменную получить имя этой процедуры, тогда можно запустить процедуру, указав имя переменной.

Код: sql
1.
2.
3.
4.
5.
DECLARE @StoredProcedure VARCHAR(200)

SELECT @StoredProcedure = StoredProcedure FROM T_PROCEDURES WHERE IdObject = 123

EXEC @StoredProcedure @arg1, @arg2, @arg3



Как можно сделать аналогичный трюк в plpgSQL (PostgreSQL 14) ?


через выполнение динамических команд
https://www.postgresql.org/docs/12/plpgsql-statements.html#PLPGSQL-STATEMENTS-EXECUTING-DYN

PS: что то многовато последнее время вопросом про как mssql код на постгрес переводить.

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
Запуск процедуры через переменную
    #40108375
Сотрудник Главного Управления
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Boguk,

извините, я не совсем понял,
по ссылке, указанной вами, примеры, как с помощью EXECUTE выполнить различные команды типа SELECT, INSERT, UPDATE
но мне нужны не эти команды, а именно запуск существующих хранимых процедур.
И, если можно, покажите пример.
...
Рейтинг: 0 / 0
Запуск процедуры через переменную
    #40108381
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сотрудник Главного Управления
Maxim Boguk,

извините, я не совсем понял,
по ссылке, указанной вами, примеры, как с помощью EXECUTE выполнить различные команды типа SELECT, INSERT, UPDATE
но мне нужны не эти команды, а именно запуск существующих хранимых процедур.
И, если можно, покажите пример.


А как по вашему хранимые процедуры запускаются по синтаксису?
И что вам мешает через EXECUTE вызвать хранимую процедуру?

Код: sql
1.
EXECUTE 'PERFORM '||var_stored_function_name||'($1, $2, $3)' USING (arg1, arg2, arg3);




--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
Запуск процедуры через переменную
    #40108397
Сотрудник Главного Управления
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Boguk,

Спасибо!
...
Рейтинг: 0 / 0
Запуск процедуры через переменную
    #40124797
Сотрудник Главного Управления
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Boguk,

Вопрос немного усложняется.
Во-первых:
работает не так, как вы написали, а вот так:

Код: plsql
1.
2.
 EXECUTE 'CALL ' || x_stored_proc || ' ($1, $2, $3, $4) '
 USING arg1, arg2, arg3, arg4



Во-вторых:
самый последний параметр процедуры - имеет модификатор INOUT.
Так вот, выходное значение не попадает в arg4, хотя процедура выполняется.
Как сделать так, чтобы выходное значение записывалось в arg4 ?
...
Рейтинг: 0 / 0
Запуск процедуры через переменную
    #40124858
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сотрудник Главного Управления
Maxim Boguk,

Вопрос немного усложняется.
Во-первых:
работает не так, как вы написали, а вот так:

Код: plsql
1.
2.
 EXECUTE 'CALL ' || x_stored_proc || ' ($1, $2, $3, $4) '
 USING arg1, arg2, arg3, arg4



Во-вторых:
самый последний параметр процедуры - имеет модификатор INOUT.
Так вот, выходное значение не попадает в arg4, хотя процедура выполняется.
Как сделать так, чтобы выходное значение записывалось в arg4 ?


call это для процедуры
perform для функции

поскольку 90% pl/pgsql кода он на функциях (процедуры - для очень особых случаев и только с 12 версии) - я привёл пример который обычно работает.

про inout в сочетании с динамическими вызовами - я бы попробовал следующим образом (важно - я НЕ ПРОВЕРЯЛ идея на вскидку выглядит рабочей):

Код: sql
1.
 EXECUTE 'CALL ' || x_stored_proc || ' (arg1, arg2, arg3, arg4) '



Если не работает - тогда интересно будет...

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
Запуск процедуры через переменную
    #40124929
Сотрудник Главного Управления
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Boguk
Код: sql
1.
 EXECUTE 'CALL ' || x_stored_proc || ' (arg1, arg2, arg3, arg4) '

не, так не работает ...
...
Рейтинг: 0 / 0
Запуск процедуры через переменную
    #40125076
Swa111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сотрудник Главного Управления,


Если на выход только одина параметр, то наверное должно сработать так

Код: plsql
1.
2.
3.
 EXECUTE 'select * from ' || x_stored_proc || ' ($1, $2, $3, $4) '
 USING arg1, arg2, arg3, arg4
 into arg4
...
Рейтинг: 0 / 0
Запуск процедуры через переменную
    #40125111
Сотрудник Главного Управления
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Swa111,

Не работает так.
Выдаёт сообщение об ошибке:
столбец arg4 не существует
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Запуск процедуры через переменную
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]