将psl查询从perl传递到字符串

时间:2013-01-15 13:43:43

标签: sql linux perl psql

目前我有一个perl脚本访问我们的数据库,执行某些查询并将输出打印到终端。相反,我想在生成pdf之前将结果输出到模板乳胶文件中。对于我的大多数查询,我提取数字并将其存储为标量变量(例如,特定运算符执行给定任务的频率)。例如

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脚本将运算符名称和事件传递给字符串数组,而不是仅仅将结果发送到终端?

2 个答案:

答案 0 :(得分:3)

您应该考虑更新脚本以使用DBI。这是Perl中数据库连接的标准。

DBI具有用于将参数插入查询字符串的内置工具。它比自己手动创建字符串更安全,更快捷。在循环之前,执行一次:

#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);

请注意,您传递给execute的参数会自动插入到您的语句中?的位置。它会为你处理报价。

同样在循环中,执行语句后,您可以得到如下结果:

my $array_ref = $query->fetchall_array_ref;

现在所有行都存储在二维数组结构中。 $array_ref->[0][0]将返回第一行的第一列。

有关详细信息,请参阅DBI documentation

正如其他人所提到的,您的代码中还有其他一些错误。确保从use strict; use warnings;开始,如果需要进一步的帮助,请提出更多问题!

答案 1 :(得分:2)

对您的剧本有很多好的反馈,但没有关于您的实际问题。

  

如何让perl脚本将运算符名称和事件传递给字符串数组,而不是仅仅将结果发送到终端?

你是否试过创建一个数组并将项目推送到它?

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

或者使用嵌套数组:

push (@array, ["operator", "incident"]);