我需要一些帮助才能将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";
答案 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
});