Database 我可以在PostgreSQL中的异常中参数化SQLSTATE吗

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

我倾向于使用默认异常处理程序编写PostgreSQL函数,将函数名添加到抛出的异常中,然后再次抛出

例如:

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。谢谢,这是我一直在寻找的,工作正常。