Модераторы: LSD
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Написать тригерную функцию 
:(
    Опции темы
polin11
Дата 7.3.2024, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 122
Регистрация: 6.6.2015

Репутация: нет
Всего: нет



Использую PGSQL, нyжно написать тригерную функцию:
при удалении записи из таблицы Document нужно обновить\удалить запись из DocumentRaw.
Нужно обновить json из DocumentRaw, если поле NewKey пустое у записи, то запись нужно удалить.

Написал такой вариант, но тут 3 действия: select, update, delete
хочется сделать в 2 действия, select + (update либо delete в зависимости от условия)
может это сделать через CASE

Код

IF (OLD."Pk_Id" IS NOT NULL)
    THEN
        WITH rec AS(
            SELECT "@Document" AS "Id",
                    (COALESCE(("Key"->>OLD."Key"::text)::bigint, 0) - 1)::bigint AS "Value",
                    "Key"  - OLD."Key"::text AS "NewKey"
            FROM "Document"
            WHERE "Pk_Id" = OLD."Pk_Id"
            LIMIT 1
        ),
          upd AS(
           UPDATE "DocumentRaw"
           SET "Key" =  (CASE
             WHEN (SELECT "Value" FROM rec) > 0 AND rec."NewKey" != '{}'::jsonb
             THEN "Key" || jsonb_build_object(OLD."Key"::text, (SELECT "Value" FROM rec))
             WHEN (SELECT "Value" FROM rec) <= 0 AND rec."NewKey" != '{}'::jsonb
             THEN "Key"  - OLD."Key"::text
             END
             )
           FROM rec
           WHERE
               rec."NewKey" != '{}'::jsonb AND
              "@DocumentRaw" = rec."Id"
       )
         DELETE FROM "DocumentRaw"
       USING rec
       WHERE rec."NewKey" = '{}'::jsonb AND
       "@DocumentRaw" = rec."Id";
END IF;




Это сообщение отредактировал(а) polin11 - 7.3.2024, 10:58
PM MAIL   Вверх
Akina
Дата 7.3.2024, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20570
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 3
Всего: 453



Не вижу ТРЁХ альтернативных действий. Вижу безусловный UPDATE .. RETURNING и при выполнении условия DELETE. Причём всё это можно собрать в один запрос с UPDATE в CTE.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PostgreSQL | Следующая тема »


 




[ Время генерации скрипта: 0.1112 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.