2011-09-26 124 views
2

我正在運行oracle 11g。我嘗試爲一份工作設置電子郵件通知。Oracle作業警報通知

BEGIN 
DBMS_SCHEDULER.add_job_email_notification (
    job_name   => 'JOB_COLLECT_SESS_DATA', 
    recipients  => '[email protected]', 
    events   => 'job_failed'/*, 
    filter_condition => ':event.error_code=600'*/); 
END; 
/

我也得到:

PLS-00302: component 'ADD_JOB_EMAIL_NOTIFICATION' must be declared 

是它的一些問題,涉及到特權?

回答

1

該函數存在於11.2中,但不在11.1中。

您可以通過創建另一份工作,着眼於工作狀態,以重現功能:

select * 
from dba_scheduler_job_run_details 
where job_name = 'JOB_COLLECT_SESS_DATA' 
    and status = 'FAILED' 
    and additional_info like 'ORA-00600%' 
order by log_id desc; 

這查詢的工作至少對一些錯誤。但是,ORA-00600錯誤總是很特殊,並不總是出現在我所知道的表中。你會想仔細測試一下。

+0

謝謝。但我如何設置電子郵件警報? – Victor

+0

@Kaushik:創建一個每X分鐘運行一次的作業,向上面的查詢添加一個謂詞,例如'和(sysdate - cast(log_date as date))* 24 * 60 <= [X]',並使用UTL_MAIL 。這並不完美,因爲由於各種原因,工作並不總是按時完成。 –

1

我設置了一個perl腳本,該腳本定期作爲cron作業運行,當DBMS作業發生錯誤時會打印警告。由於我的crontab設置爲MAILTO=<[email protected]>,所有警告都將通過電子郵件發送給我。

my $dbh = ... # set up a database connection using DBI 
my $jobs = $dbh->selectall_arrayref("SELECT * FROM USER_JOBS", { Slice=>{}}); 

for my $job (@$jobs) { 
    if ($job->{NEXT_DATE} eq '01-JAN-4000') { 
     warn "DBMS-Job $job->{WHAT} is currently stopped.\n"; 
     warn "Last running at: $job->{LAST_DATE} $job->{LAST_SEC}\n"; 
    } 
    elsif ($job->{FAILURES}) { 
     warn "DBMS-Job $job->{WHAT} has failures.\n"; 
     warn "Last running at: $job->{LAST_DATE} $job->{LAST_SEC}\n"; 
    } 
    else { 
     warn "DBMS-Job $job->{WHAT} is broken.\n"; 
     warn "Last running at: $job->{LAST_DATE} $job->{LAST_SEC}\n"; 
    } 
}