<?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>Zona J &#187; oracle</title>
	<atom:link href="http://www.zonaj.org/category/oracle/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.zonaj.org</link>
	<description>Zona Java - Um blog português sobre java.</description>
	<lastBuildDate>Tue, 21 Sep 2010 23:49:54 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Queries hierárquicas em Oracle</title>
		<link>http://www.zonaj.org/2008/02/08/queries-hierarquicas-em-oracle/</link>
		<comments>http://www.zonaj.org/2008/02/08/queries-hierarquicas-em-oracle/#comments</comments>
		<pubDate>Fri, 08 Feb 2008 03:03:35 +0000</pubDate>
		<dc:creator>Ruben Badaró</dc:creator>
				<category><![CDATA[oracle]]></category>

		<guid isPermaLink="false">http://www.zonaj.org/?p=77</guid>
		<description><![CDATA[Um caso que ocorre com frequência é ter estruturas hierárquicas em tabelas. Um exemplo típico será uma tabela empregado, que pode ter e/ou ser um supervisor. Ou seja, temos uma chave estrangeira que aponta para a chave da própria tabela, algo tipo ID_EMP NOME SUPERVISOR ------- -------------- ------------ 1 João NULL 2 Pedro 1 3 [...]]]></description>
			<content:encoded><![CDATA[<p></p><p>Um caso que ocorre com frequência é ter estruturas hierárquicas em tabelas. Um exemplo típico será uma tabela empregado, que pode ter e/ou ser um supervisor. Ou seja, temos uma chave estrangeira que aponta para a chave da própria tabela, algo tipo</p>
<pre>
ID_EMP  NOME           SUPERVISOR
------- -------------- ------------
1       João           NULL
2       Pedro          1
3       Ricardo        1
4       José           2
</pre>
<p>Em que o João é supervisor do Pedro e do Ricardo e o Pedro é supervisor do José.</p>
<p>Por vezes, temos uma estrutura deste tipo mais ou menos complexa, com mais ou menos níveis de profundidade e queremos saber, com base num identificador, todos os resultados hierarquicamente &#8211; neste caso, ao perguntar quais os supervisionados hierárquicos do João, teríamos o Pedro, Ricardo e José.</p>
<p>Tipicamente, até agora fazia uma função em pl/sql que fizesse isto pois não conhecia algumas das facilidades que o Oracle fornece para isto.</p>
<p><strong>Introducing CONNECT BY</strong></p>
<p>DBAs e pessoal com alguma experiência em Oracle deve conhecer isto, mas para mim foi uma novidade e foi-me imensamente útil.<br />
Com esta directiva, consigo fazer o seguinte:</p>
<pre class="prettyprint">
SELECT
  NOME, LEVEL
FROM
  EMPREGADO
START WITH
  NOME='João'
CONNECT BY NOCYCLE
  PRIOR ID = SUPERVISOR
</pre>
<p>O resultado desta query seria aproximado a:</p>
<pre>
NOME           LEVEL
-------------- -------
João           1
Pedro          2
Ricardo        2
José           3
</pre>
<p>O que se fez foi dizer que queríamos começam com o registo com o nome João e &#8220;ligá-lo&#8221; aos seus filhos. Isto é feito com a cláusula CONNECT BY e usando PRIOR num dos campos. Podemos pensar seguindo da raiz, de registo em registo iterativamente, sendo que na primeira iteração o PRIOR ID é o campo do registo raiz e estamos a seleccionar como próximos campos, todos os que tenham SUPERVISOR = PRIOR ID.<br />
A palavra NOCYCLE é para não se entrarem em ciclos e a coluna LEVEL que está a ser usada é uma pseudo-coluna que indica o nível em que está o registo em relação à raiz (sendo a raiz o nível 1).</p>
<p>Podem encontrar uma explicação mais completa <a href="http://www.ss64.com/ora/connectby.html">aqui</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.zonaj.org/2008/02/08/queries-hierarquicas-em-oracle/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>De DBMS_JOB para DBMS_SCHEDULER: o Deploy</title>
		<link>http://www.zonaj.org/2007/05/31/de-dbms_job-para-dbms_scheduler-o-deploy/</link>
		<comments>http://www.zonaj.org/2007/05/31/de-dbms_job-para-dbms_scheduler-o-deploy/#comments</comments>
		<pubDate>Thu, 31 May 2007 10:49:59 +0000</pubDate>
		<dc:creator>Bruno Braz Gonçalves</dc:creator>
				<category><![CDATA[job]]></category>
		<category><![CDATA[oracle]]></category>
		<category><![CDATA[plsql]]></category>

		<guid isPermaLink="false">http://www.zonaj.org/?p=42</guid>
		<description><![CDATA[Nos últimos tempos tenho trabalhado com jobs em base de dados Oracle. Mesmo que a base de dados utilizada fosse a 10g é ainda utilizado o DBMS_JOB. Recentemente li o [1] e descobri o DBMS_SCHEDULER. Dou dois exemplos de dificuldades que senti com o DBMS_JOB: definir o intervalo de execução: fraca legibilidade, demasiado código para [...]]]></description>
			<content:encoded><![CDATA[<p></p><p>
Nos últimos tempos tenho trabalhado com jobs em base de dados Oracle.<br />
Mesmo que a base de dados utilizada fosse a 10g é ainda utilizado o <code>DBMS_JOB</code>. Recentemente li o [1] e descobri o <code>DBMS_SCHEDULER</code>.
</p>
<p>
Dou dois exemplos de dificuldades que senti com o <code>DBMS_JOB</code>:</p>
<ul>
<li>definir o intervalo de execução: fraca legibilidade, demasiado código para conseguir o agendamento desejado;
  </li>
<li>configurar o deploy de um job: apenas um campo númérico identifica univocamente o job na lista.
  </li>
</ul>
<p>Neste post vou falar sobre o segundo ponto: o deploy de um job.
</p>
<h3>Oracle 9i: o DBMS_JOB</h3>
<p>
Na versão 9i a gestão de jobs é feita com o package <code>DBMS_JOB</code>.<br />
Eis o script de deploy mais simples:</p>
<pre class="prettyprint">
DECLARE
  V_JOB NUMBER;
BEGIN
  DBMS_JOB.SUBMIT(
		JOB => V_JOB,
		WHAT => 'BEGIN MY_PKG.MY_EXEC_PROC; END;',
		NEXT_DATE => SYSDATE);
  commit;
  dbms_output.put_line('Created MY_PKG.MY_EXEC_PROC job: '||v_job);
END;
/ </pre>
<p>Este script tem o seguinte problema: se executarmos o script outra vez o resultado vai ser a criação de outro job igual ao primeiro. Este foi alias a situação com que me deparei de início: a base de dados tinha dezenas de jobs a realizar a mesma tarefa!
</p>
<p>
Posto o problema de apenas o campo <code>job</code> (do tipo número) identificar univocamente o job, utilizei o campo <code>what</code> para o identificar. Criei o seguinte script de deploy:</p>
<pre class="prettyprint">
DECLARE
  V_JOB NUMBER;
  V_WHAT VARCHAR2(100) := 'BEGIN MY_PKG.MY_EXEC_PROC; END;';
  V_NEXT_DATE DATE := SYSDATE;
BEGIN
  dbms_output.put_line('Deleting all MY_PKG.MY_EXEC_PROC jobs:');
	FOR jobs_to_delete IN (
    SELECT  job
	    FROM user_jobs
	    WHERE what like V_WHAT
   ) LOOP
     dbms_output.put_line('...removing MY_PKG.MY_EXEC_PROC job ' || jobs_to_delete.job);
     dbms_job.remove(jobs_to_delete.job);
  END LOOP;
  dbms_output.put_line('Deleted all MY_PKG.MY_EXEC_PROC jobs.');
  commit;

  DBMS_JOB.SUBMIT(V_JOB, V_WHAT, V_NEXT_DATE);
  commit;
  dbms_output.put_line('Created MY_PKG.MY_EXEC_PROC job: '||v_job);
END;
/ </pre>
<p>Reparar no loop para resolver o caso de fazerem deploy do mesmo job.<br />
Este script não resolve outro problema: se numa fase de desenvolvimento alterarmos o <code>what</code> do job não iremos remover os jobs antigos &#8211; claro que esta situação tem pouco impacto com algum controlo regular sobre o que existe na base de dados.
</p>
<p>
Este script poderia ser isolado num procedimento com a assinatura</p>
<pre class="prettyprint">
  DEPLOY_JOB(
		job       OUT BINARY_INTEGER,
		what      IN  VARCHAR2,
		next_date IN  DATE DEFAULT sysdate,
		interval  IN  VARCHAR2 DEFAULT 'null',
		job_name  IN  VARCHAR2);   -- 'job_name' serve apenas para dbms_output
</pre>
<p>que não é mais do que estender as funcionalidades do <code>DBMS_JOB.SUBMIT</code>.
</p>
<h3>Oracle 10g: o DBMS_SCHEDULER</h3>
</p>
<p>Mas eis que a 10g apresenta uma solução muito mais completa: o package <code>DBMS_SCHEDULER</code>.
</p>
<p>
Eis o novo script de deploy proposto</p>
<pre class="prettyprint">
DECLARE
  V_JOB_NAME VARCHAR2(100) := 'MY_PKG_MY_EXEC_PROC';
BEGIN
  DBMS_SCHEDULER.DROP_JOB(
    job_name          =>  V_JOB_NAME );
  DBMS_SCHEDULER.CREATE_JOB(
		job_name          =>  V_JOB_NAME,
		job_type          =>  'PLSQL_BLOCK',
		job_action        =>  'BEGIN MY_PKG.MY_EXEC_PROC; END;');
		start_date        =>  SYSDATE );
END;
/ </pre>
</p>
<p>
<i><b>job_name</b><br />
This attribute specifies the name of the job and uniquely identifies the job.<br />
The name has to be unique in the SQL namespace. For example, a job cannot have the same name as a table in a schema.<br />
<br />
If job_name is not specified, an error is generated. If you want to have a name generated by the Scheduler, you can use the GENERATE_JOB_NAME procedure to generate a name and then use the output in the CREATE_JOB procedure. The GENERATE_JOB_NAME procedure call generates a number from a sequence, which is the job name. You can prefix the number with a string. The job name will then be the string with the number from the sequence appended to it. </i>
</p>
<p>
Além do job ter um identificador descritivo, não é apenas único na lista de jobs mas também em todo o schema.
</p>
<p>
E com o <code>DBMS_SCHEDULER.GENERATE_JOB_NAME</code> nem precisariamos de nos preocupar com o nome do job, similar ao <code>DBMS_JOBS</code>.<br />
E óptimo disponibilizar a geração de valores para <code>job_name</code> com prefixo, muito útil em aplicações que geram internamente jobs e que teriam de implementar esta geração do nome.
</p>
<p>
<strong>Nota importante</strong>: ao contrário do <code>DBMS_JOB.SUBMIT</code>, o <code>DBMS_SCHEDULER.CREATE_JOB</code> faz commit, tentando ser similar a um statement DDL.
</p>
<p><b>Leituras</b></p>
<ul>
<li>[1] Oracle Database Administrator&#8217;s Guide 10g Release 1 (<a target="_blank" href="http://www.oracle.com">http://www.oracle.com</a>)
  </li>
<li>[2] PLSQL Packages and Types Reference 10g Release 1 (<a target="_blank" href="http://www.oracle.com">http://www.oracle.com</a>)
  </li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.zonaj.org/2007/05/31/de-dbms_job-para-dbms_scheduler-o-deploy/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Oracle compra Tangosol</title>
		<link>http://www.zonaj.org/2007/04/03/oracle-compra-tangosol/</link>
		<comments>http://www.zonaj.org/2007/04/03/oracle-compra-tangosol/#comments</comments>
		<pubDate>Tue, 03 Apr 2007 14:58:52 +0000</pubDate>
		<dc:creator>Ruben Badaró</dc:creator>
				<category><![CDATA[geral]]></category>
		<category><![CDATA[indústria]]></category>
		<category><![CDATA[oracle]]></category>

		<guid isPermaLink="false">http://d6038509.u101.jodoshared.com/?p=17</guid>
		<description><![CDATA[A notícia já tem alguns dias, mas a Oracle anunciou a aquisição da Tangosol, empresa especialista em soluções data grid, nomeadamente com o seu produto Coherence que permite transacções distribuídas de alta performance. Antes de mais, aproveito para dar a conhecer um pouco este produto que já investiguei um pouco, mas que não tive oportunidade [...]]]></description>
			<content:encoded><![CDATA[<p></p><p>A <a href="http://www.oracle.com/corporate/press/2007_mar/tangosol.html">notícia já tem alguns dias</a>, mas a Oracle anunciou a aquisição da <a href="http://www.tangosol.com">Tangosol</a>, empresa especialista em soluções data grid, nomeadamente com o seu produto <a href="http://www.tangosol.com/coherence-overview.jsp">Coherence</a> que permite transacções distribuídas de alta performance. Antes de mais, aproveito para dar a conhecer um pouco este produto que já investiguei um pouco, mas que não tive oportunidade de utilizar em projectos reais em Portugal, um pouco devido à dimensão.</p>
<p>O Tangosol Coherence é uma solução de gestão de dados in-memory em ambientes distribuídos, integra graciosamente com a maioria dos servidores aplicacionais (p.e. OracleAS, JBoss, Weblogic e Websphere) e é independente da datasource (pode ser uma base de dados, um webservice ou um qualquer sistema legacy). Permite-nos gerir de forma transparente o acesso e gestão de dados sobre conjuntos de máquinas, garantindo alta performance &#8211; tal como clientes real-time &#8211; e integridade de dados, sem grande esforço do utilizador.</p>
<p>O principal ponto do produto é o mecanismo de caching distribuído. Suporta caching <i>Read-Through, Write-Through, Refresh-Ahead e Write-Behind</i>, sendo que as duas últimas podem ter grandes impactos de performance. Pode-se ler uma explicação destas políticas de caching <a href="http://wiki.tangosol.com/display/COH32UG/Read-Through,+Write-Through,+Refresh-Ahead+and+Write-Behind+Caching">aqui</a>. Temos também sub-produtos, nomeadamento o Coherence Web, que permite fazer caching de sessões HTTP de forma fácil e incrivelmente eficiente e performante.</p>
<p>O ponto seguinte do produto é a sua implementação de transacções distribuídas. Chama-se <i>Extreme Transaction Processing</i> e em conjunto com a cache write-behing, faz transacções <i>in-memory</i>, sendo assim mais rápido e obtendo uma menor latência. </p>
<p>Existem 3 edições do Coherence: Caching, Application e Data grid. O primeiro foca-se em mecanismos de cache, o segundo engloba as potencialidades do primeiro e ainda controle trasaccional e o último engloba todas as funcionalidades das outras versões, adicionando capacidades de computação, interacção realtime, sistema orientado a eventos e outras propriedades mais avançadas. </p>
<p>Em suma, é o produto líder nesta área, especificamente em ambientes J2EE e é aclamado como um dos poucos produtos java realmente pensados e tecnicamente a roçar a perfeição. </p>
<p><br/></p>
<p>Coloca-se a questão de como se integrará isto tudo como os produtos middleware da oracle, nomeadamente com o Oracle TimesTen &#8211; uma base de dados in-memory adquirida pela Oracle há uns tempos atrás, altamente performante, para ser utilizada como caching local para aplicações &#8211; e com o Oracle TopLink &#8211; o Coherence integra bem com Hibernate, Toplink e pojo&#39;s mas prevê-se maior integração com o Toplink. No site da oracle dão algumas ideias sobre esta integração nos pdf&#39;s de ajuda, mas nada de muito concreto.</p>
<p>Fica então a esperança de poder vir a utilizar este produto cá na nossa terra, mesmo em sistemas tempo-real e de elevada garantia transaccional como sistemas bancários, de companhias aéreas, etc.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.zonaj.org/2007/04/03/oracle-compra-tangosol/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

