Поиск номера задания в обработчике исключений - PullRequest
3 голосов
/ 04 января 2012

У меня запущено несколько заданий Oracle. В каждом задании я настраивал обработчик исключений PL / SQL, который отправляет разработчикам электронное письмо, если в коде, в котором выполняется задание, обнаружена ошибка. Могу ли я узнать в обработчике исключений номер задания, чтобы я мог включить его в электронное письмо?

Что-то вроде:

BEGIN
   Run_This_Plsql();
EXCEPTION WHEN OTHERS DO
   DECLARE
      job_number VARCHAR2(64);
   BEGIN
      job_number := --This would be the job number of the currently running job
      Send_email(job_number, subject, recipient, from);
   END;
END;

Ответы [ 4 ]

2 голосов
/ 04 января 2012

Во время поиска я нашел это сообщение на форуме OraFAQ, в котором выделен BG_JOB_ID параметр sys_context - попробуйте.

BEGIN
   Run_This_Plsql();
EXCEPTION WHEN OTHERS DO
   DECLARE
      job_number VARCHAR2(64);
   BEGIN
      job_number := sys_context('userenv', 'BG_JOB_ID');
      Send_email(job_number, subject, recipient, from);
   END;
END;
1 голос
/ 04 января 2012

Если вы говорите о dbms_job, тогда вы можете просто использовать параметр job .Допустим, у вас есть следующая процедура

procedure do_the_job(p_job_no in number) is
begin
   ...
exception
  when others then 
    send_email(p_job_no, ...);
end;

, тогда вы можете передать номер задания процедуре, подобной этой:

declare
  l_job_no number;
begin
  dbms_job.submit(job => l_job_no, what => 'do_the_job(job);');
end;
/
1 голос
/ 04 января 2012

Для построения на основе предложенного вами решения.

Я бы сохранил номер задания оракула в таблице и прочитал его при запуске процесса, затем вы можете создать таблицы регистрации, состояния, подробностей электронной почты, которые относятся кномер задания.

вот какой-то псевдокод:

BEGIN    
    SELECT oracle_job_no INTO v_job_no FROM Myjobs WHERE jobName='Daily doodah';

    job_start(v_job_no); -- log job start

    Run_This_Plsql(v_job_no); 

    job_end(v_job_no); -- log job end

EXCEPTION WHEN OTHERS DO    
DECLARE       
    BEGIN              
        Job_fail(v_job_no); -- log job failure, send email, etc
    END; 
END;

или просто используйте готовую систему планирования, которая делает все это и более, например, autosys

0 голосов
/ 04 января 2012

Если вам нужна информация о сеансе (например, идентификатор сеанса или любая другая информация о сеансе), то вы можете попробовать (выберите столбцы, которые вы хотите сообщить / зарегистрировать):

select * from v$session where sid=(select sys_context('USERENV','SID') from dual);

Надеюсь, что поможет

...