要使用 Perl 訪問數(shù)據(jù)庫,就需要用到 Perl 數(shù)據(jù)庫接口( DBI),這是用于 Perl 的一個開源組件。DBI 支持 Perl 與第三方數(shù)據(jù)庫的集成,例如 IBM® Cloudscape™ 或 Derby。DBI 定義了訪問數(shù)據(jù)庫的方法、變量以及約定。為了訪問特定的數(shù)據(jù)庫,除了需要 DBI 之外,還需要一個 Perl Database Driver (DBD)。有多種可用于各種數(shù)據(jù)庫的 DBD,要訪問某一個數(shù)據(jù)庫,需要同時使用 DBI 和特定于數(shù)據(jù)庫的 DBD。使用 Perl 訪問數(shù)據(jù)庫的另一種方法是使用 DBI 和 DBD-ODBC 模塊,后者使用 ODBC,而不是使用本地的 DBD。目前還沒有專用于 Derby 的 DBD,因此,訪問 Derby 數(shù)據(jù)庫時需要使用 DBD-ODBC 模塊。Derby 通過 IBM DB2™ Run-time Client 獲得 ODBC 支持。
IBM Cloudscape 是 Apache Derby 開源數(shù)據(jù)庫的商業(yè)發(fā)行版。
Perl 是一種通用的、功能強大的腳本語言,常用于 Web 開發(fā)。利用 Perl 中提供的對數(shù)據(jù)庫的支持,可以很容易地從 Perl 訪問 Derby 數(shù)據(jù)庫。通過使用 ODBC 以及 Perl DBI 和 DBD-ODBC 模塊,就可以從 Perl 訪問 Derby 數(shù)據(jù)庫。
在本文中,您將親歷安裝和配置用 Perl 訪問 Derby 數(shù)據(jù)庫所需的各種組件的每一個步驟。首先要安裝和配置 IBM DB2 ODBC 驅(qū)動程序,以連接和創(chuàng)建 Derby 數(shù)據(jù)庫的數(shù)據(jù)源。接著,將學(xué)習(xí)如何在 Windows 上安裝 Perl、Perl DBI 以及 Perl DBD-ODBC 組件。至此,所有預(yù)備工作便告完成,然后就可以創(chuàng)建訪問 Derby 數(shù)據(jù)庫的 Perl 腳本。本文包括一個示例腳本,用以演示上述過程。
|
本節(jié)中描述的軟件可以免費下載。
安裝下面列出的 某一種數(shù)據(jù)庫:
另外,安裝下面列出的 所有軟件:
|
為了與 Derby 數(shù)據(jù)庫一起使用 IBM DB2 ODBC 驅(qū)動程序,IBM DB2 客戶機軟件需要知道 Derby 數(shù)據(jù)庫所在的位置和名稱,還需要知道它是一個 ODBC 數(shù)據(jù)源。本節(jié)將展示如何通過 編目節(jié)點 來提供所有這些信息。
本節(jié)中的說明作了如下假設(shè):
1527
上。 DB1
的 Derby 數(shù)據(jù)庫。 首先,標識遠程數(shù)據(jù)庫所在的主機和端口。在這里,Derby 數(shù)據(jù)庫運行在本地機器("localhost")上,Network Server 在默認端口 1527
上進行監(jiān)聽。接下來,要為該節(jié)點提供一個名稱,例如 CNS
。
打開 db2cmd
窗口并編目 CNS
節(jié)點,以訪問 localhost
、端口 1527
,如下所示:
db2 catalog tcpip node CNS remote localhost server 1527 |
接下來,提供將在 CNS
節(jié)點上訪問的數(shù)據(jù)庫名,如下所示:
db2 catalog db DB1 at node CNS authentication server |
最后,將數(shù)據(jù)庫編目為一個 ODBC 數(shù)據(jù)源。您可以通過 Windows ODBC Data Source Administrator 或者使用 CLP
命令來完成這項操作,如下所示:
db2 catalog system odbc data source DB1 |
為了檢查上述步驟是否有效,需要發(fā)出以下命令為 DB1
數(shù)據(jù)庫創(chuàng)建 ODBC 數(shù)據(jù)源:
db2 list system odbc data sources |
如果上述步驟有效,那么您將看到 DB1
Data source name existing of type IBM DB2 ODBC DRIVER 的確認。
如果節(jié)點或數(shù)據(jù)庫已經(jīng)被編目,那么上面顯示的命令將失敗。如果遇到錯誤,可使用下面展示的 DB2 UDB 命令取消它們的編目并回到最初:
db2 uncatalog node CNS db2 uncatalog db DB1 |
若需查看對 IBM DB2 UDB catalog
命令的完整描述,請參閱 IBM DB2 Universal Database Command Reference。
確定 ODBC 是否能連接到剛才建立的 Derby 數(shù)據(jù)源 DB1
的一種快捷方法是使用 Windows 中的 ODBC Data Sources 工具。如果是在 Windows XP 中,可以通過 Start --> Control Panel --> Administrative Tools --> Data Sources (ODBC) 來訪問該工具。這將彈出 ODBC Data Source Administrator 窗口。選擇 ‘System DSN’ 標簽頁,如果已經(jīng)正確地編目了 DB1
Data Source,那么可以在這個列表中看到它。
選擇 ‘Name‘ 列下的 DB1,并單擊左邊的‘Configure...’按鈕。您將看到一個類似下圖的窗口。
確保 Cloudscape Network Server 運行在端口為 1527 的本地主機上,填充 ‘User ID‘ 和 ‘Password‘ 的值,然后單擊 Connect 按鈕,以測試到 Cloudscape Data Source ‘DB1‘ 的連接。如果連接成功,系統(tǒng)將彈出一個對話框,通知連接成功。
|
訪問 http://www.perl.org/。選擇 ‘Get Perl‘,然后在 ‘Download Perl Distributions‘ 部分選擇 ‘ActivePerl for Windows,Solaris, Linux‘。在接下來的頁面中單擊 Download 鏈接,進行注冊,然后將 zip 文件下載到一個臨時目錄中。
將 ActivePerl-5.8.4.810-MSWin32-x86.zip 文件解壓到某個目錄中。完成解壓操作之后,運行 installer.bat 文件。不要在已經(jīng)安裝了 5.6 版 ActivePerl 的系統(tǒng)中安裝 5.8.x 版的 ActivePerl。ActivePerl 5.8 解壓后所在的目錄中有一個 RELEASE.txt 文檔,其中包含了關(guān)于安裝 ActiveState Perl 的更多信息。
確保在 PATH 環(huán)境變量的開頭有 Perl 5.8 版本信息。否則,您可以選擇一個更老的 Perl 版本,例如 MKS 包中的那個 Perl 版本。
Perl 的配置至此已告完成?,F(xiàn)在從命令行執(zhí)行一個簡單的腳本來測試安裝是否成功。
|
清單 1 中的代碼是一個簡單的 Perl 腳本,用于測試 Perl 環(huán)境。
# hello-world.pl use strict; print "Where would we be without Hello World?"; |
將清單 1 中的內(nèi)容復(fù)制到名為 hello-world.pl 的文件中,然后將其保存到任何目錄中。在執(zhí)行該腳本之前,應(yīng)確保 perl.exe
在當前路徑中。下面是運行 hello-world.pl 文件的命令以及運行該腳本得到的輸出。
C:\temp>perl hello-world.pl Where would we be without Hello World? |
|
Perl DBI Module 是用于 Perl 的數(shù)據(jù)庫接口。要從 Perl 建立任何到第三方數(shù)據(jù)庫的數(shù)據(jù)庫連接,都需要這個接口。為了下載、安裝和配置該模塊,可以使用剛才安裝的 ActiveState perl 發(fā)行版附帶的 Perl Package Manager (ppm)。ppm 需要訪問 Internet 來下載和安裝這些包。如果已經(jīng)安裝了防火墻軟件,那么可能需要設(shè)置一些環(huán)境變量才能正確使用 ppm。如果必須使用 ppm 變量來安裝 DBI 模塊,那么在安裝說明之后會有關(guān)于這些變量的注意事項。
perl -version
,測試您是否正在使用適當?shù)?perl 版本。如果您安裝了前面提到的版本,那么 perl release 應(yīng)該是 5.8.4。要使本文中的所有步驟都能成功完成,需要安裝 5.6 或更高的版本。 ppm
,進入 ActiveState Perl 附帶的 Perl 包管理器。 install DBI
即可。 下面是安裝了 Perl DBI 的成功 ppm 會話的部分輸出。
ppm> install DBI ==================== Install ‘DBI‘ version 1.43 in ActivePerl 5.8.4.810. ==================== Downloaded 513616 bytes. Extracting 69/69: blib/arch/auto/DBI/Driver_xst.h Installing C:\tools\perl\site\lib\auto\DBI\dbd_xsh.h Installing C:\tools\perl\site\lib\auto\DBI\DBI.bs Installing C:\tools\perl\site\lib\auto\DBI\DBI.dll ... ... ... Installing C:\tools\perl\bin\dbiprof.bat Installing C:\tools\perl\bin\dbiproxy Installing C:\tools\perl\bin\dbiproxy.bat Successfully installed DBI version 1.43 in ActivePerl 5.8.4.810. |
如果正在運行防火墻軟件,并且 ppm 無法下載 Perl Modules,那么可能需要設(shè)置以下環(huán)境變量。
表 1. ppm 無法下載 DBI Module 時所需的環(huán)境變量設(shè)置
set HTTP_proxy=address:port [e.g. 192.0.0.1:8080] |
set HTTP_proxy_user=username |
set HTTP_proxy_pass=password |
set HTTP_proxy_agent=agent [e.g. "Mozilla/5.0"] |
|
要使所有軟件協(xié)同工作,接下來的步驟是安裝將與 DBI 組件一起使用的 DBD-ODBC 驅(qū)動程序。由于在 DB2 Run-time Client 中已包含了對 Derby 數(shù)據(jù)庫中 ODBC 的支持,因此可以使用 DBD-ODBC 驅(qū)動程序與剛才安裝的 DBI 組件進行會話。Perl Package Manager,即 ppm,將再次用于安裝 DBD-ODBC Version 1.1.0。
ppm
。 install DBD-ODBC
。
下面是運行該命名所得到的示例輸出。
ppm> install DBD-ODBC ==================== Install ‘DBD-ODBC‘ version 1.10 in ActivePerl 5.8.4.810. ==================== Downloaded 76744 bytes. Extracting 11/11: blib/arch/auto/DBD/ODBC/ODBC.lib Installing C:\tools\perl\site\lib\auto\DBD\ODBC\ODBC.bs Installing C:\tools\perl\site\lib\auto\DBD\ODBC\ODBC.dll Installing C:\tools\perl\site\lib\auto\DBD\ODBC\ODBC.exp Installing C:\tools\perl\site\lib\auto\DBD\ODBC\ODBC.lib Installing C:\tools\perl\html\site\lib\DBD\ODBC.html Installing C:\tools\perl\html\site\lib\DBD\ODBC\Changes.html Files found in blib\arch: installing files in blib\lib into architecture depende nt library tree Installing C:\tools\perl\site\lib\DBD\ODBC.pm Installing C:\tools\perl\site\lib\DBD\ODBC\Changes.pm Successfully installed DBD-ODBC version 1.10 in ActivePerl 5.8.4.810. |
|
DBI 的架構(gòu)依賴于 DBI 編程接口來將 DBI 調(diào)用轉(zhuǎn)送到 Database Driver,在這里是轉(zhuǎn)送到 DBD-ODBC。使用 DBI 的主要目的之一是使得用于訪問數(shù)據(jù)庫的語法具有獨立性。當 DBI 與適當?shù)尿?qū)動程序一起使用時,可用于通過相同的標準語法訪問多個數(shù)據(jù)庫(甚至可以同時訪問)。
下面的表中列出了一些常見的 DBI 約定和語法。
約定 | 意義 | |
$dbh | 數(shù)據(jù)庫句柄 | |
$sth | 語句句柄 | |
$rc | 通用返回代碼,boolean: true=ok, false=error | |
$rows | 所處理的行數(shù),如果沒有處理行,則為 -1 | |
$sth->Finish() | 在語句句柄使用完畢時調(diào)用的方法 | |
$dbh-> Disconnect() | 斷開和銷毀數(shù)據(jù)庫句柄時調(diào)用的方法 | |
$dbh->do() | 用于非重復(fù)、非 SELECT 語句的方法 | |
$sth->fetchrow_array | 一個實用方法,用于取下一行數(shù)據(jù),并將其以包含各字段值的列表的形式返回 |
|
在運行要連接到 Derby 數(shù)據(jù)庫的 Perl 腳本之前,應(yīng)使用 DB1
數(shù)據(jù)庫和 ij
(Derby SQL 腳本工具)確保到 Derby Network Server 的連接是成功的。如果無法使用 ij
,則 Perl 腳本很可能也無法運行。下面顯示了用來啟動 Network Server 上 ij
的 java
命令,為了便于閱讀,這個命令被分成數(shù)行:
C:\>java -Dij.driver=com.ibm.db2.jcc.DB2Driver -Dij.protocol=jdbc:derby:net://localhost:1527/ -Dij.user=APP -Dij.password=APP org.apache.derby.tools.ij ij version 10.0 (C) Copyright IBM Corp. 1997, 2004. ij> connect ‘DB1‘; |
如果 ij
命令失敗,則應(yīng)該檢查:
如果 ij
測試成功了,那么就可以運行要連接到 Derby 數(shù)據(jù)庫的 perl 腳本。
|
Perl、DBI、DBD-ODBC、ODBC 和 Derby!
本節(jié)將使用在前面已經(jīng)安裝和配置的所有組件。本節(jié)的示例 perl 腳本使用 DBI 調(diào)用 DBD-ODBC perl 驅(qū)動程序,而該驅(qū)動程序又使用 DB2 ODBC 驅(qū)動程序與 Derby Network Server 聯(lián)系,后者連接到 Derby 數(shù)據(jù)庫 DB1
。
下面顯示的清單 2 包含一個示例 Perl 腳本,該腳本創(chuàng)建一個表,將一些行插入表中,并從表中取出一些行,然后刪除該表,并斷開與數(shù)據(jù)庫的連接。其中,名為 DB1
的數(shù)據(jù)庫是早先在 Window 的 ODBC Data Source 管理器中定義的。
將本清單中的內(nèi)容復(fù)制到名為 perlExample.pl
的文件中。
#perlExample.pl use DBI; use strict; my $data_source = "DBI:ODBC:DB1"; my $user = "dbadmin"; my $password = "testpw"; # Create a database connection handle. Autocommit is On. # $DBI::errstr - returns the native database engine error # message from the last DBI method called my $dbh = DBI->connect($data_source, $user, $password, {AutoCommit =>1}) or die "Can‘t connect to $data_source: $DBI::errstr"; # prepare a single CREATE SQL statement my $sql = qq( CREATE TABLE STAFF(name VARCHAR(10),job VARCHAR(10))); # execute the CREATE statement. The do() method can be used for # non repeated non-SELECT statement. $dbh->do($sql); # prepare a single INSERT SQL statement containing literal values. Inserts 2 rows. my $sql = qq(INSERT INTO STAFF( name, job) VALUES ( ‘Pearce‘, ‘Clerk‘), (‘Hachey‘, ‘Mgr‘)); # execute the INSERT statement $dbh->do($sql); # prepare an INSERT SQL statement that contains parameter markers. Inserts one row. # This is an example of a SQL statement being prepared once. The bind values # for each row are provided to the execute method each time it is called. # The statement does not need to be re-prepared for each row. The application # typically runs faster. my $sth = $dbh->prepare(q{INSERT INTO STAFF (name, job) VALUES (‘Smith‘, ?)}) || die $dbh->errstr; # bind the parameter value my $value = "President"; $sth->bind_param(1, $value); # execute the INSERT statement my $rc = $sth->execute or die "Can‘t execute statement: $DBI::errstr"; # prepare a SQL SELECT statement my $sth = $dbh->prepare( q{SELECT name, job FROM STAFF}) or die "Can‘t prepare statement: $DBI::errstr"; # execute the SELECT statement my $rc = $sth->execute or die "Can‘t execute statement: $DBI::errstr"; # Use Statement Handle Attributes, NUM_OF_FIELDS, NAME. # NUM_OF_FIELDS (This attribute is the number of fields (columns) in # the data the prepared statement will return.) # Statements that don‘t return rows of data, like DELETE and CREATE # set the NUM_OF_FIELDS attribute to 0. # NAME (This attribute returns a reference to an array of field names # for each column.) my $name = ""; my $job = ""; print "Query will return $sth->{NUM_OF_FIELDS} fields.\n\n"; print "Field names: @{ $sth->{NAME} }\n"; # The fetchrow_array utility method fetches the next row of data and # returns it as a list containing the field values. while (($name, $job) = $sth->fetchrow_array) { print "$name | $job\n"; } # prepare a SQL DROP statement my $sth = $dbh->prepare( q{ DROP TABLE STAFF; }) or die "Can‘t prepare statement: $DBI::errstr"; # execute DROP statement my $rc = $sth->execute or die "Can‘t execute statement: $DBI::errstr"; # teminate the connection $dbh->disconnect; |
現(xiàn)在打開一個命令窗口,進入 perl.exe
所在路徑,并輸入 perl perlExample.pl
。
如果一切正常,那么應(yīng)該可以看到如下輸出:
C:\perl_test>perl perlExample.pl Query will return 2 fields. Field names: NAME JOB Pearce | Clerk Hachey | Mgr Smith | President |
如果該腳本無法正常運行,那么應(yīng)檢查以下幾項:
|
本文向您展示了如何安裝和配置 Perl,描述了如何為使用 IBM DB2 ODBC 驅(qū)動程序的 ODBC 來編目 Derby 節(jié)點,以及如何安裝 Perl DBI 和 DBD-ODBC 組件,還演示了如何使用 Perl 執(zhí)行基本的數(shù)據(jù)庫操作。
| Moira Casey 是 DB2 領(lǐng)域的咨詢工程師。在過去 6 年的時間里,她一直是一名 DB2 方面的測試工程師,最近才轉(zhuǎn)向 Cloudscape。 |
聯(lián)系客服