事务-Oracle与PostgreSQL
PostgreSQL没有在触发器函数中插入保存点的功能,当出现异常(如找不到异常数据)时,整个事务将回滚。但是我不想回滚整个事务,我只想回滚到最后保存的点 在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
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但您在问题中已经说明了如何执行该操作,所以我不太明白您的问题。通过嵌套开始。。异常块我可以在触发器函数中有多个保存点。