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

通过Perl 编程访问DB2数据库

来源:IBM DW中国 作者:Marina Greenstein  时间:2007-04-22 点击: [收藏] [投稿]

如果执行这个程序,就会看到给定部门(本例中为 10)的 LOCATION:


清单 21. 步骤 4:执行调用 DB2 存储过程的 Perl 程序

$perl test_call_sp.pl
Stored Procedure returned location: New York

大对象的操作

使用 Perl 来处理文件比使用其他更复杂的语言(例如 C 或 Java®)都要简单。下面我们就会看到怎么样将数据直接从文件中导入 DB2 的大对象数据(LOB)列中。插入大对象数据的最有效的方法是,将这个文件直接绑定到 DB2 表中一个与 LOB 类型的列相关联的输入参数上。Perl 驱动程序可以直接从文件中读取数据,并将数据传递给数据库服务器。要将一个文件绑定到某个输入 LOB 参数上,可以在执行 INSERT 操作过程中使用 bind_param 方法来指定 { db2_file => 1} 参数属性。

在我们的数据库模式 POT 下面有一个表 MAP。这个表有一个 picture 列,它被声明成 BLOB 类型的,用来存放某个地区的图像。下面是创建该表所使用的 DDL:


清单 22. 创建 MAP 表使用的 DDL

 create table POT.MAPS
( map_id           INT,
  map_name     VARCHAR(13),
  area                 INT ,
  photo_format CHAR(3),
  picture            BLOB) ;

另外,我们还有一个文件 pearcson.jpg,其中包含了 Pearson Airport 的地图。


图 3. 示例地图
示例地图

现在让我们来编写一个程序,向表 POT.MAP 中插入一行数据,即将 JPG 文件的图像插入到 PICTURE 中。首先,需要构造一个具有 5 个参数标记的动态 SQL 语句。然后,需要对这条语句进行准备。在将参数绑定到准备好的语句上之前,需要指定包含要插入的图像的文件名,并将其赋给一个本地 Perl 变量($picture_file)。现在可以将所有参数全部绑定到需要插入到 MAP 表中的值上。请注意,我们为最后一个参数指定了 db2_file =>1 属性。最后一个步骤是执行这条 INSERT 语句。这个程序的代码如下:


清单 23. 插入 LOB

#!/usr/bin/perl -w
use DBI;
use DBD::DB2::Constants;

%conattr = (   AutoCommit             => 1,                                    
			# Turn Autocommit On
                       db2_info_applname  => 'Maps Module', );           
                        # Identify this appl

$dbh = DBI->connect("dbi:DB2:sample","", "",\%conattr) or die "$DBI::errstr";
$dbh->do("SET CURRENT SCHEMA POT");

$sql = "INSERT INTO MAPS(map_id, map_name, area, photo_format, picture)
                                                                                                         
          VALUES(?,?,?,?,?)";

$sth = $dbh->prepare($sql);
$picture_file = "pearson.jpg";           # File containing our picture
$sth->bind_param(1, 100);                # map_id
$sth->bind_param(2, "Pearson airport");  # map_name
$sth->bind_param(3, 416);                # area
$sth->bind_param(4, "JPG");              # photo_format
$sth->bind_param(5, $picture_file, {db2_file => 1});

$rows_affected = $sth->execute();
printf("%d rows affected", $rows_affected);
$sth->finish();
$dbh->disconnect;

从数据库中读取 LOB 数据

可以使用标准的 fetch 方法来检索 LOB 数据,例如 fetchrow_arrayfetchrow_arrayref。DBI 让我们可以使用 LongReadLen 连接属性来设置每次 fetch 可以检索的最大字节数。对于 LOB 列来说,缺省值为 32,700 个字节。要实现这种功能,需要执行以下步骤:

  1. 构造 SQL 语句从 MAP 表中选择 picture 列的数据。
  2. 准备 SQL 语句。
  3. 为保存所检索到的图像使用的文件分配一个名字。
  4. 打开该文件。
  5. 执行这条 SQL 语句。
  6. 使用 fetch 方法将结果取到文件中。

下面是展示怎么样从数据库中检索 LOB 数据的代码:


清单 24. 从数据库中读取 LOB 数据

 #!/usr/bin/perl
use DBI;
use DBD::DB2::Constants;
%conattr =
(
   AutoCommit             => 1,                                
		   # Turn Autocommit On
   db2_info_applname  => 'Maps Module',          
			   # Identify this appl
   LongReadLen           => 80000                         
		   # Don't retrieve LOBs
);
# Connect to our database
$dbh = DBI->connect("dbi:DB2:sample","", "",\%conattr) or
                   die "$DBI::errstr";

# Set the current schema to 'POT'
$dbh->do("SET CURRENT SCHEMA POT");
$sql = "SELECT picture FROM maps WHERE map_name ='Pearson airport'";

# Prepare the statement
$sth = $dbh->prepare($sql);
# Open output file
$out_file = "mypic.jpg";
open(OUTPUT, ">$out_file") or die "Cannot open $out_file because $!";
binmode OUTPUT;
$sth->execute;
@row = $sth->fetchrow;
print OUTPUT $row[0];
@row = "";
close(OUTPUT);
print “Picture in the file $out_file\n"; 
$sth->finish();
$dbh->disconnect;


 如果您对本文有任何疑问或者建议,请到讨论区发表您的意见: >> 论坛入口 <<



上一篇:基于DB2的数据库应用系统的性能优化   下一篇:IBM DB2数据库日常维护小常识

文章评论】 【收藏本文】 【推荐好友】 【打印本文】 【我要投稿】 【论坛讨论
更多相关文章
Power by linux-cn.com 粤ICP备05006655号