只在一个月的某一天执行SQL



我试图根据一个月的哪一天执行SQL语句,例如"如果今天是25号,那么执行SQL,否则说"今天不是有效的摘要"。

从本质上讲,我使用DBI连接并运行一些SQL,然后构建一些HTML以自动通过电子邮件发送出去。

然而,我遇到了如下语法错误:

XXXXX处的语法错误,靠近",else"(可能是从第XX行开始的失控的多行{}字符串)行末尾XXXXX处缺少右花括号或方括号。

我读到你不能直接在表达式中嵌入指令(我相信我可能正在这样做)。没有day元素和else语句,脚本运行良好。

# Get the current day of the month (along with other date parts we can ignore)
my ( $sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst ) = localtime( time );
## Filter based on day of week
my $sql;
if ( $mday == 25 ) {
$sql = qq{<MY SQL STATEMENT HERE>
}
else {
say "Today is not a valid rundate";
}
## Prepare and execute the SQL
my $sth = $dbh->prepare( $sql ) or die "Failed to prepare SQL: " . $dbh->errstr;
$sth->execute() or die "Failed to execute SQL: " . $dbh->errstr;
## Start building the HTML output
my $html = qq{
<table style="width:100%"><thead>
<tr>
<th>#</th>
<th>col1</th>
<th>col2</th>
<th>col3</th>
</tr>
</thead>
};
## Loop round each row in the result set, and add to the HTML output for each one.
my $count = 0;
while ( my $row = $sth->fetchrow_hashref ) {
#
# process rows
$count++;
#say Dumper $row;
#say "$row->{col1}, $row->{col2}, $row->{col3}";
$html .= qq|
<tr>
<td align="right">$count.</td>
<td>$row->{col1}</td>
<td>$row->{col2}<td>
<td>$row->{col3}</td>
</tr>
|;
}
## Close the HTML
$html .= "</table>";
say "$count rows processed.";
$html .= "<h2>Report SQL</h2>The report was produced with the following SQL<p><pre>$sql</pre>";
## Send the mail
my $sender = new Mail::Sender();
$sender->Open( {
from     => 'email1',
to       => $maildest,
subject  => $mailsubj,
ctype    => "text/html",
encoding => "quoted-printable",
smtp     => "localhost"
} ) or die $Mail::Sender::Error, "n";
$sender->SendEnc( $html );
$sender->Close();
$dbh->disconnect;

这里最简单的方法就是立即死亡,例如:

die "Today is not a valid rundaten" unless 25 == $mday;

代码的其余部分不会更改(假设它已经工作了)。我想你不想每天都发电子邮件说这不是一个有效的摘要。

就我个人而言,我不会这么做,只会在crontab条目中指定一个月的哪一天,这样我就可以在需要时轻松地更改日期。

如果您显示的代码就是您正在运行的代码,那么问题很明显是您没有关闭字符串qq{<MY SQL STATEMENT HERE>。你后来使用了类似的构造,所以看起来你知道它应该是什么样子的

但是,如果当天不是25日,那么打印一条消息并继续下去是没有意义的。您未定义$sql,然后尝试prepareexecute,就好像什么都没发生一样

你需要完全停止执行,你应该写一些类似的东西

if ( $mday != 25 ) {
say "Today is not a valid rundate";
exit;
}
my $sql = qq{<MY SQL STATEMENT HERE>};
my $sth = $dbh->prepare( $sql ) or die "Failed to prepare SQL: " . $dbh->errstr;
$sth->execute() or die "Failed to execute SQL: " . $dbh->errstr;

或者您可以使用die而不是say,这就避免了对exit的需要

我还想说,你应该保持你的分隔符的一致性。您使用的是带有大括号或管道的qq,以及普通的双引号"..."的混合物,我看不出有什么特别的原因。只需选择其中一个并坚持使用

您还应该注意收到的任何错误消息。如果你看过错误中的行号,我敢打赌你本可以自己解决问题,但你用XXX替换它们,就好像它们无关紧要,根本没有用一样

最新更新