Postgres 存储函数的自定义错误代码类和编号

Mor*_*ryx 6 postgresql error-handling plpgsql

我正在 Postgres 11.5 中编写一组存储函数,并且希望RAISE EXCEPTION在不满足各种先决条件时执行此操作。例如null需要一个字符串或者带字符串的空字符串,或者超出范围的整数参数等。

我可以RAISE EXCEPTION提供详细信息、提示和消息...但是错误代码应该使用什么范围?我检查了文档,但没有在这里找到任何指导:

https://www.postgresql.org/docs/11/errcodes-appendix.html

我在 StackOverflow 上搜索,发现几年前有一个类似的问题......但没有明确的答案。

是否有一些块或前缀可以安全或常规地用于从存储的函数/过程返回的自定义错误代码?

Lau*_*lbe 6

SQL 标准为您提供了指导:

\n
\n

参数中返回的字符串值SQLSTATE包含一个 2 字符的类值,\n后跟一个 3 字符的子类值,每个子类值都具有实现定义的字符集,该字符集具有一个八位字节字符\n编码形式,并且仅限于 <digit> s 和<简单拉丁大写字母>s。表 33,\xe2\x80\x9cSQLSTATE类\n和子类值\xe2\x80\x9d,指定每个条件的类值以及每个类值的一个或多个子类值。

\n

以 <digit> '0'、'1'、'2'、'3' 或 '4' 之一或 <simple Latin upper case letter> 之一\n'A' 开头的类值,仅在 ISO/IEC 9075 或任何其他\n国际标准中定义的条件下才返回“B”、“C”、“D”、“E”、“F”、“G”或“H”。此类值的范围称为标准定义的类。一些此类代码\n保留供特定国际标准使用,如本条款其他地方所指定。与同样以这 13 个字符之一开头的类关联的子类值仅在 ISO/IEC 9075 或其他国际标准中定义的条件下返回。此类子类值的范围称为\n标准定义的子类。与以 <digit>\n​​'5'、'6'、'7'、'8' 或 '9' 之一或 <simple Latin upper case letter> 之一开头的类关联的子类值'I'、'J'、'K'、'L'、'M'、'N'、'O'、'P'、'Q'、'R'、'S'、'T'、\n “U”、“V”、“W”、“X”、“Y”或“Z”是为实现定义的条件保留的,称为实现定义的子类

\n

以 <digit> '5'、'6'、'7'、'8' 或 '9' 之一或 <simple Latin upper case letter> 之一\n'I' 开头的类值, 'J'、'K'、'L'、'M'、'N'、'O'、'P'、'Q'、'R'、'S'、'T'、'U'、'V '、'W'、'X'、'Y' 或 'Z' 是为实现定义的\n异常条件保留的,称为实现定义的类。除“000”(表示没有子类)之外的所有子类值都保留用于实现定义的条件,并被称为实现定义的子类。实现定义的完成条件应通过返回实现定义的子类以及成功完成警告无数据类之一来指示。

\n
\n

如果您的异常与 PostgreSQL 文档附录 A 中的 SQLSTATE 之一匹配,则只需使用该 SQLSTATE。

\n

如果您需要使用自己的 SQLSTATE,请使其以5to9Ito中的任意一个开头Z(但避免使用 PostgreSQL 使用的 SQLSTATE)。

\n

如果需要定义自定义警告,请使用以to或to中的任意一个开头01且第三个字符为的SQLSTATE 。59IZ

\n