2017-01-25 1 views
0

오늘 날짜를 기준으로 SQL 문을 실행하려고합니다. 예를 들어 "오늘이 25 일이면 SQL을 실행하고 그렇지 않으면 오늘은 유효한 일과입니다"특정 달의 특정 날짜에만 SQL 실행

내가 연결하고 일부 HTML을 구축하기 전에 몇 가지 SQL을 실행하는 데 DBI을 사용하고 기본적으로

은 자동으로 이메일로 전송하는

을하지만, 나는 다음과 같은 구문 오류를 받고 있어요 :.

구문 오류에서 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; 

을 예컨대 다이하는 것입니다. 나는 당신이 이메일을 보내고 싶지 않다고 생각할 것입니다. 매일 그것이 유효한 런데이트가 아니라고 말하고 싶습니다.

개인적으로는이 작업을 수행하지 않고 crontab 항목에서 월을 지정하기 만하면 필요할 때 쉽게 변경할 수 있습니다.

+0

대단히 감사 드리며 매력적이었습니다. 건설적인 데 대해 감사드립니다. –

2

표시된 코드가 실행중인 코드 인 경우 qq{<MY SQL STATEMENT HERE> 문자열을 닫지 않은 것이 문제입니다. 나중에 비슷한 컨스 트럭 트를 사용 했으므로 보이는 모양을 알 수 있습니다.

그러나 현재 날짜가 25 일이 아니라면 메시지를 인쇄하고 옮기는 것이 바람직하지 않습니다 어쨌든. 당신은 정의되지 않은 $sql를 떠나 아무 것도 당신은 모두 실행을 중지해야

을 일도 없었던 것처럼 다음 executeprepare을 시도하고, 당신은

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; 

같은 것을 작성해야 아니면, say 대신 die를 사용할 수있는 exit

구분 기호를 일관되게 유지해야한다고 말하고 싶습니다. 특별히 볼 수있는 특별한 이유없이 "..."과 같은 큰 따옴표와 함께 중괄호 또는 파이프로 qq을 사용하고 있습니다. 이 중 하나를 골라서 붙이십시오.

또한 오류 메시지가 나타날 경우주의해야합니다. 오류의 행 번호를 살펴 본다면 문제를 알아낼 수 있었을 지 모르지만 그걸 쓸모없고 전혀 사용하지 않는 것처럼 XXX으로 바꿀 수 있습니다.

+0

고마워요 내가 의견을 주셔서 감사 드리며 인수가 사실이 아니지만 실행을 중단해야한다는 사실에 동의합니다. 또한, 줄 번호를 제거한 이유는 SQL을 제거했기 때문에 민감하지 않은 정보로 처리 되었기 때문입니다. 내가 당신을 위해 라인을 강조 표시해야하지만 "가까운", 그렇지 않으면 "코드에서 유일한 사건으로 분명히했다."다시 고마워 –

+0

* NIX 경우 CRON 작업을 사용할 수 있습니다. 그런 식으로 스크립트는 –

+0

@DuncanCarr : cron 작업의 문제점은 신비하게도 작동을 멈추고 아무도 몇 달 동안 눈치 채지 못할 수 있다는 것입니다. 또한 매월 * 25 일마다 프로그램을 실행해야한다고 가정 할 이유가 없습니다. – Borodin

관련 문제