事务 - Oracle Vs PostgreSQL

时间:2014-11-12 15:34:30

标签: postgresql triggers

PostgreSQL没有在触发器函数中插入保存点的功能,当有异常时(如异常NO_DATA_FOUND),整个事务将被回滚。但是,我只是想回滚到最后保存的点,而不是回滚整个事务。

还有其他替代方法,我可以在Postgresql的触发器函数中有多个Save点。

这是我的代码:

CREATE OR REPLACE FUNCTION func_ex() RETURNS trigger AS  $func_ex$
    DECLARE               
    var_name  name;

    BEGIN
       INSERT INTO log_table (empid, empname) values (100, 'Name');

       -- savepoint my_savepoint; "cannot have savepoints in triggers

       Select empname INTO strict var_name from emp_table1 WHERE empid = 3232332;  

    EXCEPTION WHEN NO_DATA_FOUND THEN 
    RAISE Notice 'No data found';
    RETURN NEW;

    END;

  return new
$func_ex$ LANGUAGE plpgsql;
-- End of Function

-- Creation of Trigger
   CREATE TRIGGER insert_trigger1 AFTER update of empname 
   ON emp_table1 EXECUTE PROCEDURE func_ex();

2 个答案:

答案 0 :(得分:1)

  

PostgreSQL没有在触发函数中插入保存点的功能

实际上,确实如此,它们只隐含在BEGIN ... EXCEPTION块中。

您的代码看起来是正确的,并且不清楚您尝试实现的目标尚不清楚。

如果您想在触发器中使用多个保存点,请嵌套BEGIN ... EXCEPTION块。您可以将RAISE与自定义SQLSTATE一起用于流量控制。

如果PL / PgSQL也支持显式命名保存点,那就太好了,但是根据我的经验,使用异常块效果很好。

答案 1 :(得分:0)

通过嵌套Begin .. Exception Blocks我可以在触发器函数中有多个保存点。