0

我正在尝试找到一种将错误消息从 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 $@ 
     }
}

我的问题是,我不确定我应该如何生成描述性错误(在哪里/为什么),将其返回到链上并以用户可以理解的语言返回。同样,我应该如何引发错误,并且应该将它传递给错误处理函数?标准是什么?其他人如何做到这一点?

此外,在循环遍历我的哈希和插入/更新这样的值时,我可能会遇到问题吗?

4

1 回答 1

1

Use the Try::Tiny module. It gives you the more readable try/catch syntax, and also avoids a couple of potential gotchas involved with using eval.

To handle the error, either do that in the catch block (or the 'if ($@)' block in your current code), or call a separate error handling function from that block.

于 2012-10-31T21:58:03.163 回答