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分钟之内就可以写完测完。
阅读(1105) | 评论(0) | 转发(0) |