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

How does one report the line on which an error occured in Postgres/plpgsql?

我一直在 postgres 中使用或多或少类似的东西来模拟如何在 SQL 服务器中使用 Try/Catch 块和可以在 Catch 中回滚的事务发现错误:

do $$
begin
[SQL here]

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

$$ language 'plpgsql';

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

提前致谢

在某些现代 PostgreSQL 上,您可以使用 GET STACKED DIAGNOSTICS 语句。无法获取 linenumber,但您可以获得调用上下文,其中包含 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
DO $$
DECLARE 
a int DEFAULT 0;
      m_sqlstate text;
      m_message text;
      m_context text;
      m_PG_EXCEPTION_HINT text;
BEGIN
      PERFORM 10/a;
      EXCEPTION WHEN OTHERS THEN
GET STACKED DIAGNOSTICS
      m_sqlstate = returned_sqlstate,
      m_message = message_text,
      m_context = pg_exception_context,
      m_PG_EXCEPTION_HINT = PG_EXCEPTION_HINT;
         RAISE NOTICE 'sqlstate: %', m_sqlstate; --show for error code .
         RAISE NOTICE 'message: %', m_message;
         RAISE NOTICE 'context: %', m_context;
         RAISE NOTICE 'The exception detail: %', m_PG_EXCEPTION_HINT;
END
$$;

结果:

NOTICE:  sqlstate: 22012
NOTICE:  message: division by zero
NOTICE:  context: SQL statement "SELECT 10/a"
PL/pgSQL function inline_code_block line 9 at PERFORM
NOTICE:  The exception detail:
DO
  • 获取诊断堆栈的手册reference。特别检查 Table 43.2。错误诊断项目
  • PostgreSQL 错误代码在手册中appendix,这并不容易 找到。

如您所见:pg_exception_context 将报告该行已发生。 在 PostgreSQL 版本上测试:14