Chinaunix首页 | 论坛 | 博客
  • 博客访问: 196304
  • 博文数量: 21
  • 博客积分: 1410
  • 博客等级: 上尉
  • 技术积分: 657
  • 用 户 组: 普通用户
  • 注册时间: 2006-05-05 19:07
文章分类
文章存档

2009年(6)

2008年(15)

我的朋友

分类:

2008-12-11 16:49:59

XXXX项目perl使用经验之一  一个例子带你走进perl的世界
ocs系统的很多应用都是基于TimesTen的,因此会有很多TimesTen的操作,并且要求运维人员快速准确的完成。
目前我们已经遭遇到一些这样的需求。如割接转换程序,月结程序,月结账本插入程序,割接临时日租程序等。
其特点是quick and dirty。完全可以用perl来实现,大幅提高开发效率,并且便于维护。
下面用一个月结账本插入的例子说明perl的强大
01  #!/usr/bin/perl
02  use warnings;
03  use DBI;
04  main:
05  {
06   my ($batch_count,$spliter,$ins_sql);
07   my ($starttime,$endtime);
08   $batch_count = 10;
09   $spliter = ',';
10   $ins_sql = "insert into cumulate_acct values (seq_cumulate_acct_id.nextval,?,?,?,?,?,?,?,?);";
11   $infile = "insert.dat";
12   $errfile = "insert.err";
13 
14   my %db_attr = (
15    "RaiseError" => 1,
16    "PrintError" => 1,
17    "AutoCommit" => 0,
18    );
19   my $db;
20   $db = DBI->connect('DBI:TimesTen:DSN=ESCP_CACHE',undef,undef,\%db_attr) or die "Connect to TT error!\n";
21 
22   my $st = $db->prepare($ins_sql);
23 
24   open IN_DATA,$infile or die "open error!";
25   open ERR_DATA,">$errfile" or die "open $errfile error";
26   my $count = 1;
27   $starttime = time();
28   while ()
29   {
30    eval
31    {
32     my @colnums = split(/$spliter/,$_);
33      
34     for (my $i=0;$i<@colnums;$i++)
35     {
36      $st->bind_param($i+1,$colnums[$i]);
37     }
38     $st->execute();
39     if ( $count%$batch_count == 0)
40     {
41      #print $batch_count," records inserted!\n";
42      $db->commit();
43     }
44    };
45    if ($@)
46    {
47     print "insert error!:$_";
48     print ERR_DATA $_;
49    }
50    $count++;
51   }
52   $db->commit();
53   $endtime = time();
54   print "duration is ",$endtime - $starttime,"\n";
55  }
 

代码解释:
1.指定使用perl进行解释
2.表示要输出warning信息
3.表示要使用DBI模块(用户访问数据库),不需要用use语句指定具体的数据库驱动名,DBI会在连接的使用动态的调用相应的数据库驱动
4.定义一个叫main的块标号,这在perl里面是不需要的,目的仅仅是让程序看上去比较像C程序
6-7.声明一些私有变量。my用来声明程序块自身的私有变量,其实这一步也非必要,perl在使用变量之前不需要定义。
8.初始化插入数据库每次提交记录数。我发现对TT来说每100条记录提交一次速度最快。
9.初始化输入记录的分隔符
10.初始化insert语句。
11-12.初始化要插入的数据文件(输入)和插入失败时错误记录存放的文件(输出)
14-18.初始化DBI的一些属性(RaiseError:DBI出错是否抛出异常;PrintError:是否打印错误信息;AutoCommit:是否自动提交)
19-20.连接TT。
22.prepare语句
23-24.打开文件句柄
28.循环读取输入文件,没有指定要读到哪个变量里面,因此会读到默认的$_变量里面
30.eval用来捕获程序块中的异常,如果有异常则错误信息会写到$@变量里面
32.分解读到的记录
34-37.绑定变量
38.执行insert语句
39-43.提交
45-49.插入失败则报错并写错误文件
52.最后一次提交
54.打印耗时信息
最后说明一下:
1.输入文件是用分隔符隔开的字段记录,将记录插入到cumulate_acct表里面,如果没有插入成功则将出错的记录写到一个错误文件中。
2.由于perl是脚本类语言,对于临时性的工作没有必要使用配置文件,可以直接在程序中写变量。
3.总共50多行代码(如果不考虑美观也可以用更少的代码实现),有经验的程序员30分钟之内就可以写完测完。

 
阅读(1068) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~