我正在使用由Windows上的ActiveState构建的Perl v5.12.3。 DBD::Oracle 版本 1.27. DBI 版本 1.616。 我按此特定顺序选择下面的数据,并希望以相同的顺序检索生成的数据。 下面是代码示例和一些示例。
SQL 代码段(下面的 $report_sql 内容)
select student_number, lastfirst, counselor,
a.dateenrolled as "Date Enrolled 1", a.dateleft as "Date Left 1", a.termid as "Term ID 1", a.course_number as "Course Number 1",
a.expression as "Expression 1", b.dateenrolled as "Date Enrolled 2", b.dateleft as "Date Left 2",
b.termid as "Term ID 2", b.course_number as "Course Number 2", b.expression as "Expression 2"
Perl 代码片段
## run the resulting query
my $report_result = $dbh->prepare( $report_sql );
$report_result->execute();
while( my $report_row = $report_result->fetchrow_hashref())
{
print Dumper($report_row); ## contents of this posted below
$report_row 的打印转储程序的内容
$VAR1 = {
'Expression 2' => 'x',
'LASTFIRST' => 'xx',
'Term ID 1' => 'xx',
'Date Enrolled 2' => 'xx',
'Course Number 1' => 'xx',
'Term ID 2' => 'xx',
'STUDENT_NUMBER' => 'xx',
'Date Left 2' => 'xx',
'Expression 1' => 'xx',
'COUNSELOR' => 'xx',
'Date Left 1' => 'xx',
'Course Number 2' => 'xx',
'Date Enrolled 1' => 'xx'
};
订单我希望它被打印
$VAR1 = {
'STUDENT_NUMBER' => 'xx',
'LASTFIRST' => 'xx',
'COUNSELOR' => 'xx',
'Date Enrolled 1' => 'xx',
'Date Left 1' => 'xx',
'Term ID 1' => 'xx',
'Course Number 1' => 'xx',
'Expression 1' => 'xx',
'Date Enrolled 2' => 'xx',
'Date Left 2' => 'xx',
'Term ID 2' => 'xx',
'Course Number 2' => 'xx',
'Expression 2' => 'x'
};
需要注意的一点是,正在运行的此查询是正在运行的众多查询之一。 此特定脚本运行一系列查询,并根据返回的结果生成报告。 查询与perl脚本一起存储在hd上的文件中。 查询被读入,然后运行。 选择的列并不总是相同的列。
您使用了哈希。哈希元素没有可控的顺序*。可以控制数组中 elememts 的顺序。如果要显示字段的接收顺序,请使用数组而不是哈希。
如果您确实需要名称,则可以使用 @{ $sth->{NAME} }
获取字段的有序名称。出于效率原因,您仍应使用数组,但如果需要,可以使用哈希。
* — 就像数组元素按照它们在
数组中"物理"组织的顺序返回一样,哈希元素按照它们在哈希中的物理组织顺序返回。您无法控制元素在哈希中的物理放置位置,并且位置会随着哈希的更改而变化。使用数组,您可以决定元素的物理位置,并且它将保持在该位置。
当 DBI 结果中列的顺序很重要时,您可以获取列名和值作为数组引用。
...
my $names = $report_result->{NAME}; # or NAME_lc or NAME_uc
while( my $report_row = $report_result->fetchrow_arrayref() ) {
for my $col_idx ( 0 .. $#{$names} ) {
print "$names->[$col_idx]: $report_row->[$col_idx]n";
}
}
早在我不得不担心国际化之前,我就经常使用它来生成 CSV 报告,只需在传递结果数组之前将NAME
数组传递给Text::CSV
,编写报告就变成了编写查询。