Perl DBI fetchRow dynamique en boucles
-
22-08-2019 - |
Question
Je suis en train de transmettre des noms de table à un sous qui obtient, les stocke tous les noms de champs de cette table dans un tableau, et utilise ensuite ce tableau conjointement avec le fetchRow d'une autre requête SQL pour afficher les données dans les des champs. Voici le code que je maintenant:
Exemples d'appels sous avec des noms de table comme paramètre:
shamoo("reqhead_rec");
shamoo("approv_rec");
shamoo("denial_rec");
Shamoo sous:
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...
}
}
Je cherche un moyen de transformer cette chose Nto qui ne doit pas être explicitement défini ....
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())
La solution
Utilisez 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";
}
}
}
Vous pouvez également définir ou FetchHashKeyName
à "NAME_lc"
"NAME_uc"
lorsque vous créez votre poignée de base de données:
my $dbh = DBI->connect(
$dsn,
$user,
$pass,
{
ChopBlanks => 1,
AutoCommit => 1,
PrintError => 0,
RaiseError => 1,
FetchHashKeyName => "NAME_lc",
}
) or die DBI->errstr;
Autres conseils
Je me demande si cette méthode fonctionnerait pour une table vide.
La méthode la plus sûre pour obtenir les métadonnées de la colonne est de ne pas regarder les clés du retour hashref (qui pourrait ne pas exister) mais les règles du jeu et l'utilisation DBI fourni attributs de $ STH lui-même:
$sth->{NAME}->[i]
$sth->{NAME_uc}->[i]
$sth->{NAME_lc}->[i]
Voir la section des métadonnées de la page man DBI pour plus de détails.