Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
仅在每月的某一天执行SQL_Sql_Perl - Fatal编程技术网

仅在每月的某一天执行SQL

仅在每月的某一天执行SQL,sql,perl,Sql,Perl,我正在尝试执行一条基于月日的SQL语句,例如“如果今天是25号,那么执行SQL,否则说“今天不是有效的运行日期” 基本上,我使用DBI连接并运行一些SQL,然后构建一些HTML自动发送出去 但是,我遇到如下语法错误: XXXXX处的语法错误,靠近“else” (可能是从第XX行开始的失控多行{}字符串) 行尾XXXXX处缺少右曲括号或方括号 我已经读到,您不能直接将指令嵌入表达式中(我相信我可能正在这样做)。没有day元素和else语句,脚本运行良好 # Get the current day

我正在尝试执行一条基于月日的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;
#获取当月的当前日期(以及我们可以忽略的其他日期部分)
我的($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