如何将SQL查询的输出重定向到文件?

时间:2015-08-20 21:05:33

标签: perl

我需要一些帮助才能将SQL查询的输出重定向到文件。我的代码如下所示:

my $sth = $dbh->prepare(
    "select count(parameter2),
    parameter2 as file_type
    from KCRT_TABLE_ENTRIES where request_id = $mycrnum
    group by parameter2"
) or die "Can't prepare SQL statement: ", $dbh->errstr(), "\n";

$sth->execute > $mydir\\file_detail.txt
    or die "Can't execute SQL statement: ", $sth->errstr(), "\n";

3 个答案:

答案 0 :(得分:5)

我不得不发明很多代码,因为你没有展示很多你的程序,但下面的程序为你提供了粗略的想法

调用execute后,您必须调用其中一种fetch方法来检索对您最有用的任何形式的数据。在这里,我刚刚要求引用一个包含每行数据的数组

然后,只需打开输出所需的文件并将数据行打印到它

即可

我已经删除了每个DBI调用的状态检查,并将其替换为自动执行相同操作的RaiseError标志。我还用占位符替换了SQL语句中的参数$mycrnum,并将其值传递给execute。这样DBI会照看任何必要的报价等。

use strict;
use warnings;

use DBI;

my ($dsn, $user, $pass);

my ($mycrnum, $mydir);

my $dbh = DBI->connect($dsn, $user, $pass);
@{$dbh}{qw/ PrintError RaiseError /} = (0, 1);

my $sth = $dbh->prepare(
    "SELECT COUNT(parameter2),
    parameter2 AS file_type
    FROM kcrt_table_entries
    WHERE request_id = ?
    GROUP BY parameter2"
);

$sth->execute($mycrnum);

open my $fh, '>', "$mydir/file_detail.txt" or die $!;
select $fh;

while ( my $row = $sth->fetchrow_arrayref ) {
    printf "%5d %s\n", @$row;
}

答案 1 :(得分:2)

执行后,打开输出文件:

open my $of, ">", "$mydir\\file_detail.txt";

然后读取结果中的每一行(或行):

while ( @row = $sth->fetchrow_array ) {

将输出打印到打开的文件句柄:

    print $of "@row\n";  # NO COMMA AFTER $of!

关闭while()循环:

}

最后,关闭打开的文件句柄:

close $of;

现在你完成了。

答案 2 :(得分:1)

也许是这样的事情?

my $sth = $dbh->prepare(q{
    select count(parameter2),
    parameter2 as file_type
    from KCRT_TABLE_ENTRIES where request_id = ?
    group by parameter2
}) or die "Can't prepare SQL statement: ", $dbh->errstr(), "\n";

$sth->execute($mycrnum);

open my $OUT, '>', "$mydir/file_detail.txt" or die;

while (my @row = $sth->fetchrow_array) {
  print $OUT @row, "\n";   # or whatever...
}

close $OUT;

$sth->finish;

这有点过分,因为你只是读取一个值,但它至少演示了一个样板,可以在将来的查询中完成它。

如果你有一个有保证的单行,你可以这样做:

my ($val1, $val1) = $dbh->selectrow_array(q{
    select foo, bar
});