要使用 Perl 访问数据库,就需要用到 Perl 数据库接口( DBI),这是用于 Perl 的一个开源组件。DBI 支持 Perl 与第三方数据库的集成,例如 IBM® Cloudscape™ 或 Derby。DBI 定义了访问数据库的方法、变量以及约定。为了访问特定的数据库,除了需要 DBI 之外,还需要一个 Perl Database Driver (DBD)。有多种可用于各种数据库的 DBD,要访问某一个数据库,需要同时使用 DBI 和特定于数据库的 DBD。使用 Perl 访问数据库的另一种方法是使用 DBI 和 DBD-ODBC 模块,后者使用 ODBC,而不是使用本地的 DBD。目前还没有专用于 Derby 的 DBD,因此,访问 Derby 数据库时需要使用 DBD-ODBC 模块。Derby 通过 IBM DB2™ Run-time Client 获得 ODBC 支持。
IBM Cloudscape 是 Apache Derby 开源数据库的商业发行版。
Perl 是一种通用的、功能强大的脚本语言,常用于 Web 开发。利用 Perl 中提供的对数据库的支持,可以很容易地从 Perl 访问 Derby 数据库。通过使用 ODBC 以及 Perl DBI 和 DBD-ODBC 模块,就可以从 Perl 访问 Derby 数据库。
在本文中,您将亲历安装和配置用 Perl 访问 Derby 数据库所需的各种组件的每一个步骤。首先要安装和配置 IBM DB2 ODBC 驱动程序,以连接和创建 Derby 数据库的数据源。接着,将学习如何在 Windows 上安装 Perl、Perl DBI 以及 Perl DBD-ODBC 组件。至此,所有预备工作便告完成,然后就可以创建访问 Derby 数据库的 Perl 脚本。本文包括一个示例脚本,用以演示上述过程。
![]() ![]() |
![]()
|
本节中描述的软件可以免费下载。
安装下面列出的 某一种数据库:
另外,安装下面列出的 所有软件:
![]() ![]() |
![]()
|
为了与 Derby 数据库一起使用 IBM DB2 ODBC 驱动程序,IBM DB2 客户机软件需要知道 Derby 数据库所在的位置和名称,还需要知道它是一个 ODBC 数据源。本节将展示如何通过 编目节点 来提供所有这些信息。
本节中的说明作了如下假设:
1527
上。 DB1
的 Derby 数据库。 首先,标识远程数据库所在的主机和端口。在这里,Derby 数据库运行在本地机器("localhost")上,Network Server 在默认端口 1527
上进行监听。接下来,要为该节点提供一个名称,例如 CNS
。
打开 db2cmd
窗口并编目 CNS
节点,以访问 localhost
、端口 1527
,如下所示:
db2 catalog tcpip node CNS remote localhost server 1527 |
接下来,提供将在 CNS
节点上访问的数据库名,如下所示:
db2 catalog db DB1 at node CNS authentication server |
最后,将数据库编目为一个 ODBC 数据源。您可以通过 Windows ODBC Data Source Administrator 或者使用 CLP
命令来完成这项操作,如下所示:
db2 catalog system odbc data source DB1 |
为了检查上述步骤是否有效,需要发出以下命令为 DB1
数据库创建 ODBC 数据源:
db2 list system odbc data sources |
如果上述步骤有效,那么您将看到 DB1
Data source name existing of type IBM DB2 ODBC DRIVER 的确认。
如果节点或数据库已经被编目,那么上面显示的命令将失败。如果遇到错误,可使用下面展示的 DB2 UDB 命令取消它们的编目并回到最初:
db2 uncatalog node CNS db2 uncatalog db DB1 |
若需查看对 IBM DB2 UDB catalog
命令的完整描述,请参阅 IBM DB2 Universal Database Command Reference。
确定 ODBC 是否能连接到刚才建立的 Derby 数据源 DB1
的一种快捷方法是使用 Windows 中的 ODBC Data Sources 工具。如果是在 Windows XP 中,可以通过 Start --> Control Panel --> Administrative Tools --> Data Sources (ODBC) 来访问该工具。这将弹出 ODBC Data Source Administrator 窗口。选择 ‘System DSN’ 标签页,如果已经正确地编目了 DB1
Data Source,那么可以在这个列表中看到它。
选择 ‘Name‘ 列下的 DB1,并单击左边的‘Configure...’按钮。您将看到一个类似下图的窗口。
确保 Cloudscape Network Server 运行在端口为 1527 的本地主机上,填充 ‘User ID‘ 和 ‘Password‘ 的值,然后单击 Connect 按钮,以测试到 Cloudscape Data Source ‘DB1‘ 的连接。如果连接成功,系统将弹出一个对话框,通知连接成功。
![]() ![]() |
![]()
|
访问 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 文件。不要在已经安装了 5.6 版 ActivePerl 的系统中安装 5.8.x 版的 ActivePerl。ActivePerl 5.8 解压后所在的目录中有一个 RELEASE.txt 文档,其中包含了关于安装 ActiveState Perl 的更多信息。
确保在 PATH 环境变量的开头有 Perl 5.8 版本信息。否则,您可以选择一个更老的 Perl 版本,例如 MKS 包中的那个 Perl 版本。
Perl 的配置至此已告完成。现在从命令行执行一个简单的脚本来测试安装是否成功。
![]() ![]() |
![]()
|
清单 1 中的代码是一个简单的 Perl 脚本,用于测试 Perl 环境。
# hello-world.pl use strict; print "Where would we be without Hello World?"; |
将清单 1 中的内容复制到名为 hello-world.pl 的文件中,然后将其保存到任何目录中。在执行该脚本之前,应确保 perl.exe
在当前路径中。下面是运行 hello-world.pl 文件的命令以及运行该脚本得到的输出。
C:\temp>perl hello-world.pl Where would we be without Hello World? |
![]() ![]() |
![]()
|
Perl DBI Module 是用于 Perl 的数据库接口。要从 Perl 建立任何到第三方数据库的数据库连接,都需要这个接口。为了下载、安装和配置该模块,可以使用刚才安装的 ActiveState perl 发行版附带的 Perl Package Manager (ppm)。ppm 需要访问 Internet 来下载和安装这些包。如果已经安装了防火墙软件,那么可能需要设置一些环境变量才能正确使用 ppm。如果必须使用 ppm 变量来安装 DBI 模块,那么在安装说明之后会有关于这些变量的注意事项。
perl -version
,测试您是否正在使用适当的 perl 版本。如果您安装了前面提到的版本,那么 perl release 应该是 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,那么可能需要设置以下环境变量。
表 1. ppm 无法下载 DBI Module 时所需的环境变量设置
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"] |
![]() ![]() |
![]()
|
要使所有软件协同工作,接下来的步骤是安装将与 DBI 组件一起使用的 DBD-ODBC 驱动程序。由于在 DB2 Run-time Client 中已包含了对 Derby 数据库中 ODBC 的支持,因此可以使用 DBD-ODBC 驱动程序与刚才安装的 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 的架构依赖于 DBI 编程接口来将 DBI 调用转送到 Database Driver,在这里是转送到 DBD-ODBC。使用 DBI 的主要目的之一是使得用于访问数据库的语法具有独立性。当 DBI 与适当的驱动程序一起使用时,可用于通过相同的标准语法访问多个数据库(甚至可以同时访问)。
下面的表中列出了一些常见的 DBI 约定和语法。
约定 | 意义 | |
$dbh | 数据库句柄 | |
$sth | 语句句柄 | |
$rc | 通用返回代码,boolean: true=ok, false=error | |
$rows | 所处理的行数,如果没有处理行,则为 -1 | |
$sth->Finish() | 在语句句柄使用完毕时调用的方法 | |
$dbh-> Disconnect() | 断开和销毁数据库句柄时调用的方法 | |
$dbh->do() | 用于非重复、非 SELECT 语句的方法 | |
$sth->fetchrow_array | 一个实用方法,用于取下一行数据,并将其以包含各字段值的列表的形式返回 |
![]() ![]() |
![]()
|
在运行要连接到 Derby 数据库的 Perl 脚本之前,应使用 DB1
数据库和 ij
(Derby SQL 脚本工具)确保到 Derby Network Server 的连接是成功的。如果无法使用 ij
,则 Perl 脚本很可能也无法运行。下面显示了用来启动 Network Server 上 ij
的 java
命令,为了便于阅读,这个命令被分成数行:
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
命令失败,则应该检查:
如果 ij
测试成功了,那么就可以运行要连接到 Derby 数据库的 perl 脚本。
![]() ![]() |
![]()
|
Perl、DBI、DBD-ODBC、ODBC 和 Derby!
本节将使用在前面已经安装和配置的所有组件。本节的示例 perl 脚本使用 DBI 调用 DBD-ODBC perl 驱动程序,而该驱动程序又使用 DB2 ODBC 驱动程序与 Derby Network Server 联系,后者连接到 Derby 数据库 DB1
。
下面显示的清单 2 包含一个示例 Perl 脚本,该脚本创建一个表,将一些行插入表中,并从表中取出一些行,然后删除该表,并断开与数据库的连接。其中,名为 DB1
的数据库是早先在 Window 的 ODBC Data Source 管理器中定义的。
将本清单中的内容复制到名为 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; |
现在打开一个命令窗口,进入 perl.exe
所在路径,并输入 perl perlExample.pl
。
如果一切正常,那么应该可以看到如下输出:
C:\perl_test>perl perlExample.pl Query will return 2 fields. Field names: NAME JOB Pearce | Clerk Hachey | Mgr Smith | President |
如果该脚本无法正常运行,那么应检查以下几项:
![]() ![]() |
![]()
|
本文向您展示了如何安装和配置 Perl,描述了如何为使用 IBM DB2 ODBC 驱动程序的 ODBC 来编目 Derby 节点,以及如何安装 Perl DBI 和 DBD-ODBC 组件,还演示了如何使用 Perl 执行基本的数据库操作。
![]() | ||
| ![]() | Moira Casey 是 DB2 领域的咨询工程师。在过去 6 年的时间里,她一直是一名 DB2 方面的测试工程师,最近才转向 Cloudscape。 |
联系客服