Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]3658[/thread]

keys durcheinander

Leser: 1


<< >> 6 Einträge, 1 Seite
mho
 2006-02-13 17:13
#34003 #34003
User since
2003-09-12
30 Artikel
BenutzerIn
[default_avatar]
Hallo

Will eine Oracle-Tabelle in ein HTML-File (OUT) schreiben. Mit Spaltennamen (dynamisch, weil sich die Tabelle ändert) als Header:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
$sth = $dbh->prepare('select * from tabelle');
$sth->execute;
print OUT '<table border=1>';
while ( $rv = $sth->fetchrow_hashref )
{
if ( $i )
{
$i = 0;
print OUT '<tr>';
foreach (keys(%$rv) ) { print OUT '<td>'.$_.'</td>'; }
print OUT '</tr>'."\n";
}
print OUT '<tr>';
foreach (values(%$rv) )
{
print OUT '<td>';
if ( defined($_) )
{
print OUT $_;
}
else
{
print OUT '&nbsp;';
}
print OUT '</td>';
}
print OUT '</tr>'."\n";
}
print OUT '</table>';
$sth->finish;


Die Befehle keys und values sortieren den Hash wie dokumentiert:

Quote
The keys are returned in an apparently random order. The actual random order is subject to change in future versions of perl, but it is guaranteed to be the same order as either the values or each function produces...


Nun möchte ich die Reihenfolge der Spalten unverändert übernehmen und mir diese durch keys und values nicht mischen lassen (sort geht nicht). Ideen?

Gruss mho
GwenDragon
 2006-02-13 18:19
#34004 #34004
User since
2005-01-17
14748 Artikel
Admin1
[Homepage]
user image
Ich glaube table_info() kann dir mehr über die Tabelle liefern.
Schau mal in die Doku deines Oracle-Treibers ;)
steffenw
 2006-02-13 22:32
#34005 #34005
User since
2003-08-15
692 Artikel
BenutzerIn
[Homepage] [default_avatar]
DBI hat übrigens eine Dokumentation: http://cpan.uwinnipeg.ca/htdocs/DBI/DBI.html

Wenn man die Spalten so haben will, wie man sie anfragt, also wie sie die Datenbank zurückgibt, dann ist fetchrow_hashref sicher nicht die richtige Wahl. Man braucht etwas, was erst einmal die Namen zurückgiibt:
Code: (dl )
1
2
3
4
5
$arrayref = $sth->{NAME};
# oder
$arrayref = $sth->{NAME_lc};
# oder
$arrayref = $sth->{NAME_uc};
und dann die Inhalte zeilenweise:
Code: (dl )
1
2
3
@array = $sth->fetchrow_array
# oder
$arrayref = $sth->fetchrow_arrayref;

Alles in Allem heißt das dann:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
my $dbh = DBI->connect($data_source, $username, $auth, {RaiseError => 1});
my $sth = $dbh->prepare('select * from table');
print qq~<table border="1">\n<tr>\n~;
print map "<th>$_</th>\n", @{$sth->{NAME}};
print "</tr>\n";
while (my $arrayref = $sth->fetchrow_arrayref) {
 print "<tr>\n";
 print map "<td>$_</td>\n", map +(defined($_) ? $_ : 'NULL'), @$arrayref;
 print "</tr>\n";
}
print "</table>\n";
$sth->finish;
$dbh->disconnect;
\n\n

<!--EDIT|steffenw|1139863313-->
$SIG{USER} = sub {love 'Perl' or die};
steffenw
 2006-02-13 22:43
#34006 #34006
User since
2003-08-15
692 Artikel
BenutzerIn
[Homepage] [default_avatar]
[quote=GwenDragon,13.02.2006, 17:19]Schau mal in die Doku deines Oracle-Treibers[/quote]
Der portable Weg ist immer erste Wahl!
$SIG{USER} = sub {love 'Perl' or die};
mho
 2006-02-14 10:34
#34007 #34007
User since
2003-09-12
30 Artikel
BenutzerIn
[default_avatar]
Hallo

Code: (dl )
1
2
3
4
5
6
7
print map "<th>$_</th>\n", @{$sth->{NAME}};
print "</tr>\n";
while (my $arrayref = $sth->fetchrow_arrayref) {
print "<tr>\n";
print map "<td>$_</td>\n", map +(defined($_) ? $_ : 'NULL'), @$arrayref;
print "</tr>\n";
}


...funktioniert TipTop, danke!
schlussda
 2006-03-23 12:00
#34008 #34008
User since
2006-03-23
2 Artikel
BenutzerIn
[Homepage] [default_avatar]
ahh, cool, thx! Hab euch über google gefunden! super!
<< >> 6 Einträge, 1 Seite



View all threads created 2006-02-13 17:13.