如何报告Postgres/plpgsql中发生错误的行?

San*_*ani 5 postgresql error-handling plpgsql

我一直在postgres中使用或多或少这样的东西来模拟如何在SQL Server中使用Try/Catch块,如果发现错误,可以在Catch中回滚事务:

do $$
begin
[SQL here]

exception when others then
    raise notice 'Error in insert statement ---> % %', SQLERRM, SQLSTATE LINE;
end;    

$$ language 'plpgsql';
Run Code Online (Sandbox Code Playgroud)

有没有办法报告发生错误的行,如"ERROR_LINE()?

提前致谢

Pav*_*ule 9

在一些现代的PostgreSQL上,您可以使用GET STACKED DIAGNOSTICS语句.不可能得到亚麻,但你可以获得一个调用上下文,其中包含lineno:

postgres=> DO $$
DECLARE 
  a int DEFAULT 0;
  _c text;
BEGIN
  BEGIN
    PERFORM 10/a;
  EXCEPTION WHEN OTHERS THEN
    GET STACKED DIAGNOSTICS _c = PG_EXCEPTION_CONTEXT;
    RAISE NOTICE 'context: >>%<<', _c;
  END;
END;
$$;
NOTICE:  00000: context: >>SQL statement "SELECT 10/a"
PL/pgSQL function inline_code_block line 7 at PERFORM<<
LOCATION:  exec_stmt_raise, pl_exec.c:3041
DO
Run Code Online (Sandbox Code Playgroud)