事务-Oracle与PostgreSQL

事务-Oracle与PostgreSQL,postgresql,triggers,Postgresql,Triggers,PostgreSQL没有在触发器函数中插入保存点的功能,当出现异常(如找不到异常数据)时,整个事务将回滚。但是我不想回滚整个事务,我只想回滚到最后保存的点 在Postgresql中,是否有其他方法可以在触发器函数中拥有多个保存点 这是我的密码: CREATE OR REPLACE FUNCTION func_ex() RETURNS trigger AS $func_ex$ DECLARE var_name name; BEGIN

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

在Postgresql中,是否有其他方法可以在触发器函数中拥有多个保存点

这是我的密码:

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();
PostgreSQL没有在触发器函数中插入保存点的功能

事实上,它是这样的,它们只是隐含在
BEGIN。。。异常

您的代码看起来是正确的,但不清楚您试图实现的目标是什么,它还没有做到

如果希望触发器中有多个保存点,请嵌套
BEGIN。。。异常
块。您可以将
RAISE
与自定义
SQLSTATE
一起用于流控制


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

使用嵌套的Begin。。异常块我可以在触发器函数中有多个保存点。

我想防止在触发器函数中发生异常时整个事务隐式回滚。@user1581721但您在问题中已经说明了如何执行该操作,所以我不太明白您的问题。通过嵌套开始。。异常块我可以在触发器函数中有多个保存点。