Linux中国 Linux中国门户站!
设为主页 设为主页
收藏本站 收藏本站
 
当前位置 :首页 ->数据库应用 ->DB2 ->正文

通过Perl 编程访问DB2数据库

来源:IBM DW中国 作者:Marina Greenstein  时间:2007-04-22 点击: [收藏] [投稿]
清单 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数据库日常维护小常识

文章评论】 【收藏本文】 【推荐好友】 【打印本文】 【我要投稿】 【论坛讨论
更多相关文章