Database 我可以在PostgreSQL中的异常中参数化SQLSTATE吗
我倾向于使用默认异常处理程序编写PostgreSQL函数,将函数名添加到抛出的异常中,然后再次抛出 例如:Database 我可以在PostgreSQL中的异常中参数化SQLSTATE吗,database,postgresql,exception-handling,plpgsql,Database,Postgresql,Exception Handling,Plpgsql,我倾向于使用默认异常处理程序编写PostgreSQL函数,将函数名添加到抛出的异常中,然后再次抛出 例如: BEGIN RAISE exception SQLSTATE '77777' using message = 'Test exception'; EXCEPTION WHEN others THEN raise exception using message = 'error_handling_test: ' || sqlstate
BEGIN
RAISE exception SQLSTATE '77777' using message = 'Test exception';
EXCEPTION
WHEN others THEN
raise exception
using message = 'error_handling_test: ' || sqlstate
|| '/' || sqlerrm;
END;
在这种情况下,SQLSTATE 77777不会进一步传播,异常I catch later具有默认SQLSTATE P0001
也可以将SQLSTATE添加到异常处理程序raise,但这似乎仅限于硬编码字符串。我想得到的是这样的东西:
DECLARE
err_code varchar;
BEGIN
RAISE exception SQLSTATE '77777' using message = 'Test exception';
EXCEPTION
WHEN others THEN
err_code:=sqlstate;
raise exception sqlstate err_code
using message = 'error_handling_test: ' || sqlstate
|| '/' || sqlerrm;
END;
CREATE OR REPLACE FUNCTION f_err()
RETURNS void AS
$func$
BEGIN
RAISE exception SQLSTATE '77777' using message = 'Test exception';
EXCEPTION
WHEN others THEN
RAISE EXCEPTION
USING ERRCODE = sqlstate
,MESSAGE = 'error_handling_test: ' || sqlstate || '/' || sqlerrm;
END
$func$ LANGUAGE plpgsql;
这将无法编译。它的工作原理如下:
DECLARE
err_code varchar;
BEGIN
RAISE exception SQLSTATE '77777' using message = 'Test exception';
EXCEPTION
WHEN others THEN
err_code:=sqlstate;
raise exception sqlstate err_code
using message = 'error_handling_test: ' || sqlstate
|| '/' || sqlerrm;
END;
CREATE OR REPLACE FUNCTION f_err()
RETURNS void AS
$func$
BEGIN
RAISE exception SQLSTATE '77777' using message = 'Test exception';
EXCEPTION
WHEN others THEN
RAISE EXCEPTION
USING ERRCODE = sqlstate
,MESSAGE = 'error_handling_test: ' || sqlstate || '/' || sqlerrm;
END
$func$ LANGUAGE plpgsql;
raiseexception SQLSTATE'12345'
中的SQLSTATE
的值不能是变量,但必须是文本。他对此并不十分清楚
改为使用子句在中提供错误代码
对于普通读者注意:sqlstate
和sqlerrm
仅在EXCEPTION
处理程序中可见。始终提供完整的函数定义,包括标题。即使它很琐碎,也会使测试更容易。当然还有你的Postgres版本。如果你可以使用9.3,那么你可以使用一个额外的异常字段,这样你就不需要破坏消息字段。@PavelStehule-这对我的用例没有用,因为我需要Postgres之外的SQL状态,Java。谢谢,这是我一直在寻找的,工作正常。