Perl DBI Oracle在SELECT之后不保留列顺序

kre*_*ves 1 perl dbi dbd

我在Windows上使用由ActiveState构建的Perl v5.12.3.DBD :: Oracle版本1.27.DBI版本1.616.我正按照这个特定的顺序选择下面的数据,并希望以相同的顺序检索结果数据.下面是代码示例和一些示例.

SQL Snippet(下面$ 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"
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

$ 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'
      };
Run Code Online (Sandbox Code Playgroud)

订单我预计它将被打印

$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'
      };
Run Code Online (Sandbox Code Playgroud)

需要注意的一点是,正在运行的查询是正在运行的许多查询之一.此特定脚本运行一系列查询,并根据返回的结果生成报告.查询与perl脚本一起存储在hd上的文件中.读入查询然后运行.并不总是选择相同的列.

ike*_*ami 7

你用哈希.散列元素没有可控的顺序*.可以控制阵列中元素的顺序.如果要显示接收字段的顺序,请使用数组而不是散列.

如果您确实需要名称,则可以使用以获取字段的有序名称@{ $sth->{NAME} }.出于效率原因,您仍应使用数组,但如果您愿意,可以使用哈希.


* - 就像数组元素按照它们在数组中"物理"组织的顺序返回一样,哈希元素按照它们在哈希中物理组织的顺序返回.您无法控制元素在哈希中的物理位置,并且位置会随着哈希值的更改而更改.使用数组,您可以确定元素的物理位置,并保持该位置.