温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

如何实现PostgreSQL函数自定义例外处理

发布时间:2021-06-12 17:04:21 来源:亿速云 阅读:319 作者:小新 栏目:大数据

这篇文章主要为大家展示了“如何实现PostgreSQL函数自定义例外处理”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何实现PostgreSQL函数自定义例外处理”这篇文章吧。

代码搬运也需要发挥想象力,让不可能变为可能,这里讲一个例子。

1、 有人问PostgreSQL有没有自定义例外,Oracle是有的:

--定义
myex Exception;
--抛出
RAISE myex;
--捕获
WHEN myex THEN

简单易用

2、再来看PostgreSQL的PL/pgSQL

RAISE [ level ] condition_name [ USING option = expression [, ... ] ];
RAISE [ level ] SQLSTATE 'sqlstate' [ USING option = expression [, ... ] ];

这两种语法似乎有一定的灵活性,实际上它们只能使用预定义的例外,文档中有说明,如果不能识别会报错。

ERROR:  unrecognized exception condition "xxxxxxx"
CONTEXT:  compilation of PL/pgSQL function "func_a" near line 3

ERROR:  invalid SQLSTATE code at or near "'12345'"
LINE 5: RAISE SQLSTATE '12345' USING MESSAGE = 'zzz';

3、代码实现

这段是强行加戏,防止篇幅过小的一个例外处理,完全可以跳过而不会有任何影响。

	for (i = 0; exception_label_map[i].label != NULL; i++)
	{
		if (strcmp(condname, exception_label_map[i].label) == 0)
			return exception_label_map[i].sqlerrstate;
	}

这里可以看出,能使用的名字或编码在编译时已经确定,不能自己定义。

4、但是,我们仍有办法可以做到

尽量选择一个上下文无关的错误,也就是这段代码不可能会抛出的例外,避免程序出错被错误拦截。

比如:0A000 feature_not_supported

我们可以抛出一个例外,用错误信息标记它的特殊性:

RAISE SQLSTATE '0A000' USING MESSAGE = 'flying0001:failed to ...';

在捕获它时可以按条件处理:

WHEN SQLSTATE '0A000' THEN
  DECLARE
    m text;
  BEGIN
    GET STACKED DIAGNOSTICS m = MESSAGE_TEXT;
    IF ( strpos(m, 'flying0001:')=1) THEN
      RAISE WARNING 'got flying0001';
    ELSIF
      ...
    END IF;
  END;

虽然啰嗦,但确实是实现了同样的功能。

5、完整演示

也是加戏,凑篇幅用。

CREATE OR REPLACE FUNCTION func_a()
RETURNS void AS
$$
BEGIN
RAISE SQLSTATE '0A000' USING MESSAGE = 'flying0001:Do one thing at a time, and do well.';
EXCEPTION
WHEN feature_not_supported THEN
  DECLARE
    m text;
  BEGIN
    GET STACKED DIAGNOSTICS m = MESSAGE_TEXT;
    IF (strpos(m, 'flying0001:')=1) THEN
      RAISE WARNING 'got flying0001';
    END IF;
  END;
END;
$$
LANGUAGE plpgsql;

以上是“如何实现PostgreSQL函数自定义例外处理”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI