
68user 的 perl+DBI プログラムのルール。初心者に教育するときはこのサンプルプログラムを渡すこと。重視すべきなのは、バグの入り込まないコーディングスタイルであることと、可読性を重視すること。速度はその後でよい。
まずはサンプルプログラム。解説は後ほど。
#!/usr/bin/perl
use strict;
use DBI;
my $dbh = DBI->connect($dsn, $user, $password,
{RaiseError => 1, PrintError => 0, AutoCommit => 0 })
|| die "$!";
eval {
&mainwork();
$dbh->commit;
$dbh->disconnect;
};
if ( $@ ){
$dbh->rollback;
$dbh->disconnect;
}
exit 0;
#--------------------------
sub mainwork {
my $sql =
"SELECT ".
" hoge, ".
" fuga ".
" FROM table1 ".
" WHERE foo = ?";
my $sth = $dbh->prepare($sql);
$sth->bind_param(1, $hogehoge);
$sth->execute;
while ( my $arr_ref = $sth->fetchrow_arrayref ){
my ($hoge, $fuga) = @arr_ref;
print "hoge=[$hoge] fuga=[$fuga]\n";
my $sql =
"UPDATE table2 SET ".
" hoge = ? ".
" WHERE fuga = ?";
my $sth = $dbh->prepare($sql);
$sth->bind_param(1, $hoge);
$sth->bind_param(2, $fuga);
my $rows = $sth->execute;
# 正常時は、ここで 1行だけ更新されるものとする。
if ( $rows != 1 ){
die "更新行数が異常! rows[$rows] sql[$sql] hoge[$hoge] fuga[$fuga]";
}
}
}
まずはサンプルプログラム。解説は後ほど。
#!/usr/bin/perl
use strict;
use DBI;
my $dbh = DBI->connect($dsn, $user, $password,
{RaiseError => 1, PrintError => 0, AutoCommit => 0 })
|| die "$!";
eval {
&mainwork();
$dbh->commit;
$dbh->disconnect;
};
if ( $@ ){
$dbh->rollback;
$dbh->disconnect;
}
exit 0;
#--------------------------
sub mainwork {
my $sql =
"SELECT ".
" hoge, ".
" fuga ".
" FROM table1 ".
" WHERE foo = ?";
my $sth = $dbh->prepare($sql);
$sth->bind_param(1, $hogehoge);
$sth->execute;
while ( my $arr_ref = $sth->fetchrow_arrayref ){
my ($hoge, $fuga) = @arr_ref;
print "hoge=[$hoge] fuga=[$fuga]\n";
my $sql =
"UPDATE table2 SET ".
" hoge = ? ".
" WHERE fuga = ?";
my $sth = $dbh->prepare($sql);
$sth->bind_param(1, $hoge);
$sth->bind_param(2, $fuga);
my $rows = $sth->execute;
# 正常時は、ここで 1行だけ更新されるものとする。
if ( $rows != 1 ){
die "更新行数が異常! rows[$rows] sql[$sql] hoge[$hoge] fuga[$fuga]";
}
}
}
スポンサーサイト


