我可以在PostgreSQL中的异常中使用参数化SQLSTATE

Raq*_*qua 4 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
        || '/' || sqlerrm;
END;
Run Code Online (Sandbox Code Playgroud)

在这种情况下,SQLSTATE 77777不会进一步传播,稍后我捕获的异常具有默认的SQLSTATE P0001.

也可以将SQLSTATE添加到异常处理程序引发,但这似乎仅限于硬编码字符串.我想得到的是这样的:

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;
Run Code Online (Sandbox Code Playgroud)

这不会编译.

Erw*_*ter 6

它会像这样工作:

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;
Run Code Online (Sandbox Code Playgroud)

SQLSTATEin 的值RAISE EXCEPTION SQLSTATE '12345'不能是变量,但必须是文字.手册对此并不十分清楚.

USING改为在子句中提供错误代码.

注意对于普通读者:在特殊变量 sqlstate,并sqlerrm仅在可见的EXCEPTION处理程序.