在PostgreSQL中的异常中,我能否使用参数化的SQLSTATE?

4

我倾向于以一种方式编写我的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 不会进一步传播,我稍后捕获的异常具有默认 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;

这段代码无法编译。


1
始终提供完整的函数定义,包括头文件。即使它很简单,这也使测试更容易。当然还要提供您的Postgres版本。 - Erwin Brandstetter
1
如果您可以使用9.3版本,则可以使用其他异常字段 http://www.postgresql.org/docs/9.3/static/plpgsql-control-structures.html#PLPGSQL-ERROR-TRAPPING,因此您无需玷污消息字段。 - Pavel Stehule
@PavelStehule - 对我的用例来说这没有什么用,因为我需要在Java中获取Postgres之外的sqlstate。 - Raqua
1个回答

7
它的工作原理如下:
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;

RAISE EXCEPTION SQLSTATE '12345'SQLSTATE的值不能是变量,而必须是字面值。手册对此并不是很清楚。

请在USING子句中提供错误代码。

注意:特殊变量sqlstatesqlerrm仅在EXCEPTION处理程序中可见。


谢谢,这就是我想要的,按预期工作。 - Raqua

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接