Perl DBI(Database Interface)與 C API 思維相似:透過句柄(handle,即引用)操作底層物件(object)。慣用變數命名:
$dbh:資料庫句柄$sth:陳述句柄(查詢)$fh:檔案句柄$h:通用句柄非句柄變數慣例:$rc(布林回傳)、$rv(整數回傳)、$rows(影響行數)、@ary(單行資料陣列)。
dump_members腳本連線 MySQL、執行 SELECT、逐行列印會員資料(Tab 分隔)。關鍵步驟:
use DBI; use strict; —— 引入模組並啟用嚴格模式(強制變數宣告,避免拼字錯誤)。DBI->connect($dsn, $user, $pass, {RaiseError => 1}) —— 連線並啟用 RaiseError,錯誤自動 die,無需手動檢查每個呼叫。$sth = $dbh->prepare($sql) —— 預備陳述句,回傳 $sth。$sth->execute() —— 執行查詢。while (@row = $sth->fetchrow_array()) { ... } —— 逐行取得陣列,無資料回傳空陣列結束迴圈。$sth->finish()、$dbh->disconnect() —— 釋放資源並斷線。注意:DBI 查詢字串不需分號結尾,否則會語法錯誤。
| 模式 | 屬性設定 | 行為 |
|---|---|---|
| 預設 | RaiseError=>0, PrintError=>1 | warn() 訊息並繼續執行,需自行檢查回傳值(如 or exit(1))。 |
| 自動終止 | RaiseError=>1 | 錯誤即 die() 退出,最省事(dump_members 採用)。 |
| 自行處理 | RaiseError=>0, PrintError=>0 | 完全自控,透過 $DBI::err、$DBI::errstr 取得錯誤碼與訊息,自行決定輸出與流程。 |
亦可自訂 $SIG{__DIE__} 改寫 RaiseError 的預設輸出,或用屬性雜湊 {RaiseError=>1} 讓程式碼更易讀。
do() 方法INSERT、UPDATE、DELETE 等不回傳結果集的語句,可用 $dbh->do($sql) 一步完成預備與執行。回傳影響行數(數值語境下 "0E0" 視為真,方便區別 undef 錯誤)。等價於 prepare() + execute()。
| 方法 | 回傳值 | 適用場景 |
|---|---|---|
fetchrow_array() | 值陣列 (@row) | 簡單列印、需按順序解包到具名變數 ($name, $email) = $sth->fetchrow_array()。 |
fetchrow_arrayref() | 陣列參考 $ary_ref | 效率較高,存取用 $ary_ref->[$i],需自行檢查 undef 避免 @{undef} 錯誤。 |
fetch() | 同 fetchrow_arrayref() | 別名。 |
fetchrow_hashref() | 雜湊參考 $hash_ref(鍵為欄位名) | 不依賴欄位順序,程式碼可讀性最佳,適合傳遞給不關心 SQL 選欄順序的函式。 |
所有方法在無資料時回傳 undef(或空陣列),迴圈條件自然終止。