PERL 是‘Practical Exptraction and Report Language’的簡寫。世上所有軟硬件平台都可使用 Perl。你所在視窗 95/NT、蘋果麥金塔 iMac、所有 Unix (Solaris、HPUX、AIX、Linux、Irix、SCO 等等)、大型電腦 MVS、桌面的 OS/2、OS/400、Amdahl UTS 和其他很多電腦。Perl 甚至可在很多不流行和不為人知的操作系統和硬件執行!!所以,在看到 Perl 在一個罕見的操作系統上執行時,不必大驚小怪。你可以想像到 Perl 的使用者和開發人員的數量。
PostgreSQL 的 Perl 介面已包括在 PostgreSQL 的散佈中。請參看 src/pgsql_perl5 目錄。
Perl 資料庫介面(DBI)是 Perl 語言的一個資料庫存取應用程式介面(API)。Perl DBI API 規格定義了一組函數、變數和慣例,以提供一個一致而獨立於實際所用資料庫的介面。
在此取得 DBD-Pg-0.89.tar.gz︰
摘錄自 Tim Bunce,DBI 的設計者和作者︰
“DBI 是 Perl 語言的一種應用程式介面(API)。Perl DBI API 規格定義了 一組函數、變數和慣例,用於提供一個一致而獨立於實際所用的資料庫介面。”
簡單地說,DBI 容許用家透明地 (transparently) 存取多種資料庫。所以,如果你連接到 Oracle、Informix、mSQL、Sybase 或任何資料庫,你不需要知道 3GL 層面內裡的機制。DBI 所定義的 API 可用於所有這些資料庫。
這樣的好處是你得到在一篇 perl 命令稿 (script) 中連接兩個不同出版商不同的資料庫,例如在一個程式中讀取在一個 Oracle 資料庫的資料及將它插入到 Informix 資料庫中。DBI 層面容許你簡單及有力地做到。
這是 DBperl 模組的名單,所對應的 DBI 模組及技術支援資訊。有關 DBI 驅動程式的問題應該在 dbi-users 通訊論壇提出。
模組名稱 所需資料庫 作者 DBI
----------- ----------------- ------ ---
Sybperl Sybase Michael Peppler DBD::Sybase
<mpeppler@datamig.com>
http://www.mbay.net/~mpeppler
Oraperl Oracle 6 & 7 Kevin Stock DBD::Oracle
<dbi-users@fugue.com>
Ingperl Ingres Tim Bunce & DBD::Ingres
Ted Lemon
<dbi-users@fugue.com>
Interperl Interbase Buzz Moschetti DBD::Interbase
<buzz@bear.com>
Uniperl Unify 5.0 Rick Wargo None
<rickers@coe.drexel.edu>
Pgperl Postgres Igor Metz DBD::Pg
<metz@iam.unibe.ch>
Btreeperl NDBM John Conover SDBM?
<john@johncon.com>
Ctreeperl C-Tree John Conover None
<john@johncon.com>
Cisamperl Informix C-ISAM Mathias Koerber None
<mathias@unicorn.swi.com.sg>
Duaperl X.500 Directory Eric Douglas None
User Agent
不過,部分 DBI 模組有 DBperl 模擬層 (emulation layers),因此,DBD:Oracle 會有 Oraperl 模擬層,讓你無需更改現存的 Oraperl 手稿便能執行。這模擬層把 Oraperl API 呼叫翻譯成 DBI 呼叫並通過 DBI 執行。
這裡有一些 DBI 的資料來源。
POD 文件 POD 是嵌入到 perl 程式中用以“即場”解釋程式碼的一段文件,用以給程式設計師和模組的用家提供有用的資料。DBI 和驅動程式的 POD 正越來越流行,要閱讀有關文件,請使用以下指令。
DBI 規格的 PO 可用以下指令閱讀 $ perldoc DBI 使用結合到 DBD::Oracle 的 Oraperl 模擬層的人可用以下指令閱讀如何用 Oraperl 介面編寫程式︰ $ perldoc Oraperl DBD::mSQL 模組的用家可籍以下指令閱讀一些該驅動程式的獨家函數 (private functions) 和特異功能的資料︰ $ perldoc DBD::mSQL POD 文件中也包含常見問題。要閱讀的話請輸入︰ $ perldoc DBI::FAQ POD 的一般資料—如何撰寫 POD,及整體的 POD 哲學,可籍以下指令閱讀︰ $ perldoc perlpod
閒談、小道消息和觀察︰ 在 DBI 的通信論壇中有不同人提出的一連串偶然的閒談。
也請看看
用家可能參加的通信論壇為︰
如果發生訊息轉儲 (core dump),嘗試使用 Devel::CoreStack 模組來產生訊息轉儲的堆疊追蹤 (stack trace)。Devel::CoreStack 可在 CPAN 找到︰
把堆疊追蹤、模組版本、perl 版本、測試個案、操作系統版本及任何其他適用的資料電郵到 dbi-users 通信論壇。寄出的資料越齊全,開發人員越快解決問題。
DBI 和 DBD::Oracle 的 Win32 版本已成為 DBI 的標準部分。因此,比 DBI 0.81 高的版本應該會正常運作。透過 ODBC,你可以存取微軟 Access 和 SQL-Server 資料庫。在 DBI-0.79(及以後)有一個實驗性質的 Win32::ODBC DBI 模擬層。它名為 DBI::W32ODBC。你需要使用 Win32::odbc 模組。
一個字︰有!DBI 對 CGI 程式設計非常有用!事實上,CGI 是 DBI 最重要的用途之一。
DBI 讓 CGI 程式設計師設計功能強大的互聯網前端資料庫給他們的用家,從而提供大量按次序排列的資料。DBI 也容許在網站的資料庫伺服器超過負荷時,管理人員在無須更改 CGI 命令稿的情況下將之升級。
Apache httpd 管理一組子 httpd (httpd children) 來服務客戶。籍著 Doug MacEachern 的 Apache mod_perl 模組,perl 翻譯器已嵌入到子 httpd 中。CGI、DBI 和你喜歡的模組會在兒子誕生時載入。這些模組直到在磁碟上的檔案被更改時才會再被載入。要知道更多有關 Apache 的資料,請看 Apache 計劃的網站︰
籍著 Edmund Mergl 的 Apache::DBI 模組,每個子 httpd 會把資料庫登入儲存在雜湊 (hash) 中。如果你的應用程式只有一個資料庫用家,每一個兒子都可開始連連。目前,兒子之間並不會分享資料庫連接。Apache::DBI 可從 CPAN 下載︰
基本上,這很有可能是因為從指令行執行命令稿的使用者已把環境變數設定好,以 DBD::Oracle 來說,即 $ORACLE_HOME, $ORACLE_SID 或 TWO_TASK。httpd 行程 (process) 通常是以 nobody 的身份執行,即沒有了設定好的環境。任何在這情況下嘗試執行的手稿都會正確地失敗。要解決這問題,在你的命令稿的開頭用一個 BEGIN() 區塊設定環境。這樣便會解決問題。同樣地,你要檢查你的 httpd 錯誤紀錄檔以尋找線索,以及閱讀“Idiot's Guide To Solving Perl / CGI Problems”和“Perl CGI Programming FAQ”以尋找更多資料。這問題大概不會和 DBI 有關。請兩份文件都小心閱讀!
要看一些使用多流 SELECT 句子的 Oracle OCI 範例程式,請參閱︰
假設你在目標資料庫,例如一個 Oracle 資料庫中建立了內儲程序,你可使用 $dbh->do 來使程序立即執行。例如︰
$dbh->do( "BEGIN someProcedure END" );
記著還要檢查錯誤!
$sth = $dbh->prepare( "BEGIN foo(:1, :2, :3); END;" );
$sth->bind_param(1, $a);
$sth->bind_param_inout(2, \$path, 2000);
$sth->bind_param_inout(3, \$success, 2000);
$sth->execute;
對 DBI 來說,要適當地支援資料庫的建立和丟棄太抽象了。例如,Oracle 根本不支援丟棄資料庫!此外,在 Oracle 中,資料庫伺服器基本上就是資料庫,但在 mSQL,即使沒有資料庫,伺服器行程 (process) 也能順利地執行。這問題牽連太廣了。正因如此,部分驅動程式透過私家 func 方法來建立和刪除資料庫。你要檢查驅動程式的文件來了解它有沒有支援這機制。
DBI 被指定把 NULL 值當作 undef 值處理。NULL 可以 NULL 的數值來加入到資料庫中,例如︰
$rv = $dbh->do( "INSERT INTO table VALUES( NULL )" );
不過當查詢時,NULL 要和 undef 比較。這是所有驅動程式都適用的標準。
DBI 把 func 方法定義為資料庫獨有功能的進入點,例如建立和丟棄一個資料庫。使用這些驅動程式獨有方法十分簡單,例如,要使用一個 createDatabase 方法輸入一個引數 (argument) ,我們會寫︰
$rv = $dbh->func( 'argument', 'createDatabase' );
軟件開發人員要注意 func 方法不能在不同資料庫間移植。
PERL CLINIC : Perl Clinic 以合約形式為 Perl、DBI、DBD::Oracle 和 Oraperl 提供商業支援。這些支援是由 DBI 作者 Tim Bunce 工作的公司提供的。欲知詳情,請看︰
請參閱 測試 Perl—PostgreSQL 介面一節