插入/更新后将错误返回给用户

时间:2012-10-31 21:34:04

标签: sql perl postgresql

我正在尝试找到一种将错误消息从postgresql返回到我的客户端应用程序的好方法。我读过RAISE,这似乎是我想要的,但我有几个问题。使用Postgresql 9.1。

概述正在发生的事情,我从客户端收到一个JSON对象,将JSON解析为Perl Hash,循环遍历键并在每次迭代时执行更新/插入。哈希键与我的数据库表名相关联。

我有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 $@ 
     }
}

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

此外,在循环浏览哈希并插入/更新这样的值时,是否会遇到问题?

1 个答案:

答案 0 :(得分:1)

使用Try::Tiny模块。它为您提供了更易读的try / catch语法,并避免了使用eval时可能遇到的一些问题。

要处理错误,请在catch块(或当前代码中的“if($ @)”块)中执行此操作,或者从该块中调用单独的错误处理函数。