### ### $Id: FAQ.pm,v 1.6 1997/09/05 19:16:40 timbo Exp $ ### ### DBI Frequently Asked Questions POD ### ### Copyright section reproduced from below. ### ### This document is Copyright (c)1994-1997 Alligator Descartes, with portions ### Copyright (c)1994-1997 their original authors. This module is released under ### the 'Artistic' license which you can find in the perl distribution. ### ### 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 I and I 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 >. ### ### $Log: FAQ.pm,v $ # Revision 1.6 1997/09/05 19:16:40 timbo # *** empty log message *** # # Revision 1.5 1997/07/15 10:58:27 timbo # *** empty log message *** # # Revision 1.4 1997/06/25 12:20:10 timbo # *** empty log message *** # package DBI::CFAQ; =head1 名稱 DBI::FAQ -- Perl5 資料庫介面的常見問題集 =for html Perl5 資料庫介面的常見問題集
[ Hermetica ]

DBI 常見問題集 v.0.35
最後更動時間: 一月 14, 1998

=head1 用法 perldoc DBI::FAQ =head1 版本 這份文件目前的版本為 I<0.35>,日期是 I<一月 13 日,1998>。 =head1 說明 這份文件的目的是回答在 DBI 郵遞論壇上及 DBI 發展小組成員所收到的最常見問題。 =head1 基本資訊及其來源 =head2 1.1 什麼是 DBI, DBperl, Oraperl 以及 *perl? DBI 的建構者及作者 Tim Bunce 說: "DBI 是給 Perl 語言用來連接資料庫的程式設計介面(API)。DBI API 規格中 定義了一系列函數、變數以及用法,他們提供了一套連接資料庫的一致介面, 不論實際上你所要連接的資料庫是那一種。" 簡言之,DBI 介面容許使用者透通地 (transparently) 連接多種類形的資料庫。所以 如果你連接到 Oracle、Informix、mSQL、Sybase 或任何其它的資料庫,你都無須了解 介面後運作的機制。因為 DBI 定義的 API 在這些資料庫上 I<都> 可以運作。 一個相關的好處是,可以在同一個 perl 程式內連接兩個 I<不同廠牌的> 資料庫, I<意即>,例如我要用一個程式從 Oracle 資料庫內讀出資料並將資料放進另一個 Informix 資料庫。DBI 介面就容許你輕易地作到它。 =for html 下圖描述了這個架構:

[ DBI Architecture ]

I 是這個介面規格的舊名稱。現在它通常被用來稱呼 perlI<4> 用的資料庫介面 模組,例如,I、I、I 等等。這些介面沒有一個標準的 API 並且一般來說都 I<不> 被支援。 以下是一份舊 DBperl 的列表,以及他們相對應的 DBI 部份和其支援者的資訊。I<請記住> ,下列的這些作者 I<未必是> 替相同資料庫維護 DBI 模組的人。這些 email 住址並不可 靠,他們只應該被用來當作查詢下列 perl4 模組相關資訊之用途。DBI 驅動程式的資料應 該直接在 I 郵遞論壇上詢問。 Perl4 名稱 資料庫 作者 DBI 驅動程式 ---------- -------- ------ ---------- Sybperl Sybase Michael Peppler DBD::Sybase Oraperl Oracle 6 & 7 Kevin Stock DBD::Oracle Ingperl Ingres Tim Bunce & DBD::Ingres Ted Lemon Interperl Interbase Buzz Moschetti DBD::Interbase Uniperl Unify 5.0 Rick Wargo None Pgperl Postgres Igor Metz DBD::Pg Btreeperl NDBM John Conover SDBM? Ctreeperl C-Tree John Conover None Cisamperl Informix C-ISAM Mathias Koerber None Duaperl X.500 Directory Eric Douglas None User Agent 然而,某些 DBI 模組有 DBperl 模擬層,所以,像 I 就有付 Oraperl 模擬層,它容許你在不經更動的情況下執行你的 oraperl 程式。這模擬層將 oraperl API 的呼叫轉成相對應的 DBI 呼叫。 以下就列出各模擬層的資訊: 模組 模 擬 層 狀 態 ------ --------------- ------ DBD::Oracle Oraperl 完整 DBD::Ingres Ingperl 完整 DBD::Informix Isqlperl 發展中 DBD::Sybase Sybperl 可用嗎? ( 須要驗證 ) DBD::mSQL Msqlperl 實驗性地與 DBD::mSQL-0.61 一起發表 I 模擬層算是特例。I 是給 perl5 用的 I 資料庫驅動程式, 但是與 DBI 規格並不一致。在 I 出現後,已經不鼓勵使用 I 了。 I 可以 I<經由> 下列網址自 CPAN 取得: http://www.perl.com/cgi-bin/cpan_mod?module=Msqlperl =head2 1.2. 我可以從哪拿到它? DBI 主要是從此處公布的: ftp://ftp.demon.co.uk/pub/perl/db 你可以從 CPAN 裡面取得這些驅動程式的最新版本。最近的 CPAN 站可以透過 Tom Christiansen 神奇的 I 程式連接,它在: http://www.perl.com/CPAN/ 若要找特定版本的資訊以及驅動程式的精確 URL,請參看 DBI 驅動程式列表以及 DBI 模 組首頁,其位置在: http://www.hermetica.com/technologia/perl/DBI =head2 1.3. 我可以在哪找到更多資訊? 網路上有一些關於 DBI 的資訊。 =over 4 =item I http://www.hermetica.com/technologia/perl/DBI/doc/dbispec 此處有兩份規格,新的 DBI 草案規格是 Tim Bunce 與其發展小組積極推向一個穩定介面 的文件,更新速度很快,而舊的 DBperl 規格則是今日 DBI 介面演進的歷史根源。 後者應該被當作歷史事蹟而非程式設計手冊之類的正式文件來看待。 然而,他仍然是一份很有用的參考文件。 =item I I 是一種文件形式,他通常與 perl 程式放在一起以解釋程式碼的意義,提供有用的 資源給使用者和程式設計師。DBI 的 POD 格式文件以及驅動程式已經越來越常見了,這些 模組的文件可以用以下的指令來閱讀。 =over 4 =item DBI 規格 以下的指令可以用來閱讀 DBI 規格的 POD 格式文件: perldoc DBI =item 常見問題集 就是這份文件,I<常見問題集> 也有 POD 格式的版本! 你若要在自己的系統上閱讀,可打: perldoc DBI::FAQ 這對於那些沒有固定地連接到網際網路的人們來說比較方便,但文件的版本未必是最新的。 =item Oraperl 使用 I 內的 Oraperl 模擬層的人可以藉由以下指令讀讀如何使用 Oraperl 介面寫程式: perldoc Oraperl 這會將 Kevin Stock 為 perl4 寫的 oraperl 說明文件升級。在文件中也詳盡列出了 oraperl API 的內容。 =item DBD::mSQL 使用以下指令就可以閱讀與 I 相關的函數與驅動程式使用技巧: perldoc DBD::mSQL =item 關於 POD 下列指令可以得到關於如何撰寫 POD 格式文件,以及 POD 所牽涉到的觀念: perldoc perlpod 如果你安裝了 Tk 模組,那麼也許你會對一個叫 C 的 POD 閱讀程式感到有興趣, 他是根據 Tk 寫的並把 POD 轉換成一種簡單易讀的格式。 [譯註]譯者寫過一篇 POD 的中文介紹,其 url 在 http://www.math.ncu.edu.tw/~chenym/FAQ/Perl/POD/pod.html =back =item I http://www.hermetica.com/technologia/perl/DBI/tidbits 在 DBI 郵遞論壇上有一系列不同作者的文章,原意是要澄清一些觀點, 最後變成一篇篇相當清楚易懂的文件。這些文件的品質並不一至, 但是它們的確提供了一些發展這些介面時的想法。 =item I<``DBI -- perl5 資料庫介面''> 這篇文章是由 Alligator Descartes 及 Tim Bunce 寫的,主題是關於 DBI 的結構。他被 刊登在第五期的 ``I''。這篇文章 I<非常地> 好。去買本來看看吧。事實上, 每一期你都應該買! ``Perl 期刊'' 的首頁網址為: http://www.tpj.com =item I<``DBperl''> 這篇關於 I 的文章被刊登在 1996 年 11 月號的 ``Dr. Dobbs 期刊''。此文章的 作者顯然不想為了求證其文章內容而打擾 DBI 發展小組成員。在 I 郵遞論 壇上對此文章的反應都是頗負面的。事實上這篇文章說的是關於 I 的過期資訊而 非 I 的消息。然而,為了保持完備性,我們還是把他納入參考文章之一。 =item I<``Perl5 資料庫介面''> 這裡討論的是將在今年冬天由 O'Reilly and Associates 出版的書,作者是 Alligator Descartes ( 就是本 FAQ 的作者 )。 以下就是本書的目錄。 * 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 =item I 每個驅動程式附的 I 檔案有時會包含對使用者非常有用的資訊 ( 是真的! )。請 閱讀他們。他使得我們卑微的存在更能令人接受。這些文件都可以在主 DBI 首頁上看到: http://www.hermetica.com/technologia/perl/DBI =item I<郵遞論壇> 以下是三個由 Ted Lemon 所維護的關於 DBI 的郵遞論壇。你可以 I<透過> 以下的 url 來訂閱或退訂他們: http://www.fugue.com/dbi 如果你無法成功地使用上面那個表格,請遵循以下方法訂閱他們: Email: 'dbi-XXX-request@fugue.com' 信的內容裡寫: 'subscribe' 'dbi-XXX' 就是你有興趣的郵遞論壇的名稱。但記住你的請求會由人工處理並因此而拖延 一點時間。 以下是使用者可以加入的論壇: =over 4 =item I 這個論壇是用來發布公告的。很少有信件。這些公告通常也會被張貼在主 DBI 首頁。 =item I 這個論壇是給發展者討論關於 DBI 介面的點子和觀念,API 以及驅動程式機制的。只有開 發者或有興趣的人在用。也很少信件。 =item I 這個論壇討論較一般的話題,包括臭蟲回報,問題討論以及一般事項。信件量中等。 =back =item I<郵遞論壇檔案庫> =over 4 =item I<美國的郵遞論壇檔案庫> http://outside.organic.com/mail-archives/dbi-users/ 這三個郵遞論壇的可搜尋 hypermail 檔案庫,還有一些古老的信件可讓使用者瀏覽。 =item I<歐洲的郵遞論壇庫> http://www.rosat.mpe-garching.mpg.de/mailing-lists/PerlDB-Interest 與上面提到的美國檔案庫相同。 =back =back =head1 編譯上的問題 =head2 2.1. 編譯上碰到的問題或是 "測試失敗!" 首先,參考關於此模組的線上資訊,像 DBI 或是某種 DBD,看看這是否在你用的平台上是 個已知的編譯問題。上述這些文件都可以在下列 url 裡找到: http://www.hermetica.com/technologia/perl/DBI 如果確定他是已知的問題,你可能要等到有人修正他。如果你 I<真的> 需要修正他,不妨 試試下列的動作: =over 4 =item I<嘗試自行修改> 對於那些易大驚小怪的人,實在 I<不適合> 用此方法。如果你認為已經修好他,那麼就送 個修補檔案 [patch file] ( 依內容差異 [context diff] ) 給作者,並附以下說明事項: =over 4 =item * 問題是什麼,如果可能的話,請提供測試的狀況。 =item * 你修正問題時所做的一切。請確定你說明了每件事。 =item * 平台的資訊,資料庫版本,perl 版本 (用 C),模組及 DBI 的版本。 =back =item I<送信給作者> Do I whinge! 請將關於不同驅動程式的電子郵件寄到列在首頁上的位置。I<不要> 直接寄給作者,除非 他的電子郵件住址就是列在首頁上的那個。有些作者,包括 Tim Bunce,非常不希望在他 們的私人信箱裡收到這類信件。 我們有許多工作要作,我們也有在注意郵遞論壇上提出的問題。除此之外,我們也許沒有 > 所以無法幫上任何忙! 如果這聽起來有點無情,我們對此深感歉意 ,但這也是實際情況。 然而,也許你會在凌晨三點碰到我們之中的一個奇才,並且在五分鐘內得到修補問題的方法 。這個縈繞在 DBI 圈圈裡的氣氛就是我們 I<的確> 注意使用者的問題,因為我們都在相似 的環境裡工作。 如果你還是準備要寄信給作者,請儘量提供更多的資訊,I<例如>: =over 4 =item * I<所有> 在 README 檔案裡面提到碰到狀況時所需要的資料。而且我們指的是 I<全部>。 我們不會在裡面加入任意一行只為了讓我們身體健康或是達到艱澀難懂的 README 檔案之 長度標準。 =item * 如果你有 core dump 的情況,試試看用 I 模組從 core dump 檔案 中產生堆疊追蹤的結果。把他也寄過來。 I 可以在下列位置找到: http://www.perl.com/cgi-bin/cpan_mod?module=Devel::CoreStack =item * 模組版本、perl 版本、測試案例、作業系統版本以及 I<任何相關的資訊>。 =back 請記住,你若提供越多資訊,我們就有機會越快追蹤出問題所在。 如果你寄給我們無用的訊息,那也不用期待任何回音。 =item I<送信給 dbi-users 郵遞論壇> 送一份問題郵件的副本給郵遞論壇是個很好的主意。 作者們都會讀這些論壇,所以你寄一份副本去也不會有損失。 =back =head1 與平台和驅動程式相關議題 =head2 3.1 ODBC 和 DBI 的差異在哪裡? 好問題! 不過在此處尚未有更詳盡的答案時,請參考 DBI README 檔案的尾端。 =head2 3.2 Windows 95 / NT 平台有支援 DBI 嗎? 終於有了! Jeff Urlwin 已經致力於在這些平台上建構 I 和 I,並且 隨著更穩定的 perl 和 I 的移植,這個計劃進展相當順利。 最新的 I 和 I 模組可以隨著標準的 perl 5.004 (或更新) 版本建構 並在 Win32 平台執行。 如果你用的是舊的且非標準的 ActiveWare 移植的 perl,你就無法使用標準的 DBI 與 DBD::Oracle 模組。下列的 url 可以找到要做些什麼改變以及修補前的版本: http://www.hermetica.com/technologia/perl/DBI/win32 =head2 3.3 我可以用 DBI 連接 Microsoft Access 或 SQL Server 資料庫嗎? 本段由 Tim Bunce 與 Jeff Urlwin 回答 在 DBI-0.79 之後的版本中包含了一個可用 I 模組的 DBI 實驗性'模擬層' 。他叫做 I 同時他也非常小,你會需要先從下列 url 取得 I 模組。 http://www.roth.net 因為他在實驗階段,所以如果回報的問題沒有附上修正方法的話就可能被忽略掉。你也會 需要 Jeff Urlwin 提供的 I,他的位置在上一問題的答案中。 回到正題上來,理論上來說,是的,你可以用 DBI I<透過> ODBC 來連接 Microsoft Access 和 SQL-Server 資料庫! =head2 3.4 是否有給 I<某資料庫> 用的 DBD 呢? 在 DBI 驅動程式首頁上有列表嗎? http://www.hermetica.com/technologia/perl/DBI/DBD 如果沒有,那就是沒有。在此頁上缺席的資料庫驅動程式代表還沒人有興趣發展他。 從上面的論述可以推斷出如果你看到有人發表某個 I<不在> 上頁的驅動程式,很有可能他 並非是個真正遵從規格的 I 驅動程式。因此關於這類驅動程式的問題 I<請不要> 丟 到 DBI 郵遞論壇上來。 =head2 3.5 什麼是 DBM? 為何我應該用 DBI 取代之? 自 ``I'' 中節錄: ``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],還是要推荐使用者使用 I。 =head2 3.6 mSQL-2 何時才會被支援? 在 I 中,就已經有支援 I了。然而,目前還沒有新的關於索引 支援的方法加入 mSQL 程式庫核心。他們將會出現,並且透過 I C 私有方 法來擷取。你可以在 I 的 POD 裡面找到更多關於這些私有方法的說明,請打: perldoc DBD::mSQL 當然,得先安裝好 I 才行。 =head2 3.7 你推荐我使用那種資料庫呢? 在這個特別艱難的領域中,很難產生出一個客觀的答案,因為不同的人會有相異的使用量與 系統需求。 從目前作者的眼光來看,如果資料量相對地小,意即 tables 少於一百萬列,資料庫裡少於 一千個 tables 的話,I 是個完美可接受的選擇。因為這個資料庫價錢非常便宜,又 具備不可思議的強韌性並且有良好的支援。你可以到下列 Hughes 科技公司的網址取得更多 資料: http://www.hughes.com.au 如果資料量比剛提的多,或是如果你有更多錢或更大的機器,我會推荐你用 I。Oracle 的網站提供了更多更好的資訊。 http://www.oracle.com I 是另一種值得考慮的高階 RDBMS 。關於他與 Oracle 的差異性,在此很難作 詳細的比較。你可以去 Informix 的網站上找 Informix 的相關資料: http://www.informix.com 若你打算以 WWW 作為應用程式的前端,I 或許是個更好的選擇,因為 CGI 程式與 Oracle RDBMS 間的通訊緩慢,且每個與 Oracle 的通訊會耗掉較多的系統資源這兩點原因 。而 I 是個資源耗用較少且較快的選擇。 這些意見並不代表任何人的立場或是反映任何公司的支援或觀點。他們只是參考意見而已。 =head2 3.8 > 在 DBI 中有支援嗎? 我們推測你想要的特徵可能是一些非標準且與資料庫個別相關的,所以答案是 I<沒有>。 DBI 代表的是一個 I<一般性的> API,能夠與大多數的資料庫合作,並且沒有與特定資料庫 相關的功能被定義在其中。 然而,驅動程式的作者如果想的話,可以透過 DBI API 裡定義的 C 方法將一些 特定資料庫才有的功能掛上去。而應用程式發展者應當注意的是這些 I<經由> C 方法提供的功能是不太可能移植到其他資料庫上的。 =head1 程式上的問題 =head2 4.1 DBI 對 CGI 程式設計有任何用處嗎? 一句話,是的! DBI 對 CGI 程式設計有很大的用處! 事實上我會說 CGI 程式設計就是 DBI 兩大用途之一。 DBI 所擁有的能力使得 CGI 程式設計師能替他們的使用者開啟 WWW 與資料庫間的通道, 提供大量的資料讓使用者玩。DBI 提供的另一個可能性是如果資料庫伺服器的負荷太大了 ,那麼他們可以在不更動 CGI 程式的情況下升級後端的資料庫伺服器。 =head2 4.2 我如何用 DBD::Oracle 和 CGI 提供更短的連線時間呢? 由 John D. Groenveld 所提供。 Apache C 提供了一群 子程序來服務客戶端的要求。 使用 I 寫的 Apache I 模組,他把 perl 直譯器嵌入 子 C 中。所以 CGI、DBI 以及其他你需要的模組都可以在每個子程序啟動時一起 載入。這些模組除非在磁碟上有更動,否則不會再被重新載入。 參看 Apache 計劃的網站以獲得更多關於 Apache 的資訊: http://www.apache.org/ 你可以用下面的方法從 CPAN 抓取 I: http://www.perl.com/cgi-bin/cpan_mod?module=Apache =head2 4.3 我如何用 CGI 與 DBI 取得持續的連接 [persistent connection]? 由 John D. Groenveld 所提供。 使用 Edmund Mergl 的 I 模組,簽入資料庫的資料都會存在每個子 C 的一個雜湊陣列中。如果你用單一資料庫使用者簽入,那此通訊便會和每個子程序一起啟動 。目前,資料庫的連接無法讓子 C 之間共享。 可以透過下列位置從 CPAN 抓取 I: http://www.perl.com/cgi-bin/cpan_mod?module=Apache::DBI =head2 4.4 ``我的 perl 程式在命令列下能執行,但不能被 C 執行!'' 為什麼? 這通常是因為你用來執行此程式的使用者身份具備了完善的環境變數設定,以 I 來說,這些變數有 C<$ORACLE_HOME>、C<$ORACLE_SID> 或 C<$TWO_TASK> 。 而 C 程序通常是以 C 的身份來執行,意及他的環境變數設定可能不完整。 任何想在此環境下執行的程式都一定會失敗。 要解決這問題,在你程式的開頭用一段 C 來替你的資料庫設定環境變數。這樣 通常就會解決你的問題了。 同樣地,你應該檢查 C 錯誤訊息紀錄檔中是否有任何線索,還有參考珍貴的 ``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 =head2 5.1 我可以在 DBI 中用多緒處理 (multi-threading) 嗎? 在此 FAQ 完成時 ( I<請參看文件最前面> ),答案是不能。perl 本身尚未支援多緒處理。 然而,5.005 版的 perl 應該會將此功能納入,到時 DBI 應該就會很快跟進了。 在下面的 url 中,你可以抓到一些 Oracle 用的 OCI 範例檔,他們有做到多緒處理 C