2009-05-15 5 views
2

J'essaie de transmettre les noms de table à un sous-système qui obtient tous les noms de champs de cette table, les stocke dans un tableau, puis utilise ce tableau conjointement avec le fetchrow d'une autre requête sql pour afficher les données dans ces champs. Voici le code que j'ai maintenant:

Perl DBI dynamique fetchrow en boucle

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 Nto quelque chose 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()) 

Répondre

12

Utilisation 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 FetchHashKeyName-"NAME_lc" ou "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; 
+0

(clés% $ row) me donne ce - symbole mondial "% ligne" nécessite nom de package explicite à ./req.pl – CheeseConQueso

+0

L'impression en devrait être pour: print « \ t $ col est $ row- > {$ col} \ n "; – Anon

+0

Oups, c'est ce que je reçois pour ne pas tester. –

2

Je me demande si cette méthode fonctionne 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 hashref retourné (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 Métadonnées de la page de manuel DBI pour plus de détails.

Questions connexes