我有一个使用自定义模块EVTConf
的脚本,它只是DBI
的包装器。
它具有硬编码的用户名和密码,因此我们不必在每个脚本中都写入用户名和密码。
我希望看到查询提取的数据 - 但它似乎没有从查询中获取任何内容 - 只是bless
语句。
什么是bless
?
#!/sbcimp/dyn/data/scripts/perl/bin/perl
use EVTConf;
EVTConf::makeDBConnection(production);
$dbh = $EVTConf::dbh;
use Data::Dumper;
my %extend_hash = %{@_[0]};
my $query = "select level_id, e_risk_symbol, e_exch_dest, penny, specialist from etds_extend";
if (!$dbh) {
print "Error connecting to DataBase; $DBI::errstr\n";
}
my $cur_msg = $dbh->prepare($query) or die "\n\nCould not prepare statement: ".$dbh->errstr;
$cur_msg->execute();
$cur_msg->fetchrow_array;
print Dumper($cur_msg) ;
这就是我得到的:
Foohost:~/walt $
Foohost:~/walt $ ./Test_extend_download_parse_the_object
$VAR1 = bless( {}, 'DBI::st' );
答案 0 :(得分:2)
$cur_msg
是一个语句句柄(因此它被保存到类DBI::st
中)。你需要这样的东西:
my $cur_msg = $dbh->prepare($query) or die "…";
$cur_msg->execute();
my @row;
while (@row = $cur_msg->fetchrow_array)
{
print "@row\n";
# print Dumper(\@row);
}
只有你需要比实际打印数据更加小心。还有许多其他提取方法,例如fetchrow_arrayref
,fetchrow_hashref
,fetchall_arrayref
。所有详细信息均可通过命令行中的perldoc DBI
或CPAN上的DBI
页面获取。
您可以使用bless
(或转到bless
)查看官方文档中有关perldoc -f bless
的说明。它是一种将变量与类相关联的方法,本例中的类是DBI::st
,即DBI语句句柄类。例如,您$dbh
将在班级DBI::db
中。
打印结果的最佳方法是什么?
打印出来的最佳方式取决于您对结果集的了解。
您可以选择:
printf "%-12s %6.2f\n", $row[0], $row[3];
如果你知道你只有两个领域感兴趣(虽然你为什么不选择你感兴趣的两个领域 - 如果它们需要花费时间(一点时间)来处理元素1和2 “没用了。”
您可以选择:
foreach my $val (@row) { print "$val\n"; }
您可以选择:
for (my $i = 0; $i < scalar(@row); $i++)
{
printf "%-12s = %s\n", $cur_msg->{NAME}[$i], $row[$i];
}
打印出列名和值。还有许多其他的可能性,但那些涵盖了关键的可能性。
正如Borodin中comment所述,您应该在Perl代码中自动反复使用use strict;
和use warnings;
。有一个变量在您显示的代码中没有严格处理,即$dbh
。 '很容易得到补救;在my
之前添加{{1}}。但确保您始终使用它们是个好主意。使用它们可以让您避免意外的行为,而这些行为是您不知道并且不打算利用的。