T
TwangerJune 7, 2023, 11:12 a.m.

Ошибка при выполнении триггерной функции (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

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

We recommend hosting TIMEWEB
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.

Do you like it? Share on social networks!

0

Comments

Only authorized users can post comments.
Please, Log in or Sign up
МВ

Qt - Test 001. Signals and slots

  • Result:68points,
  • Rating points-1
ЛС

C++ - Test 001. The first program and data types

  • Result:53points,
  • Rating points-4
АА

C++ - Test 001. The first program and data types

  • Result:60points,
  • Rating points-1
Last comments
ИМ
Игорь МаксимовOct. 5, 2024, 7:51 a.m.
Django - Lesson 064. How to write a Python Markdown extension Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas5July 5, 2024, 11:02 a.m.
QML - Lesson 016. SQLite database and the working with it in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
k
kmssrFeb. 8, 2024, 6:43 p.m.
Qt Linux - Lesson 001. Autorun Qt application under Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
Qt WinAPI - Lesson 007. Working with ICMP Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
EVA
EVADec. 25, 2023, 10:30 a.m.
Boost - static linking in CMake project under Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
Now discuss on the forum
K
KeithfapOct. 13, 2024, 9:24 a.m.
добавить qlineseries в функции North Symbol by Bubnov Ltd https://seven-elephants.com/en/categories/penthouse/ Искеле – жемчужина острова! Все факторы говорят про большой инвестиционный потенциал данного района как для …
JW
Jhon WickOct. 1, 2024, 3:52 p.m.
Indian Food Restaurant In Columbus OH| Layla’s Kitchen Indian Restaurant If you're looking for a truly authentic https://www.laylaskitchenrestaurantohio.com/ , Layla’s Kitchen Indian Restaurant is your go-to destination. Located at 6152 Cleveland Ave, Colu…
КГ
Кирилл ГусаревSept. 27, 2024, 9:09 a.m.
Не запускается программа на Qt: точка входа в процедуру не найдена в библиотеке DLL Написал программу на C++ Qt в Qt Creator, сбилдил Release с помощью MinGW 64-bit, бинарнику напихал dll-ки с помощью windeployqt.exe. При попытке запуска моей сбилженной программы выдаёт три оши…
F
FynjyJuly 22, 2024, 4:15 a.m.
при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …

Follow us in social networks