Гость
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Perform в запрсе с With внутри функции / 6 сообщений из 6, страница 1 из 1
13.02.2021, 22:14
    #40045122
Kr_Yury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Perform в запрсе с With внутри функции
Здесь 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
14.02.2021, 12:54
    #40045201
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Perform в запрсе с With внутри функции
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
15.02.2021, 12:36
    #40045409
Kr_Yury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Perform в запрсе с With внутри функции
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
15.02.2021, 12:43
    #40045411
Kr_Yury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Perform в запрсе с With внутри функции
И самое поганое с функциями, не возвращающими значение, что конструкция
Код: 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
15.02.2021, 13:08
    #40045424
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Perform в запрсе с With внутри функции
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
15.02.2021, 13:33
    #40045436
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Perform в запрсе с With внутри функции
Kr_Yury,

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

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


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


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