Perl DBI fetchRow dinamica cicli while
-
22-08-2019 - |
Domanda
Sto cercando di passare i nomi di tabella ad un sub che ottiene tutti i nomi dei campi di quel tavolo, li memorizza in un array, e quindi utilizza tale matrice in combinazione con il fetchRow di un'altra query SQL per visualizzare i dati in quelle campi. Ecco il codice che ho adesso:
Esempi di chiamate sub con nomi di tabella come il parametro:
shamoo("reqhead_rec");
shamoo("approv_rec");
shamoo("denial_rec");
shamoo sub:
sub shamoo
{
my $table = shift;
print uc($table)."\n=====================================\n";
#takes arg (table name) and stores all the field names into an array
$STMT = <<EOF;
select first 1 * from $table
EOF
my $sth = $db1->prepare($STMT);$sth->execute;
my ($i, @field);
my $columns = $sth->{NAME_lc};
while (my $row = $sth->fetch){for $i (0 .. $#$row){$field[$i] = $columns->[$i];}}
$STMT = <<EOF;
select * from $table where frm = '$frm' and req_no = $req_no
EOF
$sth = $db1->prepare($STMT);$sth->execute;
$i=0;
while ($i!=scalar(@field))
{
#need code for in here...
}
}
Sto cercando un modo per trasformare questo nto qualcosa che non deve essere esplicitamente definito ....
my ($frm, $req_no, $auth_id, $alt_auth_id, $id_acct, $seq_no, $id, $appr_stat, $add_date, $approve_date, $approve_time, $prim);
while(($frm, $req_no, $auth_id, $alt_auth_id, $id_acct, $seq_no, $id, $appr_stat, $add_date, $approve_date, $approve_time, $prim) = $sth->fetchrow_array())
Soluzione
Utilizzare fetchrow_hashref:
sub shamoo {
my ($dbh, $frm, $req_no, $table) = @_;
print uc($table), "\n", "=" x 36, "\n";
#takes arg (table name) and stores all the field names into an array
my $sth = $dbh->prepare(
"select * from $table where frm = ? and req_no = ?"
);
$sth->execute($frm, $req_no);
my $i = 1;
while (my $row = $sth->fetchrow_hashref) {
print "row ", $i++, "\n";
for my $col (keys %$row) {
print "\t$col is $row->{$col}\n";
}
}
}
Si consiglia inoltre di impostare FetchHashKeyName
a "NAME_lc"
o "NAME_uc"
quando si crea la maniglia del database:
my $dbh = DBI->connect(
$dsn,
$user,
$pass,
{
ChopBlanks => 1,
AutoCommit => 1,
PrintError => 0,
RaiseError => 1,
FetchHashKeyName => "NAME_lc",
}
) or die DBI->errstr;
Altri suggerimenti
Mi chiedo se questo metodo avrebbe funzionato per una tabella vuota.
Il metodo più sicuro per ottenere i metadati della colonna è di non guardare i tasti del rifhash restituita (che potrebbe non esistere), ma piuttosto le regole del gioco e utilizzare DBI fornito attributi di $ sth stessa:
$sth->{NAME}->[i]
$sth->{NAME_uc}->[i]
$sth->{NAME_lc}->[i]
Si veda la sezione metadati della pagina man DBI per i dettagli.