结果:
Alert:OUTBOUND_DATA:0
脚本:
my $dbh_oracle = DBI->connect( $CFG{oracle_dbi_connect},$CFG{db_user},$CFG{db_cred},{autoCommit => 0,raiseerror => 0,PrintError => 0}) or dIE ("Cannot connect to the database: ".$DBI::errstr."\n");my ($val1,$val2) = get_data();print "Alert:$val1:$val2\n";send_email("Alert:$val1:$val2");sub get_data{ undef $/; open (my $QFH,"< /sql/summary.sql") or dIE "error can't open this file $!"; my $sth= $dbh_oracle->prepare(<$QFH>) or dIE ("Cannot connect to the database: ".$DBI::errstr."\n"); $sth->execute; close $QFH; my $row = $sth->fetchrow_hashref; $sth->finish; return @$row{'MYtable','FLAG'};}sub send_email { my $message = shift; open (MAIL,"|/usr/sbin/sendmail -t") or dIE "Can't open sendmail: $!"; print MAIL "To: me\@test.com\n"; print MAIL "From: Data\n"; print MAIL "\n"; print MAIL $message; close MAIL;}exit;
运行查询的结果:(超过1 rec)
MYtable FLAG----------------------- ----------OUTBOUND_DATA 0MSGS_BY_DIM 0INBOUND_DATA 03 rows selected.解决方法 它还取决于您构建整个脚本的方式.您的get_data()调用仅允许返回一对值.我看到至少有两个选项:要么返回包含所有数据的哈希(引用)并让main组装它,要么使用前面提到的循环结构并在子例程中构造消息体,只返回一个标量字符串.
要将所有数据作为哈希引用返回,get_data子例程可能如下所示(注意我使用fetchall_hashref而不是fetchrow_hashref:
sub get_data{ undef $/; open (my $QFH,"< /sql/summary.sql") or dIE "error can't open this file $!"; my $sth= $dbh_oracle->prepare(<$QFH>) or dIE ("Cannot connect to the database: ".$DBI::errstr."\n"); $sth->execute; close $QFH; my $hash_ref = $sth->fetchall_hashref('MYtable'); $sth->finish; return $hash_ref;}
你从main调用它并使用输出如下:
my $hash_ref = get_data();my $message = "";foreach my $table (sort keys %$hash_ref) { $message .= join(":","Alert",$table,$$hash_ref{$table}{'FLAG'}) . "\n";}
这将导致$message包含:
Alert:INBOUND_DATA:0Alert:MSGS_BY_DIM:0Alert:OUTBOUND_DATA:0
你可能想要礼貌地:
$dbh_oracle->disconnect;
在你退出之前.
这有一些问题,例如你已经在外部脚本中保存了sql,但是我已经使用了硬编码密钥(MYtable,我认为在你的查询中是唯一的)和值(FLAG)脚本,当你想要扩展它时,这将限制.
总结以上是内存溢出为你收集整理的使用Perl DBI获取所有记录全部内容,希望文章能够帮你解决使用Perl DBI获取所有记录所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)