我正在尝试找到一种将错误消息从 postgresql 返回到我的客户端应用程序的好方法。我读过关于 RAISE 的文章,这似乎是我想要的,但我有几个问题。使用 Postgresql 9.1。
对正在发生的事情的概述,我从客户端接收一个 JSON 对象,将 JSON 解析为 Perl 哈希,遍历键并在每次迭代时执行更新/插入。哈希键与我的数据库表名相关。
我有 3 个这样的 sql 函数(同名)。一个接受文本、带时区的时间戳和一个整数。(来自https://stackoverflow.com/a/6527838/722238的查询)
-- $1 = Table Key, $2 = Table Value, $3 = Table Name.
create function ex.foo(integer,text,text) Arg2 could be timestamp,text,or integer.
returns void as $$
begin
execute format('update %3$s set v= %2$L where k = %1$L;
insert into %3$s (k,v) select %1$s, %2$L
where not exists (select 1 from %3$s where k = %1$L)', $1,$2,$3);
-- RAISE a descriptive error.
return;
end;
$$ language 'plpgsql';
目前,我正在这样做(伪代码):
if (Begin) {
eval {
my $tk = 123;
foreach my $k (keys %js) {
## tk = table key, $k = table name, $js{$k} = value
executeq("select ex.foo(tk,$js{$k},$k);") or die error(pgError); # Function to handle error?
}
Commit;
};
if ($@) {
RollBack;
## Return $@
}
}
我的问题是,我不确定我应该如何生成描述性错误(在哪里/为什么),将其返回到链上并以用户可以理解的语言返回。同样,我应该如何引发错误,并且应该将它传递给错误处理函数?标准是什么?其他人如何做到这一点?
此外,在循环遍历我的哈希和插入/更新这样的值时,我可能会遇到问题吗?