为什么我在pgadmin4(触发器)上有一个语法错误?

问题描述 投票:0回答:1

这是我的代码。

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错误,有人能告诉我为什么吗?

database postgresql data-analysis pgadmin
1个回答
1
投票

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触发功能.

© www.soinside.com 2019 - 2024. All rights reserved.