[PostgreSQL] SQLエラー発生後の挙動
2009.05.31 |Category …PostgreSQL
以前、
http://heppokopg.blog.shinobi.jp/Entry/20/
にて、「SQLエラーがあった際にCommit or Rollbackしないと処理が続行できないのはJDBCドライバのせい」
と書いてしまいましたが大きな過ちでした。
JDBCに限らず普通にコマンドラインツール(psql)からのSQL実行でも同じことが起こるわけで、ドライバ依存
の問題ではないですねぇ。(というか、psqlがオートコミットモードがデフォルトなのに気づいたのが最近(汗))
Oracleではそのまま処理は継続して行えるけど、他のDB(UDB,SQLServer,mysqlとか)はどう判断するのだろうか?
とりあえず手元にある環境のSQLServer2005は中間のSQLでエラーが発生しても後続のSQLは正常に
実行されるみたいですねぇ・・・
動きとしてはどっちが正しいのだろうか?
http://heppokopg.blog.shinobi.jp/Entry/20/
にて、「SQLエラーがあった際にCommit or Rollbackしないと処理が続行できないのはJDBCドライバのせい」
と書いてしまいましたが大きな過ちでした。
JDBCに限らず普通にコマンドラインツール(psql)からのSQL実行でも同じことが起こるわけで、ドライバ依存
の問題ではないですねぇ。(というか、psqlがオートコミットモードがデフォルトなのに気づいたのが最近(汗))
Oracleではそのまま処理は継続して行えるけど、他のDB(UDB,SQLServer,mysqlとか)はどう判断するのだろうか?
とりあえず手元にある環境のSQLServer2005は中間のSQLでエラーが発生しても後続のSQLは正常に
実行されるみたいですねぇ・・・
動きとしてはどっちが正しいのだろうか?
PR
[PostgreSQL] SQLエラーコードが設定されない
2009.03.16 |Category …PostgreSQL
PostgreSQLのJDBCドライバはSQLExceptionがthrowされた際にSQLエラーコードを設定してくれないらしい。
そもそもSQLの実行結果に結果コードを返すようになったのが7系からで今はDBとしてはエラーコードを返す
もののSQLException発生時にそのエラーコードを設定してくれれば良いのにね。
一応Messageにエラーメッセージそのものは設定されるのでエラーメッセージの内容を拾って処理を切り分けて
あげるしか方法が無いかも。
つーかドライバやDBのバージョンによってメッセージは変わるものなんじゃないか?OSとか言語でも。
とりあえずSQLException(正確にはPSQLException)が発生した場合にPSQLExceptionを継承した例外クラス
のインスタンスを作って再throwさせてそのサブクラスの中でエラー判定をしようかと思うが、Exceptionの中で
リソースを読んで、エラーを切り分けて、とかする事になりそう・・・
あんま実装したくないなぁ・・・
そもそもSQLの実行結果に結果コードを返すようになったのが7系からで今はDBとしてはエラーコードを返す
もののSQLException発生時にそのエラーコードを設定してくれれば良いのにね。
一応Messageにエラーメッセージそのものは設定されるのでエラーメッセージの内容を拾って処理を切り分けて
あげるしか方法が無いかも。
つーかドライバやDBのバージョンによってメッセージは変わるものなんじゃないか?OSとか言語でも。
とりあえずSQLException(正確にはPSQLException)が発生した場合にPSQLExceptionを継承した例外クラス
のインスタンスを作って再throwさせてそのサブクラスの中でエラー判定をしようかと思うが、Exceptionの中で
リソースを読んで、エラーを切り分けて、とかする事になりそう・・・
あんま実装したくないなぁ・・・
[PostgreSQL] ERROR: current transaction is aborted, commands ignored until end of transaction blockって言われた
2009.03.12 |Category …PostgreSQL
今回も挙動の違いなのですが、PostgreSQLのJDBCドライバって一度SQLExceptionがthrowされるとcommit/rollbackしないと後続処理ができないのね。
ちなみに上記Javaコードは適当に雰囲気で書いただけなので間違ってても気にしないでください。
try{ Connection connection = getConnection(); Statement statement = connection.createStatement(); // キー重複エラー statement.executeQuery("INSERT INTO HAGE (KEY) VALUES (1)"); }catch(SQLException e){ // リカバリ実行 statement.executeQuery("DELETE FROM HAGE WHERE KEY = 1"); // ↑この行でエラー }リカバリ実行をする前にrollback、commitをしてあげれば更にSQLExceptionがthrowされる事はなくなるようですが…今まで例外が発生したらcatch節の中で更に処理を…っての結構やってきてたけど本来それは推奨されない処理なんじゃないかと思えてきた。
ちなみに上記Javaコードは適当に雰囲気で書いただけなので間違ってても気にしないでください。
[PostgreSQL] 表の切り捨て
2009.03.12 |Category …PostgreSQL
PostgreSQLってTRUNCATE TABLE してもROLLBACK出来てしまうのね…
Oracleはロールバック不能だった気がする…
DELETE FROMとの違いはなんだろう?CASCADEオプションを指定できるかどうかかなぁ。
ロールバックできるとなるとパフォーマンスは大差なさそうだが…
今度調べてみるかぁ。
[PostgreSQL] 階層問い合わせ
2009.03.03 |Category …PostgreSQL
PostgreSQLの階層問い合わせ(CONNECT BY)って標準だと使えないのね…
貢献モジュール入れないとだめかぁ。
データモデル的に階層構造が部分的に存在するので使いたいのだが今回は断念。
貢献モジュール入れないとだめかぁ。
データモデル的に階層構造が部分的に存在するので使いたいのだが今回は断念。