無精で短気で傲慢なプログラマ

UNIX や web やプログラムの技術的なことを中心に。

perl+DBI プログラムの鉄則

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]";
    }
  }
}
スポンサーサイト

PageTop

コメント


管理者にだけ表示を許可する
 

参考にさせていただきました

参考にさせていただきまして、無事に動くスクリプトが書けました。ありがとうございます。

勘違いだった申し訳ないのですが、

my ($hoge, $fuga) = @arr_ref;
の部分は
my ($hoge, $fuga) = @$arr_ref;
ではないでしょうか?
エラーが出ましたところ そうするといけましたので・・・

ビンゴ中西 | URL | 2007-02-25(Sun)02:32 [編集]


トラックバック

トラックバック URL
この記事にトラックバックする(FC2ブログユーザー)

初めてMySQLとPerlの連帯でプログラムが書けました(後編)

<<前編へはじめに作って、実行はされるがうんともすんとも言わなかったスクリプトから掲載。##########################################################!/usr/bin/perl -wuse strict;use DBI;

ビンゴ中西のほげほげ 2007-02-25 (Sun) 02:34