2017-01-25 20 views
0

我想基於這個月如的某一天來執行SQL語句「如果今天是那麼25日執行SQL,否則說:‘今天是不是一個有效的rundate’。執行SQL僅在每月的某一天

基本上我用DBI連接並建立一些HTML之前運行一些SQL被自動發送出去

但是,我得到的語法錯誤,如下列:在

語法錯誤XXXXX,靠近「,否則」 (可能是一個失控的多行{ }從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; 
+3

這不是[mcve]所以這可能只是一個轉錄錯誤,但是您從不在'$ sql = qq {'語句中關閉'qq'。 – ThisSuitIsBlackNot

回答

2

這裏最簡單的方法就是馬上死,例如:

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

你的代碼的其餘部分沒有變化(假設它的工作的話)。我會假設你不想每天發送電子郵件說它不是一個有效的rundate。

就個人而言,我不會這麼做,並且只會在指定crontab條目,這使得如果需要的話我可以輕鬆地更改日一個月的日子。

+0

非常感謝,這工作像一個魅力,我感謝你是建設性的。 –

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替換它們,就好像它們是無關緊要的,根本沒有用處

+0

非常感謝評論,我贊同這個事實,即當參數不正確時我需要停止執行,但我並不完全知道如何構建它。另外,我刪除行號的原因是因爲我刪除了SQL,因爲它是使它們變得毫無用處的敏感信息。我應該爲你突出顯示這些行,但是我認爲「接近」,「否則」使它在代碼中唯一的出現是明顯的。再次感謝 –

+0

如果你是* NIX,你可以使用CRON作業。可以設置爲隨時運行,當你運行的時候你會得到很大的靈活性,並且它們會自動觸發 –

+0

@DuncanCarr:cron作業的問題在於它們可以神祕地停止運行,幾個月後都沒有人會注意到。也沒有理由認爲該程序應該每月* 25日運行* – Borodin