Perl DBI 總結

來源:互聯網
上載者:User

標籤:

源文地址:http://blog.csdn.net/like_zhz/article/details/5441946

 

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/perl

use DBI;
use DBD::Informix;

 

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

 

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)[email protected]_;
 $line=~s/^[ /t]+//;  #替換掉開頭空格
 $line=~s/[ /t/r/n]+$//;#替換掉結尾空格
 return $line;
}

 

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

Perl DBI 總結

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.