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

Try::Tinyモジュールを使用します。これにより、より読みやすい try/catch 構文が提供され、eval の使用に伴ういくつかの潜在的な落とし穴も回避されます。

エラーを処理するには、catch ブロック (または現在のコードの 'if ($@)' ブロック) でそれを行うか、そのブロックから別のエラー処理関数を呼び出します。

于 2012-10-31T21:58:03.163 に答える