fetchow_arrayef( ) 不适合在列表中提取变量。例如,下面的循环不起作用:
实际上,只要fetchrow_arrayref( ) 提取一行,这个循环就能正确地运行。但是在没有更多的行时, fetchrow_arrayref( ) 返回un d e f,并且@{undef} 不合法(它有些像在C 程序中试图废弃一个NULL 指针)。
提取行的第三个方法fetchrow_hashref( ),如下使用:
对fetchrow_hashref( ) 的每个调用都返回一个按列名索引的行值散列的引用,在没有更多的行时,返回un d e f。在此情况下,列值不按特定的次序出现; Perl 散列的成员是无序的。然而,散列元素是按列名索引的,所以$hashref 提供了一个单独的变量,可通过它按名称访问任何列值。这使得能按任意需要的次序来提取值(或者它们中的任何子集),而且不必知道SELECT 查询检索的列的次序。例如,如果想访问名称和电子邮件域,可以如下进行:
如果希望将一行值传递给某个函数而又不需要这个函数知道SELECT 语句中指定列的次序时,fetchrow_hashref( ) 是非常有用的。既然如此,可以调用fetchrow_hashref( ) 来检索行,并且编写一个使用列名访问来自行散列值的函数。
如果使用fetchrow_hashref( ),请记住下列警告:
如果性能很重要,则fetchrow_hashref( ) 并不是最好的选择,因为它没有fetchrow_array( ) 或fetchrow_arrayref( ) 的效率高。
作为散列键值使用的列名具有与SELECT 语句中写出时相同的字符。在MySQL中,列名不区分大小写,所以此查询也是这样,不管以大写字母还是小写字母给出列名,查询结果都是一样的。但是Perl 散列索引名是区分大小写的,这可能会带来一些问题。为了避免潜在的大小写不匹配问题,可通过传递NAME_lc 或NAME_uc 属性,告知fetchrow_hashref( ) 强迫列名为大写或小写:
散列对每个唯一的列名含有一个元素。如果正在执行从多个具有重叠名称的表中返回列的连接,则不能访问所有的列值。例如,如果发布下面的查询, fetchrow_hashref( )将返回只有一个元素的散列:
SELECT a.name FROM a,b WHERE a.name=b.name
2. 确定查询返回的行数
如何知道SELECT 或类似于SELECT 的查询返回的行数?一种方法是,当提取它们时,计算这些行的数量。实际上,这是知道SELECT 查询返回多少行的唯一方便的方法。使用MySQL驱动程序,可以在调用execute( ) 后利用语句句柄调用rows( ) 方法,但是这对其他数据库引擎并不方便。而且即使就MySQL来说,如果已经设置了mysql_use_result 属性,rows( ) 也不能返回正确的结果,直到提取了所有行(有关的详细信息,请参阅附录G)。所以只能如提取行一样对它们进行计数。
3. 提取单行的结果
上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17] 下一页
Tag:数据库教程,sql数据库教程,access数据库教程,电脑教学 - 数据库教程