<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Dia a dia Oracle &#187; automatizar tarefas.</title>
	<atom:link href="http://www.diaadiaoracle.com.br/category/automatizar-tarefas/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.diaadiaoracle.com.br</link>
	<description></description>
	<lastBuildDate>Thu, 08 Apr 2010 17:33:36 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Dica de SQL &#8211; Primeiro sábado do mês seguinte</title>
		<link>http://www.diaadiaoracle.com.br/2010/02/01/dica-de-sql-primeiro-sabado-do-mes-seguinte/</link>
		<comments>http://www.diaadiaoracle.com.br/2010/02/01/dica-de-sql-primeiro-sabado-do-mes-seguinte/#comments</comments>
		<pubDate>Mon, 01 Feb 2010 17:21:14 +0000</pubDate>
		<dc:creator>oracle</dc:creator>
				<category><![CDATA[automatizar tarefas.]]></category>
		<category><![CDATA[banco de dados]]></category>
		<category><![CDATA[desenvolvimento]]></category>
		<category><![CDATA[dicas]]></category>
		<category><![CDATA[job]]></category>
		<category><![CDATA[oracle]]></category>
		<category><![CDATA[pl/sql]]></category>
		<category><![CDATA[sql]]></category>
		<category><![CDATA[dica sql]]></category>
		<category><![CDATA[recupera primeiro sabado]]></category>

		<guid isPermaLink="false">http://www.diaadiaoracle.com.br/?p=65</guid>
		<description><![CDATA[Fala PessoAll,
Recebi um email do amigo Vitor Ugo sobre uma solicitação que ele havia recebido para criação de um Job. 
Até aí moleza, como podemos ver no post: Job no Oracle criar um Job é fácil! Só que este Job tem uma particularidade, ele deve rodar apenas no primeiro sábado de cada mês.
Com isso, fiz [...]]]></description>
			<content:encoded><![CDATA[<p>Fala PessoAll,</p>
<p>Recebi um email do amigo Vitor Ugo sobre uma solicitação que ele havia recebido para criação de um Job. </p>
<p>Até aí moleza, como podemos ver no post: <a href="http://www.diaadiaoracle.com.br/2009/06/10/job-no-oracle/" target="top">Job no Oracle</a> criar um Job é fácil! Só que este Job tem uma particularidade, ele deve rodar apenas no primeiro sábado de cada mês.</p>
<p>Com isso, fiz a dica para Vitor, dele colocar o job para executar todo dia, e antes de chamar a procedure do job fazer um teste e identificar se era o primeiro sábado, se sim, beleza roda a procedure, senão, não faz nada! Funcionaria, porém não é uma solução das mais bonitas, porque mesmo sem fazer nada, o job executaria todos os dias.</p>
<p>Foi então que o Vitor desenvolveu um select, que recupera o primeiro sábado do mês seguinte, e resolveu todos os problemas.</p>
<p>Segue o select desenvolvido por Vitor:</p>
<p><code><br />
select LEAST(NEXT_DAY(ADD_MONTHS(trunc(sysdate,'MM')+(8/24),1)-1,7),<br />
             next_day(ADD_MONTHS(trunc(sysdate,'MM')+(8/24),1),7)) from dual;<br />
</code></p>
<p>Neste select o &#8220;7&#8243; indica que é um sábado, caso desejem outro dia da semana, basta que vocês alterem esse número para o dia desejado!</p>
<p>É isso, fica aí a dica. Espero que gostem</p>
<p>Abraço a todos.</p>
<p>Atc.<br />
Gerson Júnior<br />
gerson.vasconcelos@gmail.com</p>
]]></content:encoded>
			<wfw:commentRss>http://www.diaadiaoracle.com.br/2010/02/01/dica-de-sql-primeiro-sabado-do-mes-seguinte/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Job não executa no Oracle 8i (DBA)</title>
		<link>http://www.diaadiaoracle.com.br/2009/10/23/job-nao-executa-no-oracle-8i-dba/</link>
		<comments>http://www.diaadiaoracle.com.br/2009/10/23/job-nao-executa-no-oracle-8i-dba/#comments</comments>
		<pubDate>Fri, 23 Oct 2009 13:16:44 +0000</pubDate>
		<dc:creator>oracle</dc:creator>
				<category><![CDATA[automatizar tarefas.]]></category>
		<category><![CDATA[banco de dados]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[dicas]]></category>
		<category><![CDATA[job]]></category>
		<category><![CDATA[oracle]]></category>

		<guid isPermaLink="false">http://www.diaadiaoracle.com.br/?p=41</guid>
		<description><![CDATA[Fala PessoALL,
Bom, ontem me deparei com mais um pequeno probleminha&#8230;
Criei um Job em um banco de dados Oracle 8i, o job estava criado certinho, com as datas de Next_Sec setadas, ou seja, tudo perfeito pra rodar. Pra confirmar se a procedure do Job estava ok, executei manualmente o Job, pra ver se seria alimentado o [...]]]></description>
			<content:encoded><![CDATA[<p>Fala PessoALL,</p>
<p>Bom, ontem me deparei com mais um pequeno probleminha&#8230;<br />
Criei um <b>Job</b> em um <b>banco de dados Oracle 8i</b>, o job estava criado certinho, com as datas de <b>Next_Sec</b> setadas, ou seja, tudo perfeito pra rodar. Pra confirmar se a procedure do Job estava ok, executei manualmente o Job, pra ver se seria alimentado o campo <b>Failures</b>, ou se manteria 0 (zero).</p>
<p>Executei manualmente assim:<br />
<code><br />
begin<br />
   dbms_job.run(1);<br />
end;<br />
</code></p>
<p>Depois conferi e Failures permanecia 0 (zero), perfeito. Era só esperar a próxima hora de execução (Next_Sec) e ele rodaria perfeitamente! No horário esperado&#8230; cadê??? Nada do Job executar!</p>
<p>Aí vamos as pesquisas&#8230; recorri ao grupo <b>GPOracle</b> e aí me veio a dica: &#8220;Dá uma olhada no parâmetro <b>JOB_QUEUE_PROCESSES</b>&#8220;. </p>
<p>Então vamos lá, olhar o parâmetro:</p>
<p><code><br />
SQL> select name, value from v$parameter where name like '%job_queue%';</p>
<p>NAME                        VALUE<br />
---------------------  ------------------<br />
job_queue_processes   0<br />
</code></p>
<p>Hum&#8230; está como 0 (zero), ou seja, estou dizendo pro banco que nenhum processo de Job vai rodar na minha base.</p>
<p>Beleza, então vamos alterar este parâmetro.</p>
<p>Supondo que você está conectado com um usuário com tal privilégio&#8230;</p>
<p><code><br />
SQL> alter system set job_queue_processes=10;</p>
<p>Sistema alterado.</p>
<p>SQL> select name, value from v$parameter where name like '%job_queue%';</p>
<p>NAME                        VALUE<br />
---------------------  ------------------<br />
job_queue_processes   10<br />
</code></p>
<p>Pronto! Como este parâmetro é dinâmico, seu banco já está ok! Seus Job&#8217;s já vão funcionar normalmente.</p>
<p>Lembrando que para que a alteração se mantenha em um possível shutdown -> startup no seu banco, é necessário que no arquivo <code>initBASE.ora</code> deve ser adicionada a linha  <code>job_queue_processes=10</code> para que na inicialização este parâmetro seja devidamente carregado.</p>
<p>É isso gente, espero que seja útil pra vocês!!</p>
<p>Atc.<br />
Gerson Júnior<br />
gerson.vasconcelos@gmail.com</p>
]]></content:encoded>
			<wfw:commentRss>http://www.diaadiaoracle.com.br/2009/10/23/job-nao-executa-no-oracle-8i-dba/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>JOB no ORACLE &#8211; Definindo a periodicidade. (INTERVAL)</title>
		<link>http://www.diaadiaoracle.com.br/2009/10/20/job-no-oracle-definindo-a-periodicidade-interval/</link>
		<comments>http://www.diaadiaoracle.com.br/2009/10/20/job-no-oracle-definindo-a-periodicidade-interval/#comments</comments>
		<pubDate>Tue, 20 Oct 2009 19:05:32 +0000</pubDate>
		<dc:creator>oracle</dc:creator>
				<category><![CDATA[automatizar tarefas.]]></category>
		<category><![CDATA[banco de dados]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[desenvolvimento]]></category>
		<category><![CDATA[dicas]]></category>
		<category><![CDATA[job]]></category>
		<category><![CDATA[oracle]]></category>
		<category><![CDATA[pl/sql]]></category>
		<category><![CDATA[jobs]]></category>

		<guid isPermaLink="false">http://www.diaadiaoracle.com.br/?p=36</guid>
		<description><![CDATA[Fala PessoALL,
Bom, atendendo à dica do amigo Alessandro Varela (http://blogdovarela.com.br) hoje falarei sobre: Como definir corretamente a periodicidade da execução dos seus Job&#8217;s! Complica não? É nada!! Vamos lá!
Espero que todos tenham lido o post que fiz falando sobre Job&#8217;s, caso não tenha lido, ainda dá tempo, basta ler o post Jobs no Oracle.
Bom, quando [...]]]></description>
			<content:encoded><![CDATA[<p>Fala PessoALL,</p>
<p>Bom, atendendo à dica do amigo Alessandro Varela (http://blogdovarela.com.br) hoje falarei sobre: Como definir corretamente a periodicidade da execução dos seus Job&#8217;s! Complica não? É nada!! Vamos lá!</p>
<p>Espero que todos tenham lido o post que fiz falando sobre Job&#8217;s, caso não tenha lido, ainda dá tempo, basta ler o post <a href="http://www.diaadiaoracle.com.br/2009/06/10/job-no-oracle/" target="top">Jobs no Oracle</a>.</p>
<p>Bom, quando fazemos a criação de um Job, é porque temos a necessidade que uma determinada tarefa seja executada de tempos em tempos, e para isso geralmente precisamos definir um intervalo para que o Job seja executado novamente. Por exemplo: Quero que meu Job rode a cada hora, quero que meu Job rode todo dia de 23:00, quero que meu job rode a cada 5 minutos, e assim por diante. Só que no momento de fazer esta parametrização é quando começa a confusão, pois, as pessoas esquecem de que o Job vai rodar sozinho e ele é quem tem que definir a próxma execução! Para simplificar isso, vamos lá!</p>
<p>Todo mundo lembra no post anterior que eu falei que para criar um Job usamos a package <code>DBMS_JOB</code> e a procedure <code>DBMS_JOB.SUBMIT(...)</code>, certo? Pois é, nesta procedure, um dos parâmetros que é passado é um tal de <code>INTERVAL</code>, ou seja, o intervalo entre cada execução do seu Job. É aqui que mora o X (xis) da questão! É neste parametro que vamos informar de quanto em quando tempo nosso Job vai rodar.</p>
<p>O que tem que ser considerado aqui, é que o Job será executado automaticamente (essa é a razão do seu existir) e é justamente por isso que rola a confusão, quando este parâmetro for usado já não estaremos mais na data &#8220;agora&#8221;, estaremos na data de execução do Job, sei lá, 23:00! E aí o banco vai usar este parâmetro <code>INTERVAL</code> para setar o campo NEXT_DATE, que é a próxima data em que o Job será executado, ou seja você tem que levar em consideração que o banco sempre vai usar sysdate para calcular este valor.</p>
<p>Como é de rotina, vamos para os exemplos que tudo vai ficar mais claro.<br />
Exemplos mais comuns:</p>
<p>Job para rodar de hora em hora:<br />
Interval -&gt; &#8217;sysdate + 1/24&#8242;<br />
Ou seja, se este Job rodar dia 25/10/2009 às 14:00, quando for somada 1 hora, teremos 15:00 como NEXT_DATE.</p>
<p>Job para rodar a cada 5 minutos.<br />
Interval -&gt; &#8217;sysdate + 5/1440&#8242;<br />
Ou seja, se este Job rodar dia 25/10/2009 às 14:00, quando for somado 5 minutos (1/1440), teremos 14:05 como NEXT_DATE.</p>
<p>Job para rodar uma vez por mês:<br />
Interval -&gt; &#8216;add_months(sysdate, 1)&#8217;<br />
Ou seja, se executar dia 25/10/2009, aplicando este valor acima, teriamos 25/11/2009 como NEXT_DATE.</p>
<p>Esse foi um dos casos mais estranhos, pedido através do blog pra mim&#8230;<br />
Job para rodar em um dia específico a cada ano e numa determinada hora:<br />
&#8216;add_months(to_date(to_char(sysdate, &#8221;DD/MM/YYYY&#8221;)||&#8221; 05:00&#8221;, &#8221;DD/MM/YYYY HH24:MI&#8221;), 12)&#8217;<br />
Ou seja, se o job rodar dia 25/10/2009 as 15:00, e aplicarmos esta fórmula aí, teremos 25/10/2010 05:00 como NEXT_DATE.</p>
<p>Uma dica legal para você fazer esta fórmula que será o NEXT_DATE do seu Job é dar <code>select</code> em <code>sysdate</code> usando a <code>dual</code>. Que eu creio ser o que o banco faz na hora de rodar o Job.</p>
<p>Por exemplo:<br />
Se executarmos o comando:<br />
<code>select sysdate, sysdate + 1/24 from dual</code><br />
Vamos obter como retorno:<br />
<code><br />
sysdate                      sysdate + 1/24<br />
20/10/2009 15:55:35	20/10/2009 16:55:35<br />
</code></p>
<p>Isso aí nos dá a hora atual e a hora atual somado 1 hora. Assim você monta seu NEXT_DATE facilmente!</p>
<p>É isso pessoal, espero que tenha ficado claro e que daqui pra frente seja mais fácil montar seus Jobs para as mais diversas necesidades.</p>
<p>Qualquer coisa, estamos por aqui!</p>
<p>Atc.<br />
Gerson Júnior<br />
gerson.vasconcelos@gmail.com</p>
]]></content:encoded>
			<wfw:commentRss>http://www.diaadiaoracle.com.br/2009/10/20/job-no-oracle-definindo-a-periodicidade-interval/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Job no Oracle</title>
		<link>http://www.diaadiaoracle.com.br/2009/06/10/job-no-oracle/</link>
		<comments>http://www.diaadiaoracle.com.br/2009/06/10/job-no-oracle/#comments</comments>
		<pubDate>Wed, 10 Jun 2009 13:44:00 +0000</pubDate>
		<dc:creator>oracle</dc:creator>
				<category><![CDATA[automatizar tarefas.]]></category>
		<category><![CDATA[job]]></category>
		<category><![CDATA[oracle]]></category>

		<guid isPermaLink="false">http://www.diaadiaoracle.com.br/?p=11</guid>
		<description><![CDATA[Fala PessoALL,
Atendendo a pedidos, hoje falaremos sobre Job&#8217;s no Oracle.
Do que se trata? Job&#8217;s são tarefas que são &#8220;scheduladas&#8221; (agendadas) no Oracle para rodar numa determinada hora que você estipula.
Como assim? Bom, vamos aos exemplos:
Suponha que você tem um sistema na sua empresa de controle de acesso, ele é quem gera os crachás para os [...]]]></description>
			<content:encoded><![CDATA[<p>Fala PessoALL,</p>
<p>Atendendo a pedidos, hoje falaremos sobre Job&#8217;s no Oracle.<br />
Do que se trata? Job&#8217;s são tarefas que são &#8220;scheduladas&#8221; (agendadas) no Oracle para rodar numa determinada hora que você estipula.</p>
<p>Como assim? Bom, vamos aos exemplos:</p>
<p>Suponha que você tem um sistema na sua empresa de controle de acesso, ele é quem gera os crachás para os funcionários entrarem na empresa. No sistema de RH, é onde são cadastrados os meus funcionários&#8230; e agora? Tenho que fazer os dois sistemas conversarem. Geralmente essa &#8220;conversa&#8221; é feita através de arquivos, chamados EDI (eletronic Data Interchange) e seu sistema de RH teria que gerar esses arquivos diariamente durante a noite com todas as pessoas Admitidas e Demitidas para que o sistema de crachá leia este arquivo e habilite ou desabilite o acesso do funcionário. Como fazer?</p>
<p>Criamos um JOB para gerar este arquivo &#8220;na calada da noite&#8221;.</p>
<p>Num JOB você diz as rotinas que vão ser executadas, que podem ser códigos direto com blocos de PL/SQL, ou podem ser chamadas Procedures ou Packages que executam as rotinas que você precisa.</p>
<p>Suponhamos mais uma vez, que neste nosso exemplo, precisamos de um JOB que chame a procedure: <code>Pr_Gera_Arq_Mov_Funcionarios</code>, e este JOB precisa gerar este arquivo às 22:00, porque às 23:00 o sistema de controle de acesso vai ler o arquivo gerado. Pronto&#8230; cenário montado, vamos criar o JOB.</p>
<p>Como criamos um JOB? Temos no banco de dados Oracle uma Package que faz todo controle e manipulação dos JOB&#8217;s no banco, o nome dela é <code>DBMS_JOB</code>, e é ela que vamos utilizar para criar nosso JOB. Como fazemos isso? Com blocos de PL/SQL, simples e rápido, assim:</p>
<p><code><br />
declare<br />
--Declare variável que recebe número do JOB.<br />
job_num binary_integer;<br />
begin<br />
--Cria o JOB no banco e retorna o número dele job_num<br />
dbms_job.submit(job_num,<br />
'begin Pr_Gera_Arq_Mov_Funcionarios; end;',<br />
to_date('10/06/2009, 22:00', 'dd/mm/yyyy hh24:mi'),<br />
'sysdate + 1');<br />
end;</code></p>
<p>Vamos explicar&#8230;.</p>
<p>A rotina <code>dbms_job.submit(...)</code> exige 2 parâmetros como obrigatórios, são eles:<br />
<code>job</code>, que é um parâmetro OUT, ou seja, a rotina vai retornar um valor para a variável que estiver neste local, no nosso caso é o número do JOB.<br />
<code>what</code> que é uma string que diz para o banco que rotinas o JOB vai executar, note que este parâmetro é uma string e tem que conter um bloco PL/SQL, ou seja, tem que ter <code>begin...end;</code> e tudo mais.</p>
<p>Os outros dois parâmetros passados neste caso, para a rotina <code>dbms_job.submit(...)</code> não são obrigatórios, eles são responsáveis por dizer que data o JOB vai rodar a próxima vez (<code>next_date</code>) e com que intervalo vai rodar novamente (<code>interval</code>), não são obrigatórios porque na package <code>dbms_job</code> existe diversas outras procedures que manipulam os JOB&#8217;s e entre elas está <code>dbms_job.next_date(...)</code> e <code>dbms_job.interval(...)</code> (entre outras), nestas rotinas é necessário informar o número do JOB e o valor que você deseja atribuir para estes atributos.</p>
<p>Observe que o tempo todo falamos de &#8220;número do JOB&#8221;, é isso mesmo. No Oracle, os JOB&#8217;s são identificados por números, não tem como atribuirmos nomes aos JOB&#8217;s (nem tudo é perfeito), por isso, na rotina que cria o JOB ele exige uma variável para receber o número que foi atribuído ao JOB.</p>
<p>Depois do seu JOB criado, você pode fazer alterações no bloco que o JOB executa, na próxima vez que ele vai rodar, no intervalo e etc, tudo usando as procedures da package <code>dbms_job</code>.</p>
<p>Para listar os JOB&#8217;s criados no seu banco de dados, bem como ver os seus Status, ultimas execuções, Status de execução, Próxima vez que vai rodar e etc, podemos dar um select na view <code>user_jobs</code>. E se ainda, quisermos saber que JOB&#8217;s estão sendo executados neste exato momento, podemos dar um select na tabela <code>dba_jobs_running</code>, mas para esta segunda você precisa ter privilégios de DBA.</p>
<p>Espero ter sido claro e tomara que este post seja útil.<br />
Qualquer dúvida não deixe de enviar um comentário ou até mesmo e-mail que descobrimos juntos as respostas.</p>
<p>Abraços à todos.</p>
<p>Atc.<br />
Gerson Júnior<br />
gerson.vasconcelos@gmail.com</p>
]]></content:encoded>
			<wfw:commentRss>http://www.diaadiaoracle.com.br/2009/06/10/job-no-oracle/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>
