清单 14. 聚合结果值
$perl test_return_value.pl
The biggest salary is: 52750.00
|
从数据库中检索数据 —— 多个结果
从数据库中返回一个结果集(即多个结果)到 Perl 程序中的技术与前面所采用的技术非常类似。在准备并执行返回多个结果的 SQL 语句并将返回值(列)绑定到本地变量上之后,可能需要使用 $sth->fetch 方法来检索这些值。为了展示这个方法是怎么样工作的,下面让我们从 PT_ADDR_BOOK 表中检索出 phone 和 name 列的内容。清单 15 给出了使用一个循环来使用 $sth_fetch 方法的用法:
清单 15. 从数据库中检索多个值
$stmt = "SELECT name, phone from PT_ADDR_BOOK";
$sth = $dbh->prepare($stmt);
$sth->execute();
#associate variables with output columns...
$sth->bind_col(1,\$name);
$sth->bind_col(2,\$phone);
print "NAME PHONE \n";
print "------------------------- -----------\n";
while ($sth->fetch) {
print $name ;
print $phone; print "\n"; }
print "DONE \n";
$sth->finish();
|
执行这段代码的结果如下:
清单 16. 从数据库中检索多个值
C:\Dev_POT\PERL\Labs>perl multi.pl
NAME PHONE
------------------------- -----------
JOHN SMITH 9145556677
STEVE BROWN 7184358769
DONE
|
也可以使用 $sth->fetchrow 方法从结果集中检索数据。$sth ->fetch 方法会将每个值作为单独一项返回,而 $sth ->fetchrow() 方法则将一行作为一个数组返回,每列的值都是该数组中的一个元素。
可以使用 fetchrow 方法编写功能相同的 Perl 程序,如下所示:
清单 17. 从数据库中检索多个值
$stmt = "SELECT name, phone from PT_ADDR_BOOK";
$sth = $dbh->prepare($stmt);
$sth->execute();
print "NAME PHONE \n";
print "------------------------- -----------\n";
while (($name, $phone) = $sth->fetchrow())
{ print "$name $phone\n"; }
|
我们可以从 实验 3 开始编写并执行一个 Perl 程序,它可以创建一个 DB2 表,向该表中插入一些数据,并返回插入该表中的行数。
调用存储过程
下面让我们来创建一个多个步骤的场景,从而详细了解一下怎么样从 Perl 程序中调用 DB2 的存储过程。首先,创建一个简单的存储过程 SP_GET_LOC,它从表 ORG 中返回某个给定部门的位置(步骤 1)。
清单 18. 步骤 1:创建存储过程
create procedure sp_get_loc (in deptin int, out loc varchar(13))
begin
select location into loc from org where deptnumb = deptin;
end @
|
请注意,这个存储过程有一个输入参数和一个输出参数。当我们在 DB2 的命令行处理器(CLP)中运行这个过程时,它对部门 10 会返回位置 NEW YORK。
清单 19. 步骤 2:运行存储过程
$db2 "call sp_get_loc(10,?)"
Value of output parameters
--------------------------
Parameter Name : LOC
Parameter Value : New York
Return Status = 0
|
下面让我们来编写一个简单的 Perl 程序来调用存储过程 SP_GET_LOC(步骤 3,请参看 清单 20)。我们的动态 SQL 语句实际上与在 DB2 CLP 中执行的语句相同,形式为 SP_GET_LOC(?,?),不过在 CLP 中是传递硬编码的 10(部门编号),在动态 SQL 语句中将使用一个参数标记。采用这种方法,就可以对 ORG 表的部门编号列的任何值查询位置了。
在构造 SQL 语句之后,剩下的步骤就与其他具有参数标记的动态语句完全相同了。可以使用 $sth = $dbh->prepare 方法进行准备。使用 $sth->bind_param 方法将部门编号绑定为输入参数,使用 $sth->bind_param_inout 方法将返回的位置绑定为输出参数,然后再执行动态 SQL 语句。
该程序如下:
清单 20. 步骤 3:调用存储过程
#!/usr/bin/perl -w
use DBI;
use DBD::DB2::Constants;
$dbh = DBI->connect("dbi:DB2:sample","","") or
die "Can't connect to sample database: $DBI::errstr";
# Prepare our call statement
$sth = $dbh->prepare( "CALL SP_GET_LOC(?,?)" );
# Bind input parameter for department number
$sth->bind_param(1, 10);
# Bind output parameter - location
$sth->bind_param_inout (2, \$location, 13, db2_param_type=>SQL_PARAM_OUTPUT});
# Call the stored procedure
$sth->execute();
printf("Stored procedure returned location: %s\n", $location);
$sth->finish();
$dbh->disconnect;
如果您对本文有任何疑问或者建议,请到讨论区发表您的意见:
>>
论坛入口 <<
上一篇:基于DB2的数据库应用系统的性能优化 下一篇:IBM DB2数据库日常维护小常识
【文章评论】
【收藏本文】
【推荐好友】
【打印本文】
【我要投稿】 【论坛讨论】
更多相关文章
|
|