httpd 執行!'' 為什麼?
commit 或 rollback 一個敘述?
NULL 值?
func() 方法是做什麼用的?
perldoc DBI::FAQ
"DBI 是給 Perl 語言用來連接資料庫的程式設計介面(API)。DBI API 規格中
定義了一系列函數、變數以及用法,他們提供了一套連接資料庫的一致介面,
不論實際上你所要連接的資料庫是那一種。"
簡言之,DBI 介面容許使用者透通地 (transparently) 連接多種類形的資料庫。所以 如果你連接到 Oracle、Informix、mSQL、Sybase 或任何其它的資料庫,你都無須了解 介面後運作的機制。因為 DBI 定義的 API 在這些資料庫上 都 可以運作。
一個相關的好處是,可以在同一個 perl 程式內連接兩個 不同廠牌的 資料庫, 意即,例如我要用一個程式從 Oracle 資料庫內讀出資料並將資料放進另一個 Informix 資料庫。DBI 介面就容許你輕易地作到它。
下圖描述了這個架構:
DBperl 是這個介面規格的舊名稱。現在它通常被用來稱呼 perl4 用的資料庫介面 模組,例如,oraperl、isqlperl、ingperl 等等。這些介面沒有一個標準的 API 並且一般來說都 不 被支援。
以下是一份舊 DBperl 的列表,以及他們相對應的 DBI 部份和其支援者的資訊。請記住 ,下列的這些作者 未必是 替相同資料庫維護 DBI 模組的人。這些 email 住址並不可 靠,他們只應該被用來當作查詢下列 perl4 模組相關資訊之用途。DBI 驅動程式的資料應 該直接在 dbi-users 郵遞論壇上詢問。
Perl4 名稱 資料庫 作者 DBI 驅動程式
---------- -------- ------ ----------
Sybperl Sybase Michael Peppler DBD::Sybase
<mpeppler@itf.ch>
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 模擬層,所以,像 DBD::Oracle 就有付 Oraperl 模擬層,它容許你在不經更動的情況下執行你的 oraperl 程式。這模擬層將 oraperl API 的呼叫轉成相對應的 DBI 呼叫。
以下就列出各模擬層的資訊:
模組 模 擬 層 狀 態
------ --------------- ------
DBD::Oracle Oraperl 完整
DBD::Ingres Ingperl 完整
DBD::Informix Isqlperl 發展中
DBD::Sybase Sybperl 可用嗎? ( 須要驗證 )
DBD::mSQL Msqlperl 實驗性地與 DBD::mSQL-0.61 一起發表
Msqlperl 模擬層算是特例。Msqlperl 是給 perl5 用的 mSQL 資料庫驅動程式, 但是與 DBI 規格並不一致。在 DBD::mSQL 出現後,已經不鼓勵使用 Msqlperl 了。 Msqlperl 可以 經由 下列網址自 CPAN 取得:
http://www.perl.com/cgi-bin/cpan_mod?module=Msqlperl
ftp://ftp.demon.co.uk/pub/perl/db
你可以從 CPAN 裡面取得這些驅動程式的最新版本。最近的 CPAN 站可以透過 Tom Christiansen 神奇的 CPAN 自動分配 程式連接,它在:
http://www.perl.com/CPAN/
若要找特定版本的資訊以及驅動程式的精確 URL,請參看 DBI 驅動程式列表以及 DBI 模 組首頁,其位置在:
http://www.hermetica.com/technologia/perl/DBI
http://www.hermetica.com/technologia/perl/DBI/doc/dbispec
此處有兩份規格,新的 DBI 草案規格是 Tim Bunce 與其發展小組積極推向一個穩定介面 的文件,更新速度很快,而舊的 DBperl 規格則是今日 DBI 介面演進的歷史根源。
後者應該被當作歷史事蹟而非程式設計手冊之類的正式文件來看待。 然而,他仍然是一份很有用的參考文件。
perldoc DBI
perldoc DBI::FAQ
這對於那些沒有固定地連接到網際網路的人們來說比較方便,但文件的版本未必是最新的。
perldoc Oraperl
這會將 Kevin Stock 為 perl4 寫的 oraperl 說明文件升級。在文件中也詳盡列出了 oraperl API 的內容。
perldoc DBD::mSQL
perldoc perlpod
如果你安裝了 Tk 模組,那麼也許你會對一個叫 tkpod 的 POD 閱讀程式感到有興趣, 他是根據 Tk 寫的並把 POD
轉換成一種簡單易讀的格式。
[譯註]譯者寫過一篇 POD 的中文介紹,其 url 在
http://www.math.ncu.edu.tw/~chenym/FAQ/Perl/POD/pod.html
http://www.hermetica.com/technologia/perl/DBI/tidbits
在 DBI 郵遞論壇上有一系列不同作者的文章,原意是要澄清一些觀點, 最後變成一篇篇相當清楚易懂的文件。這些文件的品質並不一至, 但是它們的確提供了一些發展這些介面時的想法。
http://www.tpj.com
以下就是本書的目錄。
* Introduction
+ Databases
+ CGI / WWW
+ perl
* Basic Database Concepts
+ Types of Database
o Flat File
o AnyDBM
o RDBMS
+ Using Which Database For What...
* SQL
+ Why SQL?
+ Structuring Information In Databases
+ Retrieving Data From Databases
+ Manipulating Data and Data Structures
* DBI Architecture
* Programming with DBI
+ DBI Initialization
+ Handles
o Driver Handles
o Database Handles
o Statement Handles
+ Connection and Disconnection
+ Handling Errors
+ Issuing Simple Queries
+ Executing Atomic Statements
+ Statement MetaData
+ More perl-ish Statements
+ Binding
+ Transaction Handling
+ Utility Methods
+ Handle Attributes and Dynamic Variables
* DBI and ODBC
* The Database Drivers
+ DBD::Oracle and oraperl
+ DBD::Informix and isqlperl
+ DBD::mSQL and Msqlperl
* Case Studies
+ DBI and the WWW
+ Data Migration and Warehousing
+ Administration Software
* Appendix: API Reference / Specification
* Appendix: Resources
http://www.hermetica.com/technologia/perl/DBI
http://www.fugue.com/dbi
如果你無法成功地使用上面那個表格,請遵循以下方法訂閱他們:
Email: 'dbi-XXX-request@fugue.com' 信的內容裡寫: 'subscribe'
'dbi-XXX' 就是你有興趣的郵遞論壇的名稱。但記住你的請求會由人工處理並因此而拖延 一點時間。
以下是使用者可以加入的論壇:
http://outside.organic.com/mail-archives/dbi-users/
這三個郵遞論壇的可搜尋 hypermail 檔案庫,還有一些古老的信件可讓使用者瀏覽。
http://www.rosat.mpe-garching.mpg.de/mailing-lists/PerlDB-Interest
與上面提到的美國檔案庫相同。
http://www.hermetica.com/technologia/perl/DBI
如果確定他是已知的問題,你可能要等到有人修正他。如果你 真的 需要修正他,不妨 試試下列的動作:
perl -V),模組及 DBI 的版本。
我們有許多工作要作,我們也有在注意郵遞論壇上提出的問題。除此之外,我們也許沒有 <你所愛用的平台> 所以無法幫上任何忙! 如果這聽起來有點無情,我們對此深感歉意 ,但這也是實際情況。
然而,也許你會在凌晨三點碰到我們之中的一個奇才,並且在五分鐘內得到修補問題的方法 。這個縈繞在 DBI 圈圈裡的氣氛就是我們 的確 注意使用者的問題,因為我們都在相似 的環境裡工作。
如果你還是準備要寄信給作者,請儘量提供更多的資訊,例如:
http://www.perl.com/cgi-bin/cpan_mod?module=Devel::CoreStack
最新的 DBI 和 DBD::Oracle 模組可以隨著標準的 perl 5.004 (或更新) 版本建構 並在 Win32 平台執行。
如果你用的是舊的且非標準的 ActiveWare 移植的 perl,你就無法使用標準的 DBI 與 DBD::Oracle 模組。下列的 url 可以找到要做些什麼改變以及修補前的版本:
http://www.hermetica.com/technologia/perl/DBI/win32
本段由 Tim Bunce 與 Jeff Urlwin 回答
在 DBI-0.79 之後的版本中包含了一個可用 Win32::ODBC 模組的 DBI 實驗性'模擬層' 。他叫做 DBI::W32ODBC 同時他也非常小,你會需要先從下列 url 取得 Win32::ODBC 模組。
http://www.roth.net
因為他在實驗階段,所以如果回報的問題沒有附上修正方法的話就可能被忽略掉。你也會 需要 Jeff Urlwin 提供的 Win32 DBI 修補工具組,他的位置在上一問題的答案中。
回到正題上來,理論上來說,是的,你可以用 DBI 透過 ODBC 來連接 Microsoft Access 和 SQL-Server 資料庫!
http://www.hermetica.com/technologia/perl/DBI/DBD
如果沒有,那就是沒有。在此頁上缺席的資料庫驅動程式代表還沒人有興趣發展他。
從上面的論述可以推斷出如果你看到有人發表某個 不在 上頁的驅動程式,很有可能他 並非是個真正遵從規格的 DBI 驅動程式。因此關於這類驅動程式的問題 請不要 丟 到 DBI 郵遞論壇上來。
``UNIX 剛開始時就有個檔案式 ``資料庫'',就是 dbm 系統。dbm 容許你將資料存在
檔案中,並快速地取出來。然而,他也有以下的幾個嚴重弱點。
File Locking
dbm 系統並沒有一個特別強健的 file locking 能力,也無法糾正當同時有多重
資料庫寫入動作時所帶來的問題。
Arbitrary Data Structures
dbm 系統只能使用一種資料結構:
有索引值的資料對 [key-value pairs]。索引值可以是複雜的物件,例如一個
[ C ] 的結構,但是其值必須是唯一的。這是整個 dbm 系統實用性上的一個大
限制。
儘管如此,dbm 系統仍然提供很大的用處給那些擁有簡單的資料及受限制的資源的使
用者,因為它快,強健並且絕對是通過完善測試的。在 Perl 裡用來連接 dbm 系統的
模組已經整合到 Perl 核心裡的 AnyDBM_File 模組內了。''
結論是,DBM 對於以讀取為主的資料庫或是小而簡單且單人使用的情況來說是個令人滿意 的解決方案。然而若要擁有更有力且可變尺度的資料集,加上強健的交易鎖定 [robust transactional locking],還是要推荐使用者使用 DBI。
func() 私有方 法來擷取。你可以在 DBD::mSQL 的 POD 裡面找到更多關於這些私有方法的說明,請打:
perldoc DBD::mSQL
當然,得先安裝好 DBD::mSQL 才行。
從目前作者的眼光來看,如果資料量相對地小,意即 tables 少於一百萬列,資料庫裡少於 一千個 tables 的話,mSQL 是個完美可接受的選擇。因為這個資料庫價錢非常便宜,又 具備不可思議的強韌性並且有良好的支援。你可以到下列 Hughes 科技公司的網址取得更多 資料:
http://www.hughes.com.au
如果資料量比剛提的多,或是如果你有更多錢或更大的機器,我會推荐你用 Oracle RDBMS。Oracle 的網站提供了更多更好的資訊。
http://www.oracle.com
Informix 是另一種值得考慮的高階 RDBMS 。關於他與 Oracle 的差異性,在此很難作 詳細的比較。你可以去 Informix 的網站上找 Informix 的相關資料:
http://www.informix.com
若你打算以 WWW 作為應用程式的前端,mSQL 或許是個更好的選擇,因為 CGI 程式與 Oracle RDBMS 間的通訊緩慢,且每個與 Oracle 的通訊會耗掉較多的系統資源這兩點原因 。而 mSQL 是個資源耗用較少且較快的選擇。
這些意見並不代表任何人的立場或是反映任何公司的支援或觀點。他們只是參考意見而已。
DBI 代表的是一個 一般性的 API,能夠與大多數的資料庫合作,並且沒有與特定資料庫 相關的功能被定義在其中。
然而,驅動程式的作者如果想的話,可以透過 DBI API 裡定義的 func() 方法將一些 特定資料庫才有的功能掛上去。而應用程式發展者應當注意的是這些 經由 func()
方法提供的功能是不太可能移植到其他資料庫上的。
DBI 所擁有的能力使得 CGI 程式設計師能替他們的使用者開啟 WWW 與資料庫間的通道, 提供大量的資料讓使用者玩。DBI 提供的另一個可能性是如果資料庫伺服器的負荷太大了 ,那麼他們可以在不更動 CGI 程式的情況下升級後端的資料庫伺服器。
由 John D. Groenveld 所提供。
Apache httpd 提供了一群 <httpd> 子程序來服務客戶端的要求。
使用 Doug MacEachern 寫的 Apache mod_perl 模組,他把 perl 直譯器嵌入 子 httpd 中。所以 CGI、DBI 以及其他你需要的模組都可以在每個子程序啟動時一起
載入。這些模組除非在磁碟上有更動,否則不會再被重新載入。
參看 Apache 計劃的網站以獲得更多關於 Apache 的資訊:
http://www.apache.org/
你可以用下面的方法從 CPAN 抓取 mod_perl:
http://www.perl.com/cgi-bin/cpan_mod?module=Apache
由 John D. Groenveld 所提供。
使用 Edmund Mergl 的 Apache::DBI 模組,簽入資料庫的資料都會存在每個子 http
的一個雜湊陣列中。如果你用單一資料庫使用者簽入,那此通訊便會和每個子程序一起啟動
。目前,資料庫的連接無法讓子 httpd 之間共享。
可以透過下列位置從 CPAN 抓取 Apache::DBI:
http://www.perl.com/cgi-bin/cpan_mod?module=Apache::DBI
httpd 執行!'' 為什麼?
$ORACLE_HOME、$ORACLE_SID 或 $TWO_TASK
。
而 http 程序通常是以 nobody 的身份來執行,意及他的環境變數設定可能不完整。
任何想在此環境下執行的程式都一定會失敗。
要解決這問題,在你程式的開頭用一段 BEGIN { } 來替你的資料庫設定環境變數。這樣 通常就會解決你的問題了。
同樣地,你應該檢查 http 錯誤訊息紀錄檔中是否有任何線索,還有參考珍貴的 ``Idiot's Guid To Solving
Perl / CGI Problems'' 及 ``Perl CGI 程式設計 FAQ''。因 為這問題看來不像是與
DBI 有關係的。
你可以在下列位置找到 ``Idiot's Guide To Solving Perl / CGI Problems'':
http://www.perl.com/perl/faq/index.html
以及 ``Perl CGI 程式設計 FAQ''。請仔細地閱讀這兩份文件! 他們可能可以替你省下好幾 個小時的工作時間。
[譯註]中文版的 Perl CGI 程式設計 FAQ 可以在下列 url 找到:
http://www.math.ncu.edu.tw/FAQ/Perl/perl-cgi-faq/pcp_faq.html
在下面的 url 中,你可以抓到一些 Oracle 用的 OCI 範例檔,他們有做到多緒處理
SELECT 敘述:
http://www.hermetica.com/technologia/oracle/oci/orathreads.tar.gz
例如,假設你在一個 Oracle 資料庫裡創造了一個 stored procedure,你就可以用
$dbh->do() 立即執行這個 procedure:
$dbh->do( "BEGIN someProcedure END;" ); # 針對 Oracle
註: 這是針對 Oracle。由 Jeff Urlwin 所貢獻的
$sth = $dbh->prepare( "BEGIN foo(:1, :2, :3); END;" ) # Oracle specific
|| die $sth->errstr;
$sth->bind_param(1, $a) || die $sth->errstr;
$sth->bind_param_inout(2, \$path, 2000) || die $sth->errstr;
$sth->bind_param_inout(3, \$success, 2000) || die $sth->errstr;
$sth->execute || die $sth->errstr;
注意錯誤判斷的部份,看來好像是多餘的,但是在需要花很長時間執行的情況下,他可能 替你省下幾小時的時間。參考 DBI 文件中 $sth->{RaiseError} 和 $sth->{printError} 的說明以了解如何用較簡單的方法達到相同效果。
因此,有些驅動程式,透過私有的 func() 方法來支援資料庫創造和刪除。你應該看看
你所使用的驅動程式之說明文件,確定他是否支援此一機制。
commit 或 rollback 一個敘述?
commit 或 rollback 的方法。
NULL 值?
NULL 值的方式就像處理 undef 值一樣。NULL 可以用 NULL
插入資料庫中,例如:
$rv = $dbh->do( "INSERT INTO table VALUES( NULL )" );
但取值回來時,依然應該測試一下確定是 NULL 不是 undef。這是所有驅動程式共用 的標準。
func() 方法是做什麼用的?
func() 方法被定義在 DBI 裡面用來利用資料庫特定的功能,例如,創造或丟棄資料 庫的能力。要採用這些與驅動程式相關的方法很容易,例如,要用 createDatabase 這 個有一個參數的功能,我們只要寫:
$rv = $dbh->func( 'argument', 'createDatabase' );
軟體開發人員須注意 func() 這方法在不同資料庫間並不具備可攜性。
不過,有些機構有提供 DBI 的技術支援以及教育訓練課程。作者並不清楚這些服務的品質 如何。以下列出的連結點僅供參考。
http://www.perl.co.uk/tpc
http://www-ccs.cs.umass.edu/db.html
http://www.odmg.org/odmg93/updates_dbarry.html
http://www.jcc.com/sql_stnd.html
This document is Copyright (c)1997 Alligator Descartes. All rights reserved. Permission to distribute this document, in full or in part, via email, Usenet, ftp archives or http is granted providing that no charges are involved, reasonable attempt is made to use the most current version and all credits and copyright notices are retained ( the AUTHOR and COPYRIGHT sections ). Requests for other distribution rights, including incorporation into commercial products, such as books, magazine articles or CD-ROMs should be made to Alligator Descartes <descarte@hermetica.com>.