Синтаксис 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 .