PostgreSQL异常处理:将已处理异常的错误记录存入独立表的可行性
实现异常记录存储的正确方式
当然可以把处理后的异常相关记录存储到独立表,但你当前的PL/pgSQL代码存在几个关键问题,我来帮你修正并说明:
原代码的问题点
- 没必要用动态SQL:这里完全不需要用
exec执行动态SQL,直接写静态INSERT语句更简洁高效,还能避免潜在的SQL注入风险(哪怕当前变量是参数,养成好习惯很重要)。 - 错误的字段取值逻辑:当
UNIQUE_VIOLATION异常触发时,之前的INSERT INTO main操作已经被回滚了,所以你从main表中查询根本拿不到当前要插入的i_name;另外select (name, ''UNIQUE_VIOLATION'')会生成一个行类型值,和error_main的两个字段结构不匹配,会直接导致插入失败。
修正后的基础版本代码
BEGIN INSERT INTO main (name, created) VALUES (i_name, CURRENT_TIMESTAMP AT TIME ZONE 'GMT'); EXCEPTION WHEN UNIQUE_VIOLATION THEN -- 直接使用触发异常的输入变量插入错误表 INSERT INTO error_main (name, error) VALUES (i_name, 'UNIQUE_VIOLATION'); END;
进阶优化:记录更完整的错误上下文
如果你需要更详细的错误信息用于后续排查,可以利用PostgreSQL内置的异常变量:
SQLERRM:返回错误的详细描述文本SQLSTATE:返回标准的SQL错误代码
示例代码:
BEGIN INSERT INTO main (name, created) VALUES (i_name, CURRENT_TIMESTAMP AT TIME ZONE 'GMT'); EXCEPTION WHEN UNIQUE_VIOLATION THEN INSERT INTO error_main (name, error, error_message, error_code, created_at) VALUES (i_name, 'UNIQUE_VIOLATION', SQLERRM, SQLSTATE, CURRENT_TIMESTAMP AT TIME ZONE 'GMT'); END;
这样你的error_main表就能完整记录异常发生时的关键信息,方便后续追溯问题。
内容的提问来源于stack exchange,提问作者pradeep panda
相关产品推荐
相关产品推荐

