T
TwangerМаусым 7, 2023, 11: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

Пікірлер

Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
Кіріңіз немесе Тіркеліңіз
Г

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

  • Нәтиже:66ұпай,
  • Бағалау ұпайлары-1
t

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

  • Нәтиже:33ұпай,
  • Бағалау ұпайлары-10
t

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

  • Нәтиже:52ұпай,
  • Бағалау ұпайлары-4
Соңғы пікірлер
G
GoattRockҚыр. 3, 2024, 1:50 Т.Қ.
Linux жүйесінде файлдарды қалай көшіруге болады Задумывались когда-нибудь о том, как мы привыкли доверять свои вещи службам грузоперевозок? Сейчас такие услуги стали неотъемлемой частью нашей жизни, особенно когда речь идет о переездах между …
d
dblas5Шілде 5, 2024, 11:02 Т.Ж.
QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
k
kmssrАқп. 8, 2024, 6:43 Т.Қ.
Qt Linux - Сабақ 001. Linux астында Autorun Qt қолданбасы как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
АК
Анатолий КононенкоАқп. 5, 2024, 1:50 Т.Ж.
Qt WinAPI - Сабақ 007. Qt ішінде ICMP Ping арқылы жұмыс істеу Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
Енді форумда талқылаңыз
Evgenii Legotckoi
Evgenii LegotckoiМаусым 24, 2024, 3:11 Т.Қ.
добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
F
FynjyШілде 22, 2024, 4:15 Т.Ж.
при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …
BlinCT
BlinCTМаусым 25, 2024, 1 Т.Ж.
Нарисовать кривую в qml Всем привет. Имеется Лист листов с тосками, точки получаны интерполяцией Лагранжа. Вопрос, как этими точками нарисовать кривую? ChartView отпадает сразу, в qt6.7 появился новый элемент…
BlinCT
BlinCTМамыр 5, 2024, 5:46 Т.Ж.
Написать свой GraphsView Всем привет. В Qt есть давольно старый обьект дял работы с графиками ChartsView и есть в 6.7 новый но очень сырой и со слабым функционалом GraphsView. По этой причине я хочу написать х…
Evgenii Legotckoi
Evgenii LegotckoiМамыр 2, 2024, 2:07 Т.Қ.
Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Добрый день. По моему мнению - да, но то, что будет касаться вызовов к функционалу Андроида, может создать огромные трудности.

Бізді әлеуметтік желілерде бақылаңыз