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

Пікірлер

Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
Кіріңіз немесе Тіркеліңіз
m
  • molni99
  • Қаз. 26, 2024, 1:37 Т.Ж.

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

  • Нәтиже:80ұпай,
  • Бағалау ұпайлары4
m
  • molni99
  • Қаз. 26, 2024, 1:29 Т.Ж.

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

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

C++ - Тест 003. Условия и циклы

  • Нәтиже:42ұпай,
  • Бағалау ұпайлары-8
Соңғы пікірлер
Evgenii Legotckoi
Evgenii LegotckoiҚаз. 31, 2024, 2:37 Т.Қ.
Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
A
ALO1ZEҚаз. 19, 2024, 8:19 Т.Ж.
Qt Creator көмегімен fb3 файл оқу құралы Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Игорь МаксимовҚаз. 5, 2024, 7:51 Т.Ж.
Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
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 - вот это вопрос ))
Енді форумда талқылаңыз
9
9AnonimҚаз. 25, 2024, 9:10 Т.Ж.
Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…
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 приложения их можно выбрать. В чем может …

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