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)
这不会编译.
它会像这样工作:
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处理程序.
| 归档时间: |
|
| 查看次数: |
4125 次 |
| 最近记录: |