0

現在、データベースにアクセスし、特定のクエリを実行し、出力を端末に出力する perl スクリプトがあります。代わりに、pdf を生成する前に結果をテンプレート latex ファイルに出力したいと思います。ほとんどのクエリでは、数値を取り出してスカラー変数として保存します (たとえば、特定のオペレーターが特定のタスクを実行する頻度など)。例えば。

foreach $op (@operator) {
    $query = "SELECT count(task_name) FROM table WHERE date <= '$date_stop' and 
              date >= '$date_start' and task=\'$operator[$index]\';";

    #execute query
    $result=$conn->exec($query);
    $conres = $conn->errorMessage;
    if ($result->resultStatus eq PGRES_TUPLES_OK) {
        if($result->ntuples > 0) {
            ($task[$index]) = $result->fetchrow;
        }
        printf("$operator[$index] carried out task: %d\n", $task[$index]);   
    } else {
        die "Failed.\n$conres\n\n";
        exit -1;
    }
    $index++;
} 
printf("**********************************\n\n");

最終レポートでは、各オペレーターが各タスクを何回完了したかを表にまとめます。これに加えて、報告しなければならないいくつかのインシデントもあります。次のようなコマンドを使用して、これらを端末に簡単に出力できます

$query = "SELECT operator, incident_type from table_name WHERE incident_type = 'Y' 
          and date <= '$date_stop' and date >= '$date_start';";
$result=$conn->exec($query);
$conres = $conn->errorMessage;
if ($result->resultStatus eq PGRES_TUPLES_OK) {
    if($result->ntuples > 0) {
        $result->print(STDOUT, 1, 1, 0, 0, 0, 1, "\t", "", "");
    }
} else {
    die "Failed.\n$conres\n\n";
    exit -1;
}

このコマンドの出力例は次のとおりです。

operator  |   incident_type
-----------------------------
AB        |  Incomplete due to staff shortages
-------------------------------
CD        |  Closed due to weather
-----------------------------

結果を端末に送信するだけでなく、perl スクリプトでオペレーター名とインシデントを文字列配列に渡すにはどうすればよいですか?

4

2 に答える 2

4

を使用するようにスクリプトを更新することを検討する必要がありますDBI。これは、Perl におけるデータベース接続の標準です。

DBI にはクエリ文字列にパラメータを挿入する機能が組み込まれています。自分で文字列を手動で作成するよりも安全で高速です。ループの前に、これを 1 回行います。

#dbh is a database handle that you have already opened.
my $query = $dbh->prepare(
    "SELECT count(task_name) FROM table WHERE date<=? and date>=? and task=?"
);

次に、ループ内で、毎回これを行うだけで済みます。

$query->execute($date_stop,$date_start,$op);

渡すパラメータは、ステートメントの 's のexecute代わりに自動的に挿入されることに注意してください。?それはあなたのために引用を処理します。

また、ループ内でステートメントを実行すると、次のような結果が得られます。

my $array_ref = $query->fetchall_array_ref;

これで、すべての行が 2 次元配列構造に格納されました。$array_ref->[0][0]最初の行の最初の列が返されます。

詳細については、DBI のドキュメントを参照してください。

他の人が言及したように、コードには他にもかなりの間違いがあります。から始めてくださいuse strict; use warnings;。さらにサポートが必要な場合は、さらに質問してください。

于 2013-01-15T15:03:26.457 に答える
2

スクリプトに対する多くの良いフィードバックがありますが、実際の質問については何もありません。

結果を端末に送信するだけでなく、perlスクリプトで演算子名とインシデントを文字列配列に渡すにはどうすればよいですか?

配列を作成してアイテムをプッシュしてみましたか?

my @array;
push (@array, "foo");

またはネストされた配列を使用する:

push (@array, ["operator", "incident"]);
于 2013-01-15T16:48:58.340 に答える