2010年12月12日

DBI - DBD::PgPPを使用してPostgreSQLへアクセスする(Windows)つづき1

昨日の続きですが、トランザクション制御方法のメモです。
Perlでも、eavl〜if($@)を使用して、気持ちTry〜catch的なことができるのですね。

use DBI;
use Encode;

# データベース接続情報を設定
$dbname = "maomao_db";
$host = "localhost";
$user = "maomao";
$password = "maomao";

# データベースへの接続。ここで、PgPP という名前の DBD を指定しています。
$conn = DBI->connect("dbi:PgPP:dbname=$dbname;host=$host", $user, $password) or die;

#オートコミットをオフにします。
$conn->{AutoCommit} = 0;
#エラーメッセージの自動表示を抑止します。
$conn->{PrintError} = 0;

$sql = "INSERT INTO department(id, name) VALUES (?, ?);";

# SQL の発行
$sth = $conn->prepare($sql);

#トランザクション制御のためevalでdieをトラップします。
eval {
#RaiseErrorに"1"を設定することで、エラー発生時に自動的にdieするようになります。
#→自動的に実行されるdieは次の通り die("$class $method failed $DBI::errstr")
$sth->{RaiseError} = 1;
$sth->execute(7, "BBB");
$sth->execute(8, "AAA");
};

if ($@) {
#・rollbackをすると、"$@"の内容がクリアされてしまうので、順番に注意
#・DBのエンコーディングはUTF8のため(?)、エラーメッセージはUTF8になります。
# ここでは、DOSプロンプトで実行しているためShift-JISに変換しています。
warn "Transaction aborted because". encode('shift-jis', decode('utf-8', $@ ."\n"));
$conn->rollback;
} else {
print "SUCCESS: insert.\n";
$conn->commit;
}

$sth->finish;
$conn->disconnect;


こちらにも書いています(Perlあれこれ)。
posted by 台北猫々 at 22:19| Comment(0) | TrackBack(0) | 技術メモ(Perl)
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/42067263

この記事へのトラックバック