下面的脚本dump_members2 举例说明了当要自己检查错误并显示自己的消息时,如何编写脚本。dump_member2 处理和dump_members 一样的查询,但是明确地禁用PrintError 和R a i s e E r r o r,然后测试每个DBI 调用的结果。如果出现错误,在退出以前,脚本调用了子例程bail_out( ) 显示消息及$DBI::err 和$DBI::errstr 的内容:
除了bail_out( ) 是退出而不是返回到调用者以外, bail_out( ) 类似于我们在第6章中为编写C 程序使用的print_error( ) 函数。每次想显示错误消息时, bail_out( ) 解除了写出$DBI::err 和$DBI::errstr 名称的麻烦。同样,通过封装显示到子例程的错误消息,可更改子例程使整个脚本中错误消息的格式一致。
dump_member2 脚本在提取行循环的后面有一个测试,这是dump_members 所没有的。因为如果在fetchrow_array( ) 中出现错误,dump_members2 不会自动地退出,所以人们判断循环是因为结果集读取完成而终止(正常终止),还是因为出现错误而终止做出确定是很困难的。当然,任何一种方式,循环都将终止,但是如果出现错误,则将删截脚本的输出。如果没有错误检查,运行该脚本的人将无法知道是否有错!如果自己检查错误,应该检查提取循环的结果。
处理不返回结果集的查询
D E L E T E、INSERT、REPLACE和UPDATE等执行后不返回行的语句比S E L E C T、DESCRIB、EXPLAIN 和SHOW 等执行后返回行的语句的处理相对要容易一些。为处理一条非SELECT 语句,利用数据库句柄,将它传递给do( )。do( ) 方法在一个步骤内准备和执行该查询。例如,开始输入一个新的成员, Marcis Brown,终止日期为2002 年6 月3 日,可以这样做:
do( ) 方法返回涉及行的计数,如果出现错误,则返回un d e f。因为各种原因,可能出现错误(例如,这个查询可能是畸形的,或可能没有访问这个表的权力)。对于非undef 的返回,注意那些没有受到影响的行的情况。当这种情况发生时, do( ) 不返回数字0;而是返回字符串“0 E 0”(0的Perl科学计数法形式)。“0 E 0”在数值上等价于0,但是,在条件测试中将其视为真,以便可以将其与早期的undef 区别。如果do( ) 返回0,则区分是出现了错误( un d e f)还是“没有受到影响的行”这两种情况将更困难。使用下面的两个测试之一可以检查错误:
if (!defined ($rows)){#error}
if (!$rows) {#error}
在数值环境中,“0 E 0”与0 等价。下面的代码将正确地显示$rows 的任何非undef 值的行数:
也可以用printf( ) 使用‘% d’格式显示$row 来强制进行隐含的数字转换:
上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17] 下一页
Tag:数据库教程,sql数据库教程,access数据库教程,电脑教学 - 数据库教程