powered by simpleCommunicator - 2.0.41     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Perform в запрсе с With внутри функции
6 сообщений из 6, страница 1 из 1
Perform в запрсе с With внутри функции
    #40045122
Kr_Yury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здесь foo - функция не возвращающая значений
Я для себя нашёл такое решение (то есть используется костыль в виде select count(*) into i ):
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
do $$
declare
   i integer;
begin
    with txn as
    (update transaction
        set amount = amount * 1.1 
      where statusid = 3
      returning transactionid, amount
    ),
    ...
    select count(*) into i
    from
       (select foo(txn.transactionid, txn.amount)
          from txn) t;
end;
$$;

Выглядит не слишком кошерно, но работает. Кто-нибудь может подсказать более красивое решение?
И ещё - в документации есть такая фраза: Для запросов WITH после PERFORM нужно поместить запрос в скобки. Можете объяснить о чём речь? Приведите пример запроса
...
Рейтинг: 0 / 0
Perform в запрсе с With внутри функции
    #40045201
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kr_Yury,

PERFORM ( WITH .... ) ;
ровно как в документации написано.

Т.е. вашем случае наверное
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
PERFORM (
    with txn as
    (update transaction
        set amount = amount * 1.1 
      where statusid = 3
      returning transactionid, amount
    ),
    ...
    select foo(txn.transactionid, txn.amount) from txn
);




--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
Perform в запрсе с With внутри функции
    #40045409
Kr_Yury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Boguk, во первых из документации совсем не следует, что конструкция должна быть именно такой: PERFORM ( WITH .... ) ;
Я эту фразу понял как
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
PERFORM foo(txn.transactionid, txn.amount) from txn
(
    with txn as
    (update transaction
        set amount = amount * 1.1 
      where statusid = 3
      returning transactionid, amount
    ),
    ...
);


Но и приведенная конструкция при использовании в Pl/Pgsql функции не работает, возвращается ошибка
"WITH clause containing a data-modifying statement must be at the top level"
...
Рейтинг: 0 / 0
Perform в запрсе с With внутри функции
    #40045411
Kr_Yury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И самое поганое с функциями, не возвращающими значение, что конструкция
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
    with txn as
    (update transaction
        set amount = amount * 1.1 
      where statusid = 3
      returning transactionid, amount
    ),
    ...
      tt as
       (select foo(txn.transactionid, txn.amount)
          from txn)
   ...

выполняется без ошибок, но реально вызовы foo не выполняются. По крайней мере так работает в версии 10.10
...
Рейтинг: 0 / 0
Perform в запрсе с With внутри функции
    #40045424
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kr_Yury
Maxim Boguk, во первых из документации совсем не следует, что конструкция должна быть именно такой: PERFORM ( WITH .... ) ;
Я эту фразу понял как[src PLSQL]


Уж сколько раз писали не читать русскую (или любую другую переводную) документацию... а только английский оригинал.
В английском все однозначно

This executes query and discards the result. Write the query the same way you would write an SQL SELECT command, but replace the initial keyword SELECT with PERFORM. For WITH queries, use PERFORM and then place the query in parentheses. (In this case, the query can only return one row.)


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

Как ни странно тот синтаксис к которому вы пришли в итоге в первом посте - единственный рабочий на данный момент.
Я и сам не знал что PERFORM / WITH с DML - не работают в связке.

Так что вот только так как вы сделали.


--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Perform в запрсе с With внутри функции
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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