在postgresql函数中抛出异常

时间:2017-02-13 07:27:49

标签: postgresql exception-handling

我是Postgresql的新手,所以我不想为一些基本任务创建自己的结构.... 我的任务是创建函数并在某些条件下抛出异常(RAISE EXCEPTION 'test')以便客户端捕获它或在不正确处理它的情况下重新抛出。问题是在抛出之前我想将异常LOG记录到数据库中的特殊表中,但是意识到抛出错误正在回滚之前所做的更改!有没有办法改变这种行为或我能做的所有 - 添加一些CODE输出参数并根据该CODE在客户端上抛出错误?我现在使用的示例代码:

CREATE OR REPLACE FUNCTION fn_...()
...
BEGIN
    IF nretry_count >= nmax_retry
    THEN
      INSERT INTO log VALUES (error_type, value) VALUES (1,'Max retry exceeded!');
      RAISE EXCEPTION 'Max retry count exceeded';
    END IF;
END
$$ LANGUAGE plpgsql;

1 个答案:

答案 0 :(得分:3)

您可以启动交易并在应用程序中设置SAVEPOINT。然后,在您捕获异常后,ROLLBACK TO SAVEPOINT,创建日志条目并@Service public class UserService { public void addUser(User user) { if (!userRepository.exists(user.getId())) { userRepository.save(user); } } public void updateUser(int id, User user) { if (userRepository.exists(user.getId())) { userRepository.save(user); } } }

无法从函数中抛出异常并且执行未回滚的数据修改,因为PostgreSQL中没有“自治事务”。