如何报告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
如您所见:pg_exception_context
将报告该行已发生。
在 PostgreSQL 版本上测试:14
我一直在 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
如您所见:pg_exception_context
将报告该行已发生。
在 PostgreSQL 版本上测试:14