仅在每月的某一天执行SQL
我正在尝试执行一条基于月日的SQL语句,例如“如果今天是25号,那么执行SQL,否则说“今天不是有效的运行日期” 基本上,我使用仅在每月的某一天执行SQL,sql,perl,Sql,Perl,我正在尝试执行一条基于月日的SQL语句,例如“如果今天是25号,那么执行SQL,否则说“今天不是有效的运行日期” 基本上,我使用DBI连接并运行一些SQL,然后构建一些HTML自动发送出去 但是,我遇到如下语法错误: XXXXX处的语法错误,靠近“else” (可能是从第XX行开始的失控多行{}字符串) 行尾XXXXX处缺少右曲括号或方括号 我已经读到,您不能直接将指令嵌入表达式中(我相信我可能正在这样做)。没有day元素和else语句,脚本运行良好 # Get the current day
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;
#获取当月的当前日期(以及我们可以忽略的其他日期部分)
我的($sec、$min、$hour、$mday、$mon、$year、$wday、$yday、$isdst)=本地时间(time);
##基于星期几的过滤器
我的$sql;
如果($mday==25){
$sql=qq{
}
否则{
说“今天不是有效的运行日期”;
}
##准备并执行SQL语句
我的$sth=$dbh->prepare($sql)或die“未能准备sql:”.$dbh->errstr;
$sth->execute()或die“无法执行SQL:”.$dbh->errstr;
##开始构建HTML输出
我的$html=qq{
#
可乐
可乐
可乐
};
##循环结果集中的每一行,并为每一行添加HTML输出。
我的$count=0;
while(my$row=$sth->fetchrow\u hashref){
#
#处理行
$count++;
#说Dumper$row;
#说“$row->{col1},$row->{col2},$row->{col3}”;
$html.=qq|
美元计数。
$row->{col1}
$row->{col2}
$row->{col3}
|;
}
##关闭HTML
$html.=”;
说“$count行已处理。”;
$html.=“报表SQLReport使用以下SQL生成报表$SQL”;
die "Today is not a valid rundate\n" unless 25 == $mday;
##寄信
my$sender=新邮件::sender();
$sender->Open({
from=>email1,
至=>$maildest,
主题=>$mailsub,
ctype=>“文本/html”,
编码=>“引用可打印”,
smtp=>“本地主机”
})或死$Mail::Sender::错误,“\n”;
$sender->SendEnc($html);
$sender->Close();
$dbh->断开连接;
这里最简单的方法就是立即死亡,例如:
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;
您的代码的其余部分没有改变(假设它已经工作了)。我假设您不想每天发送电子邮件说它不是有效的运行日期
就我个人而言,我不会这样做,我只会在crontab条目中指定月份的哪一天,这使我可以在需要时轻松更改日期。这里最简单的方法就是立即死亡,例如:
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;
您的代码的其余部分没有改变(假设它已经工作了)。我假设您不想每天发送电子邮件说它不是有效的运行日期
就我个人而言,我不会这样做,我只会在crontab条目中指定月的哪一天,这允许我在需要时轻松更改日期。如果您显示的代码是您正在运行的代码,那么很明显问题在于您没有关闭字符串
qq{
。您稍后使用了类似的构造,因此看起来您知道它应该是什么样子
但是,如果今天不是25号,只打印一条消息并继续执行是没有意义的。您将$sql
保留为未定义,然后尝试准备和执行
,就好像什么都没发生一样
您需要完全停止执行,您应该编写如下内容
if($mday!=25){
说“今天不是有效的运行日期”;
出口
}
我的$sql=qq{};
我的$sth=$dbh->prepare($sql)或die“未能准备sql:”.$dbh->errstr;
$sth->execute()或die“无法执行SQL:”.$dbh->errstr;
或者您可以使用die
而不是say
,这样就不需要退出
我还想说的是,您应该保持分隔符的一致性。您使用的是带有大括号或管道的qq
,以及普通双引号“…”
,我看不出有什么特殊原因。只需选择其中一个并坚持使用即可
您还应该注意收到的任何错误消息。如果您查看了错误中的行号,我敢打赌您可以自己解决问题,但是您可以将它们替换为XXX
,好像它们是无关的,没有任何用处如果您显示的代码是您正在运行的代码,那么很明显问题是你没有关闭字符串qq{
。你后来使用了类似的构造,所以看起来你知道它应该是什么样子
但是,如果今天不是25号,只打印一条消息并继续执行是没有意义的。您将$sql
保留为未定义,然后尝试准备和执行
,就好像什么都没发生一样
您需要完全停止执行,您应该编写如下内容
if($mday!=25){
说“今天不是有效的运行日期”;
出口
}
我的$sql=qq{};
我的$sth=$dbh->prepare($sql)或die“未能准备sql:”.$dbh->errstr;
$sth->execute()或die“无法执行SQL:”.$dbh->errstr;
或者您可以使用die
而不是say
,这样就不需要退出
我还想说的是,您应该保持分隔符的一致性。您使用的是带有大括号或管道的qq
,以及普通双引号“…”
,我看不出有什么特殊原因。只需选择其中一个并坚持使用即可
您还应该注意收到的任何错误消息。如果您查看了错误中的行号,我打赌您可以自己解决问题,但您可以将它们替换为XXX
,好像它们不相关且毫无用处这不是a,所以这可能只是一个转录错误,b