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 $@
}
}
私の問題は、説明的なエラー (どこで/なぜ) をどのように生成し、それをチェーンに戻し、ユーザーが理解できる言語にするべきかわからないことです。繰り返しますが、どのようにエラーを発生させ、エラー ハンドラー関数に渡す必要がありますか? 標準は何ですか?他の人はどのようにこれを達成しますか?
また、このようにハッシュをループして値を挿入/更新しているときに発生する可能性のある問題はありますか?