發新話題

《Perl DBI 進階功能》SELECT 鈙述

《Perl DBI 進階功能》SELECT 鈙述

我們已經學會了連線資料庫,錯誤偵測,以及下達簡單的 SQL 鈙述的方法. 是該學一些更有用的程式語法的時候了.

SELECT 鈙述
在 SQL 的鈙述中,最常使用的指令莫過於 SELECT 鈙述. 為了使用 SELECT,我們應該先 prepare 這一段鈙述,然後進行 execute 動作. 在下面的程式片段中,我們都會使用 statement handle $sth 有存取 SELECT 的結果.


use strict;
use DBI;

my $dbh = DBI->connect( 'dbiBMaker:dbsample',
                        'jerry',
                        'jeerrypassword',
                        {
                          RaiseError => 1,
                          AutoCommit => 0
                        }
                      )
          || die "Database connection not made: $DBI::errstr";

my $sql = qq{ SELECT * FROM employees };
my $sth = $dbh->prepare( $sql );
$sth->execute();

$dbh->disconnect();
   
上述程式要求 DBMaker 資料庫為查詢指令先準備好執行計畫,之後再執行該查詢指令. 到目前為止還沒有任何一筆記錄傳回. 稍後我們會使用 bind_columns 的技術以取得資料庫輸出的記錄. bind_columns 分別將每個輸出欄位繫結到一個 scalar reference. 一旦呼叫到 fetch 時,這些 scalars 就會填入這資料庫傳回的值.

use strict;
use DBI;

my $dbh = DBI->connect( 'dbiBMaker:dbsample',
                        'jerry',
                        'jerrypassword',
                        {
                          RaiseError => 1,
                          AutoCommit => 0
                        }
                      )
          || die "Database connection not made: $DBI::errstr";

my $sql = qq{ SELECT id, name, title, phone FROM employees };
my $sth = $dbh->prepare( $sql );
$sth->execute();

my( $id, $name, $title, $phone );
$sth->bind_columns( undef, \$id, \$name, \$title, \$phone );

while( $sth->fetch() ) {
  print "$name, $title, $phone\n";
}

$sth->finish();
$dbh->disconnect();
   
這倒是一個列印出全公司電話連絡簿的好方法,尤其是 WHERE 區塊的使用讓我們輕易地取出所有的資料輸出! 下面會利用到 bind_param 先將 SQL 鈙述做一次 prepare,就能夠高速地執行許多次.

use strict;
use DBI;

my $dbh = DBI->connect( 'dbiBMaker:dbsample',
                        'jerry',
                        'jerrypassword',
                        {
                          RaiseError => 1,
                          AutoCommit => 0
                        }
                      )
          || die "Database connection not made: $DBI::errstr";

my @names = ( "Larry%", "Tim%", "Randal%", "Doug%" );

my $sql = qq{ SELECT id, name, title, phone FROM employees WHERE name LIKE ? };
my $sth = $dbh->prepare( $sql );

for( @names ) {
  $sth->bind_param( 1, $_);
  $sth->execute();

  my( $id, $name, $title, $phone );
  $sth->bind_columns( undef, \$id, \$name, \$title, \$phone );

  while( $sth->fetch() ) {
    print "$name, $title, $phone\n";
  }
}

$sth->finish();
$dbh->disconnect();

TOP

發新話題

本站所有圖文均屬網友發表,僅代表作者的觀點與本站無關,如有侵權請通知版主會盡快刪除。