Почему у меня появляется синтаксическая ошибка на pgadmin4 (триггер)? - PullRequest
0 голосов
/ 17 июня 2020

это мой код:

CREATE TRIGGER sovrapposizione_spettacoli
BEFORE INSERT ON Spettacoli 
FOR EACH ROW
BEGIN 
DECLARE 
CURSOR c1 IS SELECT data_e_ora, durata FROM mv_spettacoli_attivi s WHERE s.codice_sala=: NEW.sala; inizio_spettacolo     mv_spettacoli_attivi.data_e_ora%TYPE; durata_spettacolo     mv_spettacoli_attivi.durata

теперь игнорируйте код после SELECT, но pgadmin дал мне синтаксическую ошибку рядом с «begin», я попытался исправить это, удалив begin и declare и заменив на выполнить, но после этого он все еще дает мне синтаксическую ошибку в CURSOR, может ли кто-нибудь сказать мне, почему?

1 Ответ

1 голос
/ 17 июня 2020

Синтаксис CREATE TRIGGER не позволяет иметь прямой код pl / pg sql в операторе CREATE TRIGGER.

Вы должны вызвать функцию или процедуру:

CREATE [ CONSTRAINT ] TRIGGER name { BEFORE | AFTER | INSTEAD OF } { event [ OR ... ] }
    ON table_name
    [ FROM referenced_table_name ]
    [ NOT DEFERRABLE | [ DEFERRABLE ] [ INITIALLY IMMEDIATE | INITIALLY DEFERRED ] ]
    [ REFERENCING { { OLD | NEW } TABLE [ AS ] transition_relation_name } [ ... ] ]
    [ FOR [ EACH ] { ROW | STATEMENT } ]
    [ WHEN ( condition ) ]
    EXECUTE { FUNCTION | PROCEDURE } function_name ( arguments )

Вот короткая демонстрация, которую вы можете использовать для адаптации вашего кода (триггер только объявляет курсор, используя 'новое' значение вставляемой строки и не делает ничего, кроме возврата 'new': это необходимо для триггера перед вставкой в ​​PostgreSQL).

Исходный код:

create function mytriggerfunc()
returns trigger
language plpgsql
as
$$
declare
 c1 cursor for select * from mytable2 where id2 = new.id1;
begin
 return new;
end;
$$;
\echo
CREATE TRIGGER mytrigger
BEFORE INSERT ON mytable1 
FOR EACH ROW
execute function mytriggerfunc();
\echo
insert into mytable1 values(1, 'ONE');
\echo
select * from mytable1;

Выполнение с помощью psql:

create function mytriggerfunc()
returns trigger
language plpgsql
as
$$
declare
 c1 cursor for select * from mytable2 where id2 = new.id1;
begin
 return new;
end;
$$;
CREATE FUNCTION

CREATE TRIGGER mytrigger
BEFORE INSERT ON mytable1 
FOR EACH ROW
execute function mytriggerfunc();
CREATE TRIGGER

insert into mytable1 values(1, 'ONE');
INSERT 0 1

select * from mytable1;
 id1 | col2 
-----+------
   1 | ONE
(1 row)

См. Триггерные функции PG .

...