1

私はWindows上でActiveStateによって構築されたPerlv5.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'
      };

注意すべきことの1つは、実行されているこのクエリは、実行されている多くのクエリの1つであるということです。この特定のスクリプトは一連のクエリを実行し、返された結果に基づいてレポートを生成します。クエリは、perlスクリプトと一緒にhdのファイルに保存されます。クエリが読み込まれ、実行されます。常に同じ列が選択されているとは限りません。

4

2 に答える 2

7

ハッシュを使用しました。ハッシュ要素には制御可能な順序はありません*。配列内の要素の順序を制御できます。フィールドが受信された順序を表示する場合は、ハッシュの代わりに配列を使用します。

実際に名前が必要な場合は、を使用してフィールドの順序付きの名前を取得できます@{ $sth->{NAME} }。効率上の理由から配列を使用する必要がありますが、必要に応じてハッシュを使用することもできます。


* —配列要素が配列内で「物理的に」編成された順序で返されるのと同様に、ハッシュ要素はハッシュ内で物理的に編成された順序で返されます。要素がハッシュ内の物理的に配置される場所を制御することはできず、ハッシュが変更されると位置が変更されます。配列を使用すると、要素の物理的な位置を決定し、その位置に留まります。

于 2012-10-05T17:51:17.347 に答える
3

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だけで、レポートを作成するとクエリが作成されます。

于 2012-10-05T18:56:57.163 に答える