如果结果集只含单个行,则不需要运行循环来获得结果。假设要编写得出历史同盟成员当前数量的脚本count _ member s。完成查询的代码如下所示:
SELECT 语句只返回一行,所以不需要循环;我们只调用fetchrow_array( ) 一次。另外,因为我们只选择一列,所以甚至不需要将返回值分配给数组。当在标量环境中(单个值而不是所期望的一列)调用fetchrow_array( ) 时,它返回这个行的第一列,如果没有更多的有效行,则返回un d e f。
另一种期望最多有一个记录的查询是一个含有LIMIT 1来约束返回的行数的查询。其一般的用法是返回特定列含有最大或最小值的行。例如,下面的查询给出最近出生的总统姓名和出生日期:
必须无提取循环的其他类型的查询利用MAX( ) 或MIN( ) 来选择单个值。但是在所有这些情况下,获得单个行结果的一种更容易的方法就是使用数据库句柄方法selectrow_array( ),它结合了prepare( )、execute( ) 并在单个调用中提取行。它返回一个数组(而不是一个引用),如果出现错误,则返回一个空数组。前一例子可利用selectrow_array( ) 编写如下:
4. 处理完整的结果集
在使用提取循环时, DBI 不提供在结果集中随意查找的方法,或以任何次序而不是以循环返回的次序来处理行。同样,提取行以后,如果没有保存,前一行会丢失。这种做法并不一定合适以下情况:
以非连续的次序处理行。考虑一种情况,想以历史同盟的president 表中列出的美国总统为主体,进行一些测验。如果希望每次测验时都以不同的次序提出问题,则可以从president 表中选择所有行。然后,可能以任意的次序提取行来改变与所问问题有关的总统的次序。要想任意地提取一行,就必须同时访问所有的行。
只使用返回行的子集,对其进行随机选择。例如,当问及总统出生地时,要想出现多个选择的问题,则可以随便地提取一行来选择总统(正确的答案),然后再从取来干扰的选择中提取若干其他行。
即使确实以连续的次序去处理,也想紧紧抓住整个结果集。如果想经过这些行进行多个传递,这可能是必需的。例如,在统计计算中,可能先浏览一遍结果集,来估计数据的一些通用数字属性,然后再次检查这些行,来实现更加明确的分析。
可以用几个不同的方式作为一个整体访问结果集。可以完成这个常见的提取循环,并在提取它时保存每一行,可以使用一次返回整个结果集的方法。无论哪种方法都以在结果集中包括一行一行的矩阵作为结束,和选择的列一样多。可以以任何次序任意多次地处理矩阵的
元素。下面的讨论说明这两种方法。
使用提取循环来捕获结果集的一种方法是使用fetchrow_array( ) 并保存对这些行引用的数组。除了保存所有的行,然后显示矩阵举例说明了如何确定矩阵中的行数和列数,及如何访问矩阵的个别成员以外,下面的代码和dump_members 中提取和显示的循环作用是一样的。
上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17] 下一页
Tag:数据库教程,sql数据库教程,access数据库教程,电脑教学 - 数据库教程