Howdy:

I am trying to return an array of 
all records in the subroutine below.

I want to hold all of that info
in one location so that I can use
it (each row and each column of said
row) later in a program.

In the $sql part, I had the 'selectrow_array';
as was noted to me in another email, it returns
ONE row in the array.  But I want to select
ALL of the rows in the query.  So, I got rid
of that and just set up the sql/prepare/execute
part.

According to the DBI book, fetchall_arrayref
can be used to fetch all the data to be returned.
So I thought I could just:

*do my query
*prep and check the query
*execute
*create an empty array
*push each row returned from fetchall_array in 
 to the array
*call the sub routine and do something silly
 like get the 2nd records and 3rd column and
 use it

[snippet of my broken code]

sub getcols {
my ($table)[EMAIL PROTECTED];
my $sql=q(
select
column_name,
nullable,
column_id,
data_type
from
all_tab_columns
where
lower(table_name)='$table'
and
column_id > 0
);

my $sth=$dbh->prepare($sql);
sth->execute();

my @rows;

while (my ($col_name, $nullable, $col_id,
$data_type)=$sql->fetchrow_array()) {
push (@rows, $sql);
}

[/snippet of my broken code]


On the other hand, there is a program that I am
trying to imitate that DOES this very thing:

[snip of working code]

sub getcols {
        my($table)[EMAIL PROTECTED];
return doquery('find rows',"
SELECT   a1.attname, a1.attnotnull, a1.attnum, t.typname, 
a1.attlen, a1.atttypmod, c1.relkind
FROM     pg_class c1,
         pg_attribute a1,
         pg_type t
WHERE    c1.relname='$table'
         and a1.attnum > 0
         and a1.attrelid = c1.oid
         and a1.atttypid = t.oid
ORDER BY upper(attname);
");

}
#--------------- GET THE TARGET TABLE'S VARIABLES
$target=&getcols($opt_t);
if ( $target->ntuples==0 ) {
        print STDERR "Target table $opt_t not found\n";
        exit 1;
}

print "resultstatus=".$result_error{$target->resultStatus}."\n".
        "n= ".$target->ntuples."\n" if $debug;

#--------------- DOES THE SOURCE HAVE THE NECESSARY VARS?
while ( @trow=$target->fetchrow ) {
print "-- $trow[0]\n" if $debug;
        $view=1 if $srow[6] eq 'v';
        if ($trow[0] eq 'user') {
                $cols[$trow[2]-1]=q!'ADMIN'!;
        }
        elsif ($trow[0] eq 'updated') {
                $cols[$trow[2]-1]=q!'now'::datetime!;
     $cols[$trow[2]-1]=q!'now'::datetime!;
        }
        else {
        print "whatever\n";
}
[/snip of working code]

I know this is getting tired, but I would appreciate it
if someone could tell me why the 'broken code' will only
pull back one row and not hold anything into an array to
be used later.

TIA!

-X

Reply via email to