perl DBI 学习总结

perl DBI 学习总结mysql

 

DBI和DBD的不一样关系模型:sql

DBI&DBD
##########################################################################
可移植的DBI方法:
connect    创建到一个数据库服务器的链接
disconnect   断开数据库服务器的链接
prepare    准备执行一个SQL语句
execute    执行准备好的语句
do    准备并执行一个SQL语句
quote    加引号于要插入的字符串或BLOB值
fetchrow_array   做为一个字段数组取出下一行
fetchrow_arrayref  做为一个字段的引用数组取出下一行
fetchrow_hashref  做为一个哈希表的引用取出下一行
fetchall_arrayref  做为一个字段数组取出全部数据
finish    完成一条语句而且让系统释放资源
rows    返回受影响的行数
data_sources   返回可在localhost上获得的数据库的数组
ChopBlanks   控制fetchrow_*方法是否剥去空格
NUM_OF_PARAMS   在准备的语句中的占位(placeholder-参数)的数目
NULLABLE   其列能够是NULL
trace    执行调试跟踪
##########################################################################
$dbh 数据库句柄
$sth 语句句柄
$rc 返回代码(常常是一个状态)
$rv 返回值(常常是一个行数)
##########################################################################
①connect($data_source, $username, $password)
使用connect方法使得一个数据库链接到数据源。$data_source值应该以DBI:driver_name:开始。以DBD::mysql驱动程序使用connect的例子:
  $dbh = DBI->connect("DBI:mysql:$database", $user, $password);
  $dbh = DBI->connect("DBI:mysql:$database:$hostname",
                      $user, $password);
  $dbh = DBI->connect("DBI:mysql:$database:$hostname:$port",
                      $user, $password);数据库

②disconnect
disconnect方法从数据库断开数据库句柄。它通常就在你从程序退出以前被调用。范例:
  $rc = $dbh->disconnect;
    prepare($statement)
准备一条由数据库引擎执行的SQL语句而且返回语句句柄($sth),你可使用它调用execute方法。通常地你借助于prepare和execute来处理SELECT语句(和类SELECT语句,例如SHOW、DESCRIBE和EXPLAIN)。范例:
  $sth = $dbh->prepare($statement)
      or die "Can't prepare $statement: $dbh->errstr/n";
③execute
execute方法执行一个准备好的语句。对非SELECT语句,execute返回受影响的行数。若是没有行受影响,execute返回"0E0",Perl将它视做零而不是真。对于SELECT语句,execute只是在数据库中启动SQL查询;你须要使用在下面描述的fetch_*方法之一检索数据。范例:
  $rv = $sth->execute
            or die "can't execute the query: $sth->errstr;
④do($statement)
do方法准备而且执行一条SQL语句而且返回受影响的行数。若是没有行受到影响,do返回"0E0",Perl将它视为零而不是真。这个方法一般用于事先没法准备好(因为驱动程序的限制)或不须要执行屡次(插入、删除等等)的非SELECT语句。范例:
  $rv = $dbh->do($statement)
          or die "Can't execute $statement: $dbh- >errstr/n";
⑤quote($string)
quote方法被用来“转义”包含在string中的任何特殊字符并增长所需的外部的引号。范例:
  $sql = $dbh->quote($string)
⑥fetchrow_array
这个方法取下一行数据而且做为一个字段值数组返回它。范例:
  while(@row = $sth->fetchrow_array) {
          print qw($row[0]/t$row[1]/t$row[2]/n);
  }
⑦fetchrow_arrayref
这个方法取下一行数据而且做为一个对一个字段值数组的引用返回它。范例:
  while($row_ref = $sth->fetchrow_arrayref) {
          print qw($row_ref->[0]/t$row_ref->[1]/t$row_ref->[2]/n);
  }
⑧fetchrow_hashref
这个方法取一行数据而且返回包含字段名/值对的一个哈希表的一个引用。这个方法不如使用上述数组引用那样有效。范例:
  while($hash_ref = $sth->fetchrow_hashref) {
          print qw($hash_ref->{firstname}/t$hash_ref->{lastname}/t/
                  $hash_ref- > title}/n);
  }
⑨fetchall_arrayref
这个方法被用来得到从SQL语句被返回的全部数据(行)。它返回一个数组的引用,该数组包含对每行的数组的引用。你用一个嵌套循环来存取或打印数据。范例:
  my $table = $sth->fetchall_arrayref
                  or die "$sth->errstr/n";
  my($i, $j);
  for $i ( 0 .. $#{$table} ) {
          for $j ( 0 .. $#{$table->[$i]} ) {
                  print "$table->[$i][$j]/t";
          }
          print "/n";
  }
⑩finish
便名没有更多的数据将从这个语句句柄取出。你调用这个方法释放语句句柄和任何与它相关的系统资源。范例:
  $rc = $sth->finish;
⑪rows
返回由最后一条命令改变(更新、删除等)的行数。这一般用在非SELECT的execute语句以后。范例:
  $rv = $sth->rows;
⑫NULLABLE
返回一个对一个布尔值数组的引用;对数组的每一个成员,一个TRUE值表示该列能够包含NULL值。范例:
  $null_possible = $sth->{NULLABLE};
⑬NUM_OF_FIELDS
这个属性代表由一条SELECT或SHOW FIELDS语句返回的字段数目。你能够用它检查一条语句是否返回告终果:一个零值代表一个象INSERT、DELETE或UPDATE的非SELECT语句。范例:
  $nr_of_fields = $sth->{NUM_OF_FIELDS};
⑭data_sources($driver_name)
这个方法返回一个数组,它包含在主机'localhost'上的MySQL服务器可获得的数据库名。范例:
  @dbs = DBI->data_sources("mysql");
⑮ChopBlanks
这个属性肯定fetchrow_*方法是否将去掉返回值的头和尾的空白。范例:
  $sth->{'ChopBlanks'} =1;
trace($trace_level)
 
⑯trace($trace_level, $trace_filename)
trace方法开启或关闭跟踪。看成为一个DBI类方法调用时,它影响对全部句柄的跟踪。看成为一个数据库或语句句柄方法调用时,它影响对给定句柄的跟踪(和句柄的将来子孙)。设置$trace_level为2以提供详细的踪影信息,设置$trace_level为0以关闭跟踪。踪影输出缺省地输出到标准错误输出。若是指定$trace_filename,文件以添加模式打开而且全部跟踪的句柄的手被写入该文件。范例:
  DBI->trace(2);                # trace everything
  DBI->trace(2,"/tmp/dbi.out"); # trace everything to /tmp/dbi.out
  $dth->trace(2);               # trace this database handle
  $sth->trace(2);               # trace this statement handle
你也能够经过设置DBI_TRACE环境变量开启DBI跟踪。将它设置为等价于调用DBI->(value)的数字值,将它设置为等价于调用DBI->(2,value)的路径名。
##########################################################################数组

##########################################################################服务器

 

链接Informix数据库取数据:------学习

#!/usr/bin/perlfetch

use DBI;
use DBD::Informix;
this

 

my @field;
my @sql_list;
my @cmd_list;
my $time_stamp;
my $time_stamp2;
my $w_file;
my $count=0;
spa

 

my $vendor=shift;
my $db_type=shift;
my $db_server=shift;
my $user_name=shift;
my $password=shift;
my $omc_name=shift;
my $src_dir=shift;
my $desc_dir=shift;
my $cmd_list=shift;
my $sql_list=shift;
调试

 

 

#获取当前时间并打开写文件
my ($sec,$min,$hour,$mday,$mon,$year)=(localtime)[0,1,2,3,4,5];
$year=$year + 1900;
$mon=$mon+1;
$mon=sprintf("%02d",$mon);
$mday=sprintf("%02d",$mday);
$hour=sprintf("%02d",$hour);
$min=sprintf("%02d",$min);
$sec=sprintf("%02d",$sec);
$time_stamp=$year.$mon.$mday.$hour.$min.$sec;
$time_stamp2=$year."-".$mon."-".$mday." ".$hour.":".$min.":".$sec;

 

#链接数据库
print "开始链接$db_type数据库[DataBaseServer:$db_server].../n";
my $dbh = DBI->connect("dbi:$db_type:$db_server","$user_name","$password",{PrintError => 0});
if($dbh){
 print "链接$db_type数据库成功[DataBaseServer:$db_server].../n";
}else{
 print "链接$db_type数据库失败[DataBaseServer:$db_server].../n";
 exit(1);
}

 

for($i=0;$i<@sql_list;$i++){
 #组合文件名并打开写文件
 $vendor=uc($vendor);
 $omc_name=uc($omc_name);
 $cmd_list[$i]=lc($cmd_list[$i]);
 $file_name="MSS#$vendor#$omc_name#$cmd_list[$i]#$time_stamp#100#";
 open(WFILE,">$src_dir/$file_name") || die "打开文件失败!/n";

 #执行SELECT语句并获取数据
 $sql_list[$i]=~s//n//n /g;
 print "执行SQL语句:/n[$sql_list[$i]]/n";
 my $sth = $dbh->prepare(qq{$sql_list[$i]});
 $sth->execute();
 print "执行SQL语句成功.../n";

 #读取记录数据
 while(@field=$sth->fetchrow_array){
   write_file(WFILE,($omc_name));
  write_file(WFILE,(@field));
  write_file(WFILE,($time_stamp2));
  print WFILE "/n";
  $count++;
 }
 close(WFILE);

 if($count eq 0){
  print "没有获取到记录.../n/n";
  system("rm -f $src_dir/$file_name");
 }else{
  $file_name_src=$file_name."0.src";
  print "成功获取$count条记录.../n";
  print "生成文件[$file_name_src].../n/n";
  system("mv -f $src_dir/$file_name $desc_dir/$file_name_src");
 }
 $count=0;
 $sth->finish();
}

#关闭数据库链接
$dbh->disconnect();
print "关闭$db_type数据库链接[DataBaseServer:$db_server].../n";

 

sub trim
{
 my ($line)=@_;
 $line=~s/^[ /t]+//;  #替换掉开头空格
 $line=~s/[ /t/r/n]+$//;#替换掉结尾空格
 return $line;
}

 

sub  write_file
{
 my $i=0;
 my ($W_FILE,@row_data)=@_;
 my $col_num=@row_data; for($i=0;$i<$col_num;$i++) {  $row_data[$i]=trim($row_data[$i]);  print $W_FILE $row_data[$i]."|"; }}