仅在每月的某一天执行SQL

时间:2017-01-25 16:05:58

标签: sql perl

我正在尝试根据当月的日期执行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;

2 个答案:

答案 0 :(得分:2)

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

die "Today is not a valid rundate\n" unless 25 == $mday;

其余代码不会改变(假设它已经工作)。我认为你不想每天发送电子邮件说它不是一个有效的趋势。

就个人而言,我不会这样做,只会在crontab条目中指定月份日期,这样我就可以根据需要轻松更改日期。

答案 1 :(得分:2)

如果您显示的代码是您正在运行的代码,那么很明显问题是您没有关闭字符串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,就好像它们无关紧要并且完全没用