2009-05-15 7 views
2

Ich versuche, Tabellennamen an eine Untereinheit zu übergeben, die alle Feldnamen dieser Tabelle erhält, speichert sie in einem Array und verwendet dann dieses Array in Verbindung mit dem Abruf einer anderen SQL-Abfrage um die Daten in diesen Feldern anzuzeigen. Hier ist der Code Ich habe jetzt:

Perl DBI dynamische fetchrow while-Schleifen

Beispiele für Unter Anrufe mit Tabellennamen als Parameter:

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... 
    } 
} 

Ich suche einen Weg, dies zu drehen nto etwas, das definiert werden, muss nicht explizit ....

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()) 

Antwort

12

Verwendung 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"; 
     } 
    } 
} 

Sie können auch FetchHashKeyName-"NAME_lc" oder "NAME_uc" setzen, wenn Sie Ihre Datenbank-Handle erstellen:

my $dbh = DBI->connect(
    $dsn, 
    $user, 
    $pass, 
    { 
     ChopBlanks  => 1, 
     AutoCommit  => 1, 
     PrintError  => 0, 
     RaiseError  => 1, 
     FetchHashKeyName => "NAME_lc", 
    } 
) or die DBI->errstr; 
+0

(keys% $ row) gibt mir diese - Globales Symbol "% Zeile" Namen in dem bei ./req.pl – CheeseConQueso

+0

Der Druck expliziten Pakets erfordert sein sollte: $ „\ t $ col ist Druck row- > {$ col} \ n "; – Anon

+0

Whoops, das bekomme ich, wenn ich nicht testet. –

2

Ich frage mich, ob diese Methode für eine leere Tabelle funktionieren würde.

Die sicherste Methode, um die Spalten-Metadaten zu bekommen, ist nicht auf den Tasten des zurück hashref suchen (die möglicherweise nicht vorhanden), sondern nach den Regeln spielen und DBI etw selbst zur Verfügung gestellt Attribute von $ verwenden:

$sth->{NAME}->[i] 
$sth->{NAME_uc}->[i] 
$sth->{NAME_lc}->[i] 

Weitere Informationen finden Sie im Abschnitt "Metadaten" der DBI-Manpage.