[pgsql-jp: 31548] Re: オラクルストアドからの移行

Tietew tietew @ tietew.net
2003年 11月 20日 (木) 11:41:18 JST


On Wed, 19 Nov 2003 22:27:45 +0900
In article <20031119220219.1A14.AGURI @ ssl.fujitsu.com>
[[pgsql-jp: 31538] Re: オラクルストアドからの移行]
Ken-ichi Nakayama <aguri @ ssl.fujitsu.com> wrote:

無意味な全文引用は止めましょう。

> 副ブロック(階層ブロック)も存在しているようですが、
> プログラマガイドの「19.8.1. 例外」の説明が
> PL/pgSQLの構文レベルでは例外トラップをサポートしていない
> ように思えます(呼び出し元(エグゼキュータ)など上位に
> エラーは返されるというニュアンス)

RAISE EXCEPTION を実行するとその場で関数の実行が中断されてクライ
アントにエラーとして報告されますね。

> 19.11 の Oracle PL/SQLからの移行においては、
> NOTFOUND のような、IF文で後判定できるものの例がありますが、
> マニュアルの文脈からはどうも ほとんどの例外は
> 基本的にはPL/pgSQLレベルでトラップできないように
> 思えるのですが。

です。PL/pgSQL というか,PostgreSQL の言語プロシージャがそもそも
例外のトラップをサポートしていないようですし,PostgreSQL のトラ
ンザクション自体,例外からの復旧が不可能です。(一度エラーが起こ
るとトランザクションが ABORT 状態になってしまい,同じトランザク
ション内で発行できる SQL は ABORT(ROLLBACK) 以外に無くなる)

例えば INSERT で重複キー例外をトラップして UPDATE に切り替えるこ
とはできません。LOCK TABLE 〜 IN EXCLUSIVE MODE してから SELECT 〜 
FOR UPDATE でキーの存在を確認しなければなりません。PostgreSQL で
は EXCLUSIVE MODE でロックしても FOR UPDATE の付かない SELECT は
ブロックされないので,パフォーマンス的にはあまり問題ではないかと。


―[ Tietew ]――――――――――――――――――――――――――――
Mail: tietew @ tietew.net / tietew @ raug.net
Web : http://www.tietew.net/     Tietew Windows Lab.
PGP fingerprint: 26CB 71BB B595 09C4 0153  81C4 773C 963A D51B 8CAA




pgsql-jp メーリングリストの案内