您能否提供在 PostgreSQL 函数中使用用户定义异常的语法?
假设我想处理以下用户定义的异常。
SQL Error [22023]: ERROR: password is too short.
有多个 SQLSTATE 错误代码,但无法找到此错误的 SQLSTATE 代码。我在上面使用的是 22023 但没有解决。
我们有以下代码,我们能够管理唯一的违规相关异常,但无法管理“密码太短”。你能帮我语法吗?
代码:
begin
EXECUTE 'ALTER USER ' || $1 || ' WITH PASSWORD '''|| $2||'''' ;
EXCEPTION WHEN "Password is too short"
THEN RAISE DETAIL 'Please check your password';
INSERT INTO pwdhistory (usename,password,changed_on) values($1,md5($2),now());
EXCEPTION WHEN unique_violation
THEN RAISE DETAIL 'Password already used earlier. Please try again with another password.';
end;
捕获和引发错误
要捕获错误,请在 PL/pgSQL 代码中仅使用一个子句。
EXCEPTION
它可以有多个WHEN
子句。(但你似乎只需要一个。见下文。)您可以像使用条件名称一样使用错误代码。错误代码列表可以在手册中找到。
还要考虑关于PL/pgSQL 中的Trapping Errors的 Postgres手册页:
因此,您可以捕获错误并(重新)使用不同的或附加的详细信息提出它们。
提出自己的错误是另一回事。
只需
RAISE
与所有需要的细节一起使用。不需要先捕获错误。SQL注入
与您的核心问题无关,您显示的代码对 SQL 注入是开放的。
不要使用这个。
调用你的函数会很有趣:
(或更糟。)繁荣。看:
正确处理用户输入。看:
功能
您的函数可能如下所示(假设当前的 Postgres 13):
db<>在这里摆弄
注意使用
format()
正确引用名称和值,并防止 SQL 注入。称呼:
产生:
产生: