T
Twanger7 июня 2023 г. 21:12

Ошибка при выполнении триггерной функции (GreenPlum)

PgSQL, GreenPlum, Триггерные функции

Есть 3 таблицы fact_amount со структурой:

CREATE TABLE fact_amount (
    id serial4 NOT NULL,
    fdate date NULL,
    type_activity_id int4 NULL,
    status_id int4 NULL,
    CONSTRAINT fact_amount_pk_1 PRIMARY KEY (id),
    CONSTRAINT fact_amount_fk_1 FOREIGN KEY (category_id) REFERENCES mdv_db.spr_category(category_id),
    CONSTRAINT fact_amount_fk_2 FOREIGN KEY (status_id) REFERENCES mdv_db.spr_status(status_id),
    CONSTRAINT fact_amount_fk_3 FOREIGN KEY (type_activity_id) REFERENCES mdv_db.spr_type_activity(type_activity_id)
);

spr_status:

CREATE TABLE spr_status (
    status_id serial4 NOT NULL,
    status_name varchar NULL,
    CONSTRAINT spr_status_pk PRIMARY KEY (status_id)
);

spr_type_activity:

CREATE TABLE spr_type_activity (
    type_activity_id serial4 NOT NULL,
    type_activity_name varchar NULL,
    CONSTRAINT spr_type_activity_pk PRIMARY KEY (type_activity_id)
);

Надо создать представление с данными из таблицы fact_amount и транспонированной spr_type_activity и значениями из spr_status. Сначала создал функцию, которая все это преобразовывала. Все прекрасно работало, кроме того, чтобы при изменении в справочнике обновлялось представление. В итоге преобразовал ее в триггерную фушкцию:

CREATE TRIGGER tr_spr_type_activity 
AFTER INSERT OR DELETE OR UPDATE
ON spr_type_activity FOR EACH ROW EXECUTE PROCEDURE c_crosstab();

CREATE OR REPLACE FUNCTION c_crosstab()
 RETURNS trigger
 LANGUAGE plpgsql
AS $function$
DECLARE
    casesql varchar;
dynsql varchar;
r record;
eavsql_inarg varchar;
resview varchar;
rowid varchar;
colid varchar;
val varchar;
BEGIN   
eavsql_inarg = 'SELECT fa.id,
    sb.id_branch,
    sb.parent_branch_id,
    fa.fdate,
    sb.branch_name,
    ss.status_name,
    fa.type_activity_id,
    sa.type_activity_name
   FROM mdv_db.fact_amount fa
     LEFT JOIN mdv_db.branch sb ON fa.id_branch = sb.id_branch
     LEFT JOIN mdv_db.spr_category sc ON fa.category_id = sc.category_id
     LEFT JOIN mdv_db.spr_status ss ON fa.status_id = ss.status_id
     LEFT JOIN mdv_db.spr_type_activity sa ON fa.type_activity_id = sa.type_activity_id';
resview = 'v_crosstab';
rowid = 'id';
colid = 'type_activity_name';
val = 'status_name';
dynsql = '';

FOR r IN SELECT * FROM pg_views
WHERE lower(viewname) = lower(resview)
  LOOP 
      EXECUTE 'DROP VIEW IF EXISTS ' || resview;
END LOOP;

casesql = 'SELECT DISTINCT ' || colid || ' AS v from (' || eavsql_inarg || ') eav ORDER BY ' || colid;

FOR r IN EXECUTE casesql LOOP
    dynsql = dynsql || ', ' || 'CASE WHEN ' || colid || '=''' || r.v || ''' THEN ' || val || ' ELSE NULL END AS ' || r.v;
END LOOP;

dynsql = 'CREATE VIEW ' || resview || ' AS SELECT ' || rowid || dynsql || ' from (' || eavsql_inarg || ') eav ORDER BY ' || rowid;

RAISE NOTICE 'dynsql %1', dynsql;

EXECUTE dynsql;
END;
$function$

Выходит следующая ошибка:

Error synchronizing data with database

Причина:
 SQL Error [0A000]: ERROR: function cannot execute on a QE slice because it issues a non-SELECT statement  (seg5 172.23.133.194:6002 pid=32075)
  Где: SQL statement "DROP VIEW IF EXISTS v_crosstab"
PL/pgSQL function c_crosstab() line 34 at EXECUTE statement

Созданием процедур/функций раньше не занимался. В чем ошибка и как ее исправить?

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Вам это нравится? Поделитесь в социальных сетях!

0

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
Lz

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:70баллов,
  • Очки рейтинга1
РК

Qt - Тест 001. Сигналы и слоты

  • Результат:84баллов,
  • Очки рейтинга4
ВМ

C++ - Тест 001. Первая программа и типы данных

  • Результат:80баллов,
  • Очки рейтинга4
Последние комментарии
k
kmssr9 февраля 2024 г. 5:43
Qt Linux - Урок 001. Автозапуск Qt приложения под Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
АК
Анатолий Кононенко5 февраля 2024 г. 12:50
Qt WinAPI - Урок 007. Работаем с ICMP Ping в Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
EVA
EVA25 декабря 2023 г. 21:30
Boost - статическая линковка в CMake проекте под Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
J
JonnyJo25 декабря 2023 г. 19:38
Boost - статическая линковка в CMake проекте под Windows Сделал всё по-как у вас, но выдаёт ошибку [build] LINK : fatal error LNK1104: не удается открыть файл "libboost_locale-vc142-mt-gd-x64-1_74.lib" Хоть убей, не могу понять в чём дел…
G
Gvozdik19 декабря 2023 г. 8:01
Qt/C++ - Урок 056. Подключение библиотеки Boost в Qt для компиляторов MinGW и MSVC Для решения твой проблемы добавь в файл .pro строчку "LIBS += -lws2_32" она решит проблему , лично мне помогло.
Сейчас обсуждают на форуме
BlinCT
BlinCT25 июня 2024 г. 11:00
Нарисовать кривую в qml Всем привет. Имеется Лист листов с тосками, точки получаны интерполяцией Лагранжа. Вопрос, как этими точками нарисовать кривую? ChartView отпадает сразу, в qt6.7 появился новый элемент…
Evgenii Legotckoi
Evgenii Legotckoi25 июня 2024 г. 1:11
добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
BlinCT
BlinCT5 мая 2024 г. 15:46
Написать свой GraphsView Всем привет. В Qt есть давольно старый обьект дял работы с графиками ChartsView и есть в 6.7 новый но очень сырой и со слабым функционалом GraphsView. По этой причине я хочу написать х…
Evgenii Legotckoi
Evgenii Legotckoi3 мая 2024 г. 0:07
Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Добрый день. По моему мнению - да, но то, что будет касаться вызовов к функционалу Андроида, может создать огромные трудности.
IscanderChe
IscanderChe30 апреля 2024 г. 14:22
Во Flask рендер шаблона не передаётся в браузер Доброе утро! Имеется вот такой шаблон: <!doctype html><html> <head> <title>{{ title }}</title> <link rel="stylesheet" href="{{ url_…

Следите за нами в социальных сетях