How is this different to
$dbh->selectall_arrayref($sql, { Slice => {} });
If it isn't, then perhaps you could offer a patch to the docs to make it
easier for people to see that selectall_arrayref can return an array of
has refs.
Tim.
On Thu, Dec 22, 2005 at 06:15:32PM -0800, Mark Hedges wrote:
>
> I find this function useful and I'm tired of retyping it on
> every project.
>
> Sometimes I need to preserve the order from an ORDER BY or GROUP
> BY clause, but I want to use selectall_arrayref for convenience.
> Only then, I have to know the order of the field names.
>
> This routine returns an arrayref of each row as returned by
> fetchrow_hashref(). So each item in the array is a hash.
>
> Makes it easy to do transformations like:
>
> my $sql = q{ SELECT * FROM sites WHERE url like '%.org' };
>
> my $dot_orgs = $dbh->selectall_arrayref_hashrefs( $sql );
>
> if ($want_to_download_excel) {
> my $uri = generate_chart( $dot_orgs );
> forward_browser_to( $uri );
> }
> else {
> # ***
> print_autotable([
> map { $_->{url} = make_link( $_->{url} ) } @{$dot_orgs}
> ]);
> }
>
> # make_link wraps the url in an <a href...>
>
> Well, no one's under any obligation of course, just thought I'd see
> what people think.
>
> Mark Hedges
Content-Description: selectall_arrayref_hashrefs.patch
> Index: DBI.pm
> ===================================================================
> --- DBI.pm (revision 2322)
> +++ DBI.pm (working copy)
> @@ -31,6 +31,7 @@
> $rv = $dbh->do($statement, \%attr, @bind_values);
>
> $ary_ref = $dbh->selectall_arrayref($statement);
> + $ary_ref = $dbh->selectall_arrayref_hashrefs($statement);
> $hash_ref = $dbh->selectall_hashref($statement, $key_field);
>
> $ary_ref = $dbh->selectcol_arrayref($statement);
> @@ -405,6 +406,7 @@
> selectrow_arrayref=>{U =>[2,0,'$statement [, \%attr [, @bind_params ]
> ]'], O=>0x2000 },
> selectrow_hashref=>{ U =>[2,0,'$statement [, \%attr [, @bind_params ]
> ]'], O=>0x2000 },
> selectall_arrayref=>{U =>[2,0,'$statement [, \%attr [, @bind_params ]
> ]'], O=>0x2000 },
> + selectall_arrayref_hashrefs=>{U =>[2,0,'$statement [, \%attr [,
> @bind_params ] ]'], O=>0x2000 },
> selectall_hashref=>{ U =>[3,0,'$statement, $keyfield [, \%attr [,
> @bind_params ] ]'], O=>0x2000 },
> selectcol_arrayref=>{U =>[2,0,'$statement [, \%attr [, @bind_params ]
> ]'], O=>0x2000 },
> ping => { U =>[1,1], O=>0x0404 },
> @@ -1594,6 +1596,33 @@
> return $rows;
> }
>
> + # select an arrayref, but each row is hashref returned by
> fetchrow_hashref
> + sub selectall_arrayref_hashrefs {
> + my ($dbh, $stmt, $attr, @bind) = @_;
> + my $max_rows = delete $attr->{MaxRows};
> + my $sth = (ref $stmt) ? $stmt : $dbh->prepare($stmt, $attr);
> + return unless $sth;
> + $sth->execute(@bind) || return;
> + my @rows = undef;
> + if (defined $max_rows) {
> + @rows = (undef)x$max_rows;
> + ROW:
> + for (my $i = 0; $i <= $max_rows; $i++) {
> + $rows[$i] = $sth->fetchrow_hashref();
> + }
> + $sth->finish();
> + }
> + else {
> + @rows = ( );
> + while ( my $row = $sth->fetchrow_hashref() ) {
> + push @rows, $row;
> + }
> + }
> +
> + return [EMAIL PROTECTED];
> + }
> +
> +
> sub selectall_hashref {
> my ($dbh, $stmt, $key_field, $attr, @bind) = @_;
> my $sth = (ref $stmt) ? $stmt : $dbh->prepare($stmt, $attr);
> @@ -4014,7 +4043,26 @@
> In which case the array is copied and each value decremented before
> passing to C</fetchall_arrayref>.
>
> +=item C<selectall_arrayref_hashrefs>
>
> + $ary_ref = $dbh->selectall_arrayref_hashref($statement);
> + $ary_ref = $dbh->selectall_arrayref_hashref($statement, \%attr);
> + $ary_ref = $dbh->selectall_arrayref_hashref($statement, \%attr,
> @bind_vals);
> +
> +This utility method does L</prepare>, L</execute> and then returns
> +an arrayref of each row of data fetched, but the contents of each array
> +element is the result of L</fetchrow_hashref>.
> +
> +The C<$statement> parameter can be a previously prepared statement handle,
> +in which case the C<prepare> is skipped. This is recommended if the
> +statement is going to be executed many times.
> +
> +L</selectall_arrayref_hashrefs>
> +supports a $max_rows parameter. You can specify a value for $max_rows
> +by including a 'C<MaxRows>' attribute in \%attr. In which case finish()
> +is called for you.
> +
> +
> =item C<selectall_hashref>
>
> $hash_ref = $dbh->selectall_hashref($statement, $key_field);