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())
Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top