2

機能する SQL ステートメントを用意します。

my $q_it = $dbh->prepare("SELECT customdata.Field_ID,
    customdata.Record_ID,
    customdata.StringValue
    FROM customdata
    WHERE customdata.Field_ID='10012' && (StringValue LIKE '1%' OR StringValue LIKE   '2%' OR StringValue LIKE '9%');
   ");

クライアントがサーバー/データベースで実行するための非常に単純な Perl スクリプトを作成しました。直接テストすることはできませんでしたが、コードを DBA に渡しました。

  $q_it->execute();
   open (MYFILE, '>>data.txt');
    while (my @row=$q_it->fetchrow_array)
    {
       print MYFILE $row[0].$row[1].$row[2];
    }
   close (MYFILE);

$q_it は、通常の SQL Select ステートメントです。data.txt には多くのレコード (行) が含まれると思います。ただし、驚くべきことに、結果は単一の列に返されますが、多くの行は次のようになります。

      100012
      100012
       ...
      100012
      315941
      315667
       ...
      315633 
      2011-06
      2011-06
       ...
      2011-06

ほぼ正しい番号があります。「100012」、「31」の値、および日付文字列の行の数。理想的には、

100012  315941 2011-06
100012  315667 2011-06
100012  315633 2011-06

私のPerlで何か間違ったことをしたのでしょうか、それともMySQLデータベースの構造が異なるためでしょうか?

助けてくれてありがとう!

4

2 に答える 2

6

データベースをダンプする以前の試みを見ていると思います。最初の列のすべての値を取得し、続いて2番目の列のすべての値を取得するには、これまでに示したものとはまったく異なるプログラムが必要です。

追加用にファイルを開いていることを忘れないでください。これにより、ファイルの先頭に古いデータが残ります。失敗した試行からの出力はほとんど価値がないので、ここでは書き込み用のオープンが適切であると思いました。

open使用状況も確認します

open MYFILE, '>', 'data.txt' or die $!;

それとは別に、改行を設定$\していない限り、レコードを区切るために、印刷出力を改行で終了する必要があります。書くのも簡単です

print "@row\n";

各フィールドに明示的に言及するのではなく。

于 2012-06-01T17:00:01.547 に答える
0

私はこのようなものを使うのが本当に好きです:

sub fetch_result_rows {
    my ($dbh, $sql, @bind_params) = @_; 
    try {
        return $dbh->selectall_arrayref($sql, { RaiseError => 1, Slice => {}, }, @bind_params);
    } catch {
        confess("Unable to run SQL:\n$sql\nBIND PARAMS: @{[ join(', ', @bind_params) ]}");
    }   
}

魔法はスライスにあり、ハッシュ参照の配列参照として返されます。結果が次のようになるため、パフォーマンスのオーバーヘッドは価値があります。

[
{ column1 => value, column2 => value, column3 => value }, # row1
{ column1 => value, column2 => value, column3 => value }, # row2
...

]

詳細については、perldoc DBI を参照してください。

于 2012-06-01T16:50:50.797 に答える