我正在尝试根据当月的日期执行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;
答案 0 :(得分:2)
这里最简单的方法就是立即死亡,例如:
die "Today is not a valid rundate\n" unless 25 == $mday;
其余代码不会改变(假设它已经工作)。我认为你不想每天发送电子邮件说它不是一个有效的趋势。
就个人而言,我不会这样做,只会在crontab条目中指定月份日期,这样我就可以根据需要轻松更改日期。
答案 1 :(得分:2)
如果您显示的代码是您正在运行的代码,那么很明显问题是您没有关闭字符串qq{<MY SQL STATEMENT HERE>
。你之后使用过类似的构造,所以看起来你应该知道它应该是什么样的
但是,如果当天不是第25天,只是打印一条消息并继续进行,这是没有意义的。您保留$sql
未定义,然后尝试prepare
和execute
,就好像什么都没发生一样
你需要完全停止执行,你应该写一些像
这样的东西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
,就好像它们无关紧要并且完全没用