这是我的代码。
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 "附近给了我一个sintax错误,我试着通过删除begin和declarate来纠正它,并用execute代替,但是在那之后,它仍然在CURSOR给了我一个sintax错误,有人能告诉我为什么吗?
CREATE TRIGGER语法不允许在CREATE TRIGGER语句中直接使用lpgsql代码。
你必须调用一个函数或过程。
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 "值来声明一个游标,并且只返回 "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触发功能.