在触发器中使用光标

时间:2012-12-09 12:30:18

标签: postgresql

我正在尝试编写一个执行插入时执行的触发器函数。条件是,如果id已经存在,那么time_create现在应该是time_dead。

 CREATE function archive_temp() returns trigger as '
 begin
   insert into  temporary_archive
  values
 (
 OLD.id,
   OLD.time_create,
   OLD.time_dead,
    OLD.fname,
    current_user,
    now(),
      now(),
  TG_OP
    );
     return null;
    end;
   ' LANGUAGE 'plpgsql';
     -----------------------------

CREATE TRIGGER archive_temps 
AFTER DELETE OR UPDATE 
on temporary_object
FOR EACH ROW
DECLARE 
temporary_archive temporary_object.id%type;
begin
if inserting then 
select id into temporary_archive
from temporary_object
where id = :old.id;
if temporary_archive is not null then

 EXECUTE PROCEDURE archive_temps();
 end if;
 end if;ins

1 个答案:

答案 0 :(得分:0)

从您的示例中我看起来就像您尝试以Oracle方式做事。 PostgreSQL是不同的。我也没有在你的代码中看到任何游标的使用,所以这个问题可能会产生误导。

在PostgreSQL中,触发器只能调用过程,并且过程必须基本上是自包含的。从本质上讲,您将不得不重新编写代码。 FOR EACH ROW之后唯一接受的语法是EXECUTE PROCEDURE,因此您的其他逻辑必须移动到用户定义的函数中。如果需要,可以通过调用函数(如果函数返回bool)在WHEN条件下应用函数。或者你可以把它构建到你的触发逻辑中。