Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Cleriston Ruiz

Não consigo rodar job

Recommended Posts

Olá pessoal, sou novo no forum e estou com um grande problema.

 

Eu utilizo o PlSqlDeveloper para fazer os meus scripts oracle.

 

Eu criei o seguinte JOB.:

 

declare

x binary_integer;

begin

dbms_job.submit(x,'begin P_QTD_USUARIOS_ATIVO; end;',

sysdate,

'sysdate + 1/(24)');

commit;

end;

 

Para rodar de hora em hora, P_QTD_USUARIOS_ATIVO é uma procedure que executa em menos de 10 seg.

 

Mas esse job não está rodando automaticamente.

 

Se dou um run nele "begin dbms_job.run(247); end; " ele roda e agenda a nova data, mas quando chega na nova data ele não roda.

 

O job não está broken, tenho 20 jobs no meu banco, já alterei o parametro job_queue_processes para 22, mas mesmo assim não consigo fazer esse job rodar de hora em hora.

 

Alguem sabe o que está acontecendo?

 

Desde já agradeço,

 

Cleriston Ruiz

Compartilhar este post


Link para o post
Compartilhar em outros sites

Já vi um caso destes aqui no fórum , já tentou o Busca ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom dia, pessoal

 

Alphamek verifiquei a tab dba_jobs_running e o job não está em execução.

 

Motta o job tb não está broken.

 

Fiz alguns testes de ontem para hoje e verifiquei uma coisa muito estranha, criei 3 procedures identicas e criei 3 jobs cada um chamando uma delas.

 

Cada job com um intervalo diferente (sysdate + 1/(24*60)), (sysdate + 1/(24*30)) e (sysdate + 1/(24*15)) que se não estou errado era para rodar a cada 1min, 2min e 4min respectivamente. Essa procedure inseria em uma tabela a data(sysdate), hoje pela manha verifiquei que os jobs forão executados, porem com intervalo de 2h e 1min, 2h e 2min e 2h e 4min aproximadamente e o next_date está com 1min, 2min e 4min após o last_date. O horário do next_date já passou e o job não rodou.

 

Não sei como o banco trabalha internamente para verificar os job, mas a impressão que dá é que a verificação de jobs que estão agendados está sendo feita de duas em duas horas.

 

Se alguem souber o por que isso está acontecendo, posta ai ..

 

Desde já agradeço a todos

Compartilhar este post


Link para o post
Compartilhar em outros sites

A data de última execução é atualizada ?

 

Ocorre alguma exceção na execução (grave um arquivo de log) ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Motta a data de última execução é atualizada sim, creio que não acontece exceção na execução, pq isso está acontecendo com todos os jobs e de ontem para hj só estou gravando o sysdate em uma tabela, para fazer testes e continua a mesma coisa..

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pessoal, descobri mais uma coisa...

 

Tem alguma data no banco que está errada, mas não é o sysdate, deixa eu explicar.

 

Se crio um job para rodar agora(sysdate), ele não roda. Porem se crio um job para rodar duas horas atraz(sysdate - 2/24) com intervalo de 2 min, ele roda agora e agenda o next_date para sysdate + 2min. Não sei se fui claro, vou dar um exemplo.

 

sysdate = 06/11/2007 11:00:00

 

crio o job

declare

x binary_integer;

begin

dbms_job.submit(x,'begin P_QTD_USUARIOS_ATIVOS; end;',

sysdate - 2/24, -- estou colocando para rodar 2 horas atraz

'sysdate + 1/(24*30)');

commit;

end;

 

O job roda agora, insere um registro na minha tab aux com a data 06/11/2007 11:00:00.

 

Se faço um select na dba_jobs:

last_date = 06/11/2007 11:00:00

next_date = 06/11/2007 11:02:00

 

Mas ele não roda as 06/11/2007 11:02:00 e sim as 06/11/2007 13:02:00

 

EM ALGUM LUGAR A DATA ESTÁ 2 HORAS ATRASADA.. ONDE????????

 

Obrigado a todos que estão colaborando.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom,

 

O sysdate é a data atual que está no servidor.

 

Tente agedar o JOB dessa maneira:

 

declare 
x integer; 
begin 
dbms_job.submit(x,'P_QTD_USUARIOS_ATIVOS;',trunc(sysdate)+60/1440,'trunc(sysdate)+120/1440'); 
commit;
end;

E depois veja nas views user_jobs e dba_jobs_running e veja o NEXT_DATE que ele está agendado.

 

Abraços,

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom,

 

O sysdate é a data atual que está no servidor.

 

Tente agedar o JOB dessa maneira:

 

declare 
x integer; 
begin 
dbms_job.submit(x,'P_QTD_USUARIOS_ATIVOS;',trunc(sysdate)+60/1440,'trunc(sysdate)+120/1440'); 
commit;
end;

E depois veja nas views user_jobs e dba_jobs_running e veja o NEXT_DATE que ele está agendado.

 

Abraços,

 

beleza sysdate é a data atual!!!

 

Mas o que acontece é o seguinte qd agendo o job para as 13 hs, com intervalo de 2 min, esse job só roda as 15 hs e reagenda para as 15hs e 2min, mas so roda as 17hs e 2min e reagenda para as 17hs e 4min e assim por diante, com isso minha rotina só é rodada a cada 2 horas + meu intervalo, não sei o porque está com essa diferença de 2 horas.

 

Não consegui criar o job que você me passou, pois a data está 06/11/2007 01:00:00 e o intervalo 06/11/2007 02:00:00, assim da erro.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mais era para conseguir criar... aqui no SQL*PLUS crio facilmente...

 

Já verificou seu intervalo do JOB!!!

 

Verifiquei sim sysdate + 1/(24*30) = 2 min, ele agenda normal o next date fica com a hora certa, mas só roda com 3 horas de atraso.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Rodrigo , o Oracle tem algum parametro de Day Ligth Savetime (horário de verão) ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não Não...

 

Geralmente por padrão (NLS), os horários com SYSDATE e TIMESTAMP são oriundos do próprio servidor, horário local da máquina, esse sim poderá sofrer diferença com o horário de verão e afetar o oracle. porém, se estiver desabilitado, não terá esses tipos de problemas.

 

O que o Oracle pode ter de diferente é configurações de TIME ZONE (TZ), onde ele pode sim ter diferenças de horários, só verificar na view nls_database_parameters.

 

Abraços,

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não Não...

 

Geralmente por padrão (NLS), os horários com SYSDATE e TIMESTAMP são oriundos do próprio servidor, horário local da máquina, esse sim poderá sofrer diferença com o horário de verão e afetar o oracle. porém, se estiver desabilitado, não terá esses tipos de problemas.

 

O que o Oracle pode ter de diferente é configurações de TIME ZONE (TZ), onde ele pode sim ter diferenças de horários, só verificar na view nls_database_parameters.

 

Abraços,

 

Rodrigo,

 

O SYSDATE está correto, como faço para verificar o TIMESTAMP, e o que devo verificar na view nls_database_parameters? Fiz um select e retornou os seguintes valores:

 

NLS_LANGUAGE =AMERICAN

NLS_TERRITORY =AMERICA

NLS_CURRENCY =$

NLS_ISO_CURRENCY =AMERICA

NLS_NUMERIC_CHARACTERS =.,

NLS_CHARACTERSET =WE8ISO8859P1

NLS_CALENDAR =GREGORIAN

NLS_DATE_FORMAT =DD-MON-RR

NLS_DATE_LANGUAGE =AMERICAN

NLS_SORT =BINARY

NLS_TIME_FORMAT =HH.MI.SSXFF AM

NLS_TIMESTAMP_FORMAT =DD-MON-RR HH.MI.SSXFF AM

NLS_TIME_TZ_FORMAT =HH.MI.SSXFF AM TZR

NLS_TIMESTAMP_TZ_FORMAT =DD-MON-RR HH.MI.SSXFF AM TZR

NLS_DUAL_CURRENCY =$

NLS_COMP =BINARY

NLS_LENGTH_SEMANTICS =BYTE

NLS_NCHAR_CONV_EXCP =FALSE

NLS_NCHAR_CHARACTERSET =AL16UTF16

NLS_RDBMS_VERSION =10.1.0.5.0

 

 

Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

TIMESTAMP = SYSDATE, única diferença que ele é usado para objetos ou até mesmo como colunas de tabelas, mas a origem é a mesma, do servidor.

 

A procedure executada manualmente, demora quando tempo para executar?

 

Verificou o servidor que está o banco de dados, os horários estão certos comparados com o banco?

 

Passa o resultado desses SELECTS:

 

select job, what, to_char(next_date,'DD-MM-RRRR HH24:MI:SS'), interval, broken, nls_env

from user_jobs;

 

select * from v$parameter where name like '%job%';

 

E tambem faça esse teste.

 

SQL> conn system@XE
Informe a senha:
Conectado.
SQL> select * from v$version;

BANNER
----------------------------------------------------------------
Oracle Database 10g Express Edition Release 10.2.0.1.0 - Product
PL/SQL Release 10.2.0.1.0 - Production
CORE	10.2.0.1.0	  Production
TNS for 32-bit Windows: Version 10.2.0.1.0 - Production
NLSRTL Version 10.2.0.1.0 - Production

SQL> show parameters job

NAME								 TYPE		VALUE
------------------------------------ ----------- ------------------------------
job_queue_processes				  integer	 4
SQL> select to_char(sysdate,'DD-MM-RRRR HH24:MI:SS') as "HORA ATUAL" from dual;

HORA ATUAL
-------------------
08-11-2007 12:13:30

SQL> create table X (a number(5), b date);

Tabela criada.

SQL> create sequence SEQX start with 1 increment by 1 maxvalue 99999 nocache;

SeqⁿΩncia criada.

SQL> create or replace procedure PROCX is
  2  begin
  3	 insert into X values (SEQX.nextval,sysdate);
  4	 commit;
  5  end;
  6  /

Procedimento criado.

SQL> select to_char(sysdate,'DD-MM-RRRR HH24:MI:SS') as "HORA ATUAL" from dual;

HORA ATUAL
-------------------
08-11-2007 12:14:58

SQL> exec PROCX;

Procedimento PL/SQL concluφdo com sucesso.

SQL> select a, to_char(b,'DD-MM-RRRR HH24:MI:SS') as "HORA" from X;

		 A HORA
---------- -------------------
		 1 08-11-2007 12:15:06

SQL> declare
  2	 job integer;
  3  begin
  4	 dbms_job.submit (job,'PROCX;',sysdate+30/86400,'sysdate+30/86400');
  5	 commit;
  6  end;
  7  /

Procedimento PL/SQL concluφdo com sucesso.

SQL> select job, what, to_char(last_date,'DD-MM-RRRR HH24:MI:SS') as "ULTIMA DATA",
  2		 to_char(next_date,'DD-MM-RRRR HH24:MI:SS') as "PROXIMA", interval
  3  from user_jobs;

	   JOB WHAT									 ULTIMA DATA		 PROXIMA			 INTERVAL
---------- ---------------------------------------- ------------------- ------------------- ------------------------------
		62 PROCX;								   08-11-2007 12:16:19 08-11-2007 12:16:49 sysdate+30/86400

SQL> select a, to_char(b,'DD-MM-RRRR HH24:MI:SS') as "HORA" from X;

		 A HORA
---------- -------------------
		 1 08-11-2007 12:15:06
		 2 08-11-2007 12:16:52
		 3 08-11-2007 12:17:27
		 4 08-11-2007 12:18:02

SQL> select to_char(sysdate,'DD-MM-RRRR HH24:MI:SS') as "HORA ATUAL" from dual;

HORA ATUAL
-------------------
08-11-2007 12:18:34

SQL> select a, to_char(b,'DD-MM-RRRR HH24:MI:SS') as "HORA" from X;

		 A HORA
---------- -------------------
		 1 08-11-2007 12:15:06
		 2 08-11-2007 12:16:52
		 3 08-11-2007 12:17:27
		 4 08-11-2007 12:18:02
		 5 08-11-2007 12:18:37

E veja se o resultado é o mesmo apresentado no meu exemplo.

 

Abraços,

Compartilhar este post


Link para o post
Compartilhar em outros sites

Rodrigo fiz conforme você pediu,

 

job_queue_processes = 22

 

select * from v$version;

 

Oracle Database 10g Release 10.1.0.5.0 - 64bit Production

PL/SQL Release 10.1.0.5.0 - Production

CORE 10.1.0.5.0 Production

TNS for Linux: Version 10.1.0.5.0 - Production

NLSRTL Version 10.1.0.5.0 - Production

 

E o mais legal de todos.....

select a, b HORA from X;

 

1 09-11-2007 08:30:13

2 09-11-2007 10:30:57

4 09-11-2007 14:32:10

3 09-11-2007 12:31:28

 

Pq essas duas horas de diferença??

Compartilhar este post


Link para o post
Compartilhar em outros sites

Meu palpite estava certa a meleca começou no horário de verão.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.