Vitor, apenas um adendo : absolutamente ***** NÃO ******* é 
exigido/necessário/preciso vc ter EXCEPTIONs no seu bloco PL/SQL (seja anônimo, 
seja named dentro dum stored PL/SQL, absolutamente não importa) seo que vc quer 
é obter um status de falha causada por erros 'normais' decorrentes da execução 
de SQLs ou PL/SQLs : o comportamento NORMAL dum bloco PL/SQL é ser encerrado e 
reporta o código do erro pra quem o chamou... Apenas se usa EXCEPTION se vc OU 
quer ter algum tratamento de erros customizado (digamos, quer gravar numa 
tabela sua alguns detalhes a mais que não são armazenados), OU se vc quer 
'mascarar' o erro....
   Veja o exemplo abaixo mostrando que SIM, uma falha aborta o bloco e SIM, 
isso fica registrado Inclusive para jobs DBMS_JOB :
   
==> crio uma tabela e uma procedure que sintaticamente está OK, mas que vai 
falhar com TOO MANY ROWS, pois fará SELECT de múltiplos valores numa variável 
escalar :

SQL> create table TAB_OBJ as (select * from DBA_OBJECTS);

Tabela criada.

SQL> create or replace procedure PROC_TESTE_JOB is
  2     v_number number;
  3  BEGIN
  4     select object_id into v_number from TAB_OBJ;
  5  END;
  6  /

Procedimento criado.

==> vou executar num JOB :

SQL> set serveroutput on
SQL> DECLARE
  2     v_jobno number;
  3  BEGIN
  4    dbms_job.submit(
  5      v_jobno,
  6       'BEGIN PROC_TESTE_JOB; END;',
  7        sysdate + 5 / (24*60),
  8         'trunc(sysdate,''mi'')+1/288',
  9        TRUE);
 10     commit;
 11     dbms_output.put_line('Job id=' || v_jobno);
 12  END;
 13  /
Job id=27

Procedimento PL/SQL concluÝdo com sucesso.

==> espero os 5 minutos especificados, veja que a falha ocorreu e FOI 
registrada na coluna, sem absolutamente NENHUMA necessidade de criar uma 
EXCEPTION : 


SQL> select job, last_date, this_date, next_date, broken, interval, failures, 
what from dba_jobs;

       JOB  LAST_DATE          THIS_DATE           NEXT_DATE           B 
INTERVAL                    FAILURES WHAT
---------- ------------------- ------------------- ------------------- - 
--------------------------- -------  -----------------------------------
         5 26/09/2012 12:06:00                     30/09/2012 01:00:00 N 
wk_job.next_time('DY0701')  0        wksys.wk_job.invoke(2,5);
         7 26/09/2012 12:35:05                     26/09/2012 12:36:05 N 
sysdate + 1 / (24 * 60)     0        
EMD_MAINTENANCE.EXECUTE_EM_DBMS_JOB_PROCS();
         4 26/09/2012 12:06:00                     26/09/2012 13:00:00 N 
wk_job.next_time('HH0001')  0        wksys.wk_job.invoke(2,4);
        27                                         26/09/2012 12:37:20 N 
trunc(sysdate,'mi')+1/288   1        BEGIN PROC_TESTE_JOB; END;


==> espero mais 5 ... 

SQL> /

SQL> select job, last_date, this_date, next_date, broken, interval, failures, 
what from dba_jobs;

       JOB  LAST_DATE          THIS_DATE           NEXT_DATE           B 
INTERVAL                    FAILURES WHAT
---------- ------------------- ------------------- ------------------- - 
--------------------------- -------  -----------------------------------
         5 26/09/2012 12:06:00                     30/09/2012 01:00:00 N 
wk_job.next_time('DY0701')  0        wksys.wk_job.invoke(2,5);
         7 26/09/2012 12:40:05                     26/09/2012 12:41:05 N 
sysdate + 1 / (24 * 60)     0        
EMD_MAINTENANCE.EXECUTE_EM_DBMS_JOB_PROCS();
         4 26/09/2012 12:06:00                     26/09/2012 13:00:00 N 
wk_job.next_time('HH0001')  0        wksys.wk_job.invoke(2,4);
        27                                         26/09/2012 12:41:20 N 
trunc(sysdate,'mi')+1/288   2        BEGIN PROC_TESTE_JOB; END;

SQL>

===> okdoc ?? Só acrescento, tal como Documentado, após um erro o JOb vai ser 
executado de novo no próximo schedule, e de novo, e de novo, até completar 16 
vezes, quando aí sim ele é declarado QUEBRADo e a coluna BROKEN é marcada com Y 
... SERÀ que não foi isso que aconteceu pra vc, quando vcdiz que o seu job não 
foi marcado como BROKEN apos falhar ???

 Como eu disse também, situações de erro lógico, que NÂO geram código de erro 
físico (exemplo, UPDATE ou DELETE que não encontraram nenhum registro), 
logicamente NÃO são flagados, veja :
 
 
SQL> create or replace procedure PROC_TESTE_JOB is
  2     v_number number;
  3  BEGIN
  4     update TAB_OBJ set object_id = 999999999 where 1=2;
  5  END;
  6  /

Procedimento criado.

SQL> select job, last_date, this_date, next_date, broken, interval, failures, 
what from dba_jobs;

SQL> select job, last_date, this_date, next_date, broken, interval, failures, 
what from dba_jobs;

       JOB  LAST_DATE          THIS_DATE           NEXT_DATE           B 
INTERVAL                    FAILURES WHAT
---------- ------------------- ------------------- ------------------- - 
--------------------------- -------  -----------------------------------
         5 26/09/2012 12:06:00                     30/09/2012 01:00:00 N 
wk_job.next_time('DY0701')  0        wksys.wk_job.invoke(2,5);
         7 26/09/2012 12:40:05                     26/09/2012 12:41:05 N 
sysdate + 1 / (24 * 60)     0        
EMD_MAINTENANCE.EXECUTE_EM_DBMS_JOB_PROCS();
         4 26/09/2012 12:06:00                     26/09/2012 13:00:00 N 
wk_job.next_time('HH0001')  0        wksys.wk_job.invoke(2,4);
        27 26/09/2012 13:26:03                     26/09/2012 13:31:00 N 
trunc(sysdate,'mi')+1/288   0        BEGIN PROC_TESTE_JOB; END;

=> espero mais algum tempo ....
                
SQL> /

SQL> select job, last_date, this_date, next_date, broken, interval, failures, 
what from dba_jobs;

       JOB  LAST_DATE          THIS_DATE           NEXT_DATE           B 
INTERVAL                    FAILURES WHAT
---------- ------------------- ------------------- ------------------- - 
--------------------------- -------  -----------------------------------
         5 26/09/2012 12:06:00                     30/09/2012 01:00:00 N 
wk_job.next_time('DY0701')  0        wksys.wk_job.invoke(2,5);
         7 26/09/2012 12:40:05                     26/09/2012 12:41:05 N 
sysdate + 1 / (24 * 60)     0        
EMD_MAINTENANCE.EXECUTE_EM_DBMS_JOB_PROCS();
         4 26/09/2012 12:06:00                     26/09/2012 13:00:00 N 
wk_job.next_time('HH0001')  0        wksys.wk_job.invoke(2,4);
        27 26/09/2012 13:51:00                     26/09/2012 13:56:00 N 
trunc(sysdate,'mi')+1/288   0        BEGIN PROC_TESTE_JOB; END;



 []s

   Chiappa


--- Em oracle_br@yahoogrupos.com.br, "Vitor Jr." <vitorjr81@...> escreveu
>
> Sim, passo por isso direto… :)
> Cenário:
> job criado com sucesso, procedure está válida, job dispara mas não finaliza o 
> processo mas não acusa falha na coluna failures ou broken da dba_jobs.
> Conclusão:
> Falha no procedimento e não há tratamento de exception, em 100% dos casos que 
> peguei até hoje… Não necessariamente uma atualização de banco causa isso, 
> geralmente uma atualização na procedure pode causar isso… 
> Era necessário debugar a execução da procedure e verificar em que ponto a 
> mesma está falhando.
> 
> 
> Att,/Regards,
> 
> 
> Vitor Jr.
> Infraestrutura / Infrastructure Team
> Oracle 11g DBA Certified Professional - OCP
> Oracle Certified Expert, Oracle Real Application Clusters 11g and Grid 
> Infrastructure Administrator - OCE
> Oracle Database 11g Performance Tuning Certified Expert - OCE
> Oracle Exadata 11g Certified Implementation Specialist
> Oracle Certified Associate, MySQL 5
> mail, gtalk e msn: vitorjr81@...
> http://certificacaobd.com.br/
> skype: vjunior1981
> 
> 
> 
> 
> On 26/09/2012, at 11:27, Ana Cássia Japiassu Diniz <anajapiassu@...> wrote:
> 
> > Olá pessoal,
> > 
> > Tenho um job na base de dados que não está executando. Executo o script de
> > criação o mesmo é criado e agendado sem erros, porém não executa.
> > Segue o script que usei ao tentar recriar o job.
> > 
> > Funcionava sem problemas no oracle 10.2.0.1, desde de que migrei a base de
> > dados para o 10.2.0.5 parou de funcionar. Não sei se tem haver. Estou
> > pesquisando também algo nesta linha.
> > 
> > A procedure esyá compilada e executa sem erros.
> > 
> > Alguém já passou por essa situação do job simplesmente parar de executar?
> > Não gera nenhum erro.
> > 
> > begin
> > 
> > for rec in (select job from dba_jobs where what =
> > 'ACP.SPD_CARGA_REL_EST_PROC;') LOOP
> > sys.dbms_ijob.remove (rec.job);
> > end loop;
> > commit;
> > end;
> > /
> > 
> > alter session set NLS_DATE_FORMAT='dd/mm/yyyy';
> > 
> > variable job NUMBER;
> > 
> > declare
> > v_hora_atual integer;
> > v_prox_hora integer;
> > begin
> > 
> > select to_char(sysdate, 'HH24') into v_hora_atual from dual;
> > 
> > if v_hora_atual > 3 and v_hora_atual < 7 then
> > 
> > v_prox_hora := 7;
> > 
> > elsif v_hora_atual >= 7 and v_hora_atual < 11 then
> > 
> > v_prox_hora := 11;
> > 
> > elsif v_hora_atual >= 11 and v_hora_atual < 15 then
> > 
> > v_prox_hora := 15;
> > 
> > elsif v_hora_atual >= 15 and v_hora_atual < 19 then
> > 
> > v_prox_hora := 19;
> > 
> > elsif v_hora_atual >= 19 and v_hora_atual < 23 then
> > 
> > v_prox_hora := 23;
> > 
> > else
> > 
> > v_prox_hora := 3;
> > 
> > end if;
> > 
> > select nvl(max(job)+1,40) into :job from dba_jobs;
> > 
> > sys.dbms_ijob.submit( job => :job,
> > LUSER => 'ACP',
> > PUSER => 'ACP',
> > CUSER => 'ACP',
> > what => 'ACP.SPD_CARGA_REL_EST_PROC;',
> > next_date => trunc(sysdate) + v_prox_hora/24,
> > interval => 'trunc(sysdate+1/6,''HH'')',
> > BROKEN => false,
> > NLSENV => 'NLS_LANGUAGE="AMERICAN"
> > NLS_TERRITORY="AMERICA" NLS_CURRENCY="$" NLS_ISO_CURRENCY="AMERICA"
> > NLS_NUMERIC_CHARACTERS=".," NLS_DATE_FORMAT="=dd/mm/yyyy"
> > NLS_DATE_LANGUAGE="AMERICAN" NLS_SORT="BINARY"',
> > ENV => hextoraw('0102000200000000'));
> > commit;
> > 
> > end;
> > /
> > 
> > Desde já agradeço a todos.
> > 
> > Ana
> > 
> > [As partes desta mensagem que não continham texto foram removidas]
> > 
> > 
> 
> 
> 
> [As partes desta mensagem que não continham texto foram removidas]
>


Responder a