<?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>Roberto Furutani &#187; Oracle</title>
	<atom:link href="http://www.furutani.com.br/category/oracle/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.furutani.com.br</link>
	<description>O site de um computólogo curioso!</description>
	<lastBuildDate>Fri, 20 Jan 2012 00:25:47 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Loop fácil em PL/SQL</title>
		<link>http://www.furutani.com.br/2012/01/loop-facil-em-plsql/</link>
		<comments>http://www.furutani.com.br/2012/01/loop-facil-em-plsql/#comments</comments>
		<pubDate>Wed, 18 Jan 2012 20:59:57 +0000</pubDate>
		<dc:creator>Roberto Furutani</dc:creator>
				<category><![CDATA[Oracle]]></category>
		<category><![CDATA[plsql]]></category>

		<guid isPermaLink="false">http://www.furutani.com.br/?p=782</guid>
		<description><![CDATA[Olá! Dica rápida: Eu não conhecia a sintaxe do for abaixo, resolvi compartilhar. Não precisa declarar cursor nem dar open, fetch e close. begin &#8212; A variavel armazena cada linha retornada pelo select. for variavel in ( select a.nome from tab_cliente a where a.idade >= 18) loop &#8212; Faz alguma coisa com a variavel. pro_teste(&#8216;maior_idade&#8217; [...]]]></description>
			<content:encoded><![CDATA[<p>Olá!</p>
<p>Dica rápida: Eu não conhecia a sintaxe do <strong>for</strong> abaixo, resolvi compartilhar. Não precisa declarar cursor nem dar open, fetch e close. <br />
<br/></p>
<p>begin</p>
<p>  &#8212; A variavel armazena cada linha retornada pelo select.<br />
  for variavel in ( select a.nome<br />
                      from tab_cliente a<br />
                     where a.idade >= 18) loop</p>
<p>      &#8212; Faz alguma coisa com a variavel.<br />
      pro_teste(&#8216;maior_idade&#8217; , variavel.nome);  </p>
<p>  end loop;</p>
<p>end;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.furutani.com.br/2012/01/loop-facil-em-plsql/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Erro JDBC &#8211; Io exception: NL Exception was generated</title>
		<link>http://www.furutani.com.br/2011/09/erro-jdbc-io-exception-nl-exception-was-generated/</link>
		<comments>http://www.furutani.com.br/2011/09/erro-jdbc-io-exception-nl-exception-was-generated/#comments</comments>
		<pubDate>Wed, 14 Sep 2011 12:13:21 +0000</pubDate>
		<dc:creator>Roberto Furutani</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Oracle]]></category>

		<guid isPermaLink="false">http://www.furutani.com.br/?p=768</guid>
		<description><![CDATA[Olá Hoje me deparei com um erro diferente ao tentar conectar ao banco de dados Oracle numa aplicação Java. Caused by: java.sql.SQLException: Io exception: NL Exception was generated Depois de algumas analises verifiquei que a string de conexão estava errada: jdbc:oracle:thin:@(DESCRIPTION=(LOAD_BALANCE=on)(FAILOVER=on)(ADDRESS_LIST=(ADDRESS=(protocol=tcp)(host=198.31.10.51)(port=1521))(ADDRESS=(protocol=tcp)(host=198.31.10.50)(port=1521)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=meu_banco)) No final da string faltou um fecha parênteses &#8220;)&#8221;. Abaixo string que funciona sem [...]]]></description>
			<content:encoded><![CDATA[<p>Olá</p>
<p>Hoje me deparei com um erro diferente ao tentar conectar ao banco de dados Oracle numa aplicação Java.</p>
<pre><em><strong>Caused by: java.sql.SQLException: Io exception: NL Exception was generated</strong></em></pre>
<p>Depois de algumas analises verifiquei que a string de conexão estava errada:</p>
<pre class="brush: php">

jdbc:oracle:thin:@(DESCRIPTION=(LOAD_BALANCE=on)(FAILOVER=on)(ADDRESS_LIST=(ADDRESS=(protocol=tcp)(host=198.31.10.51)(port=1521))(ADDRESS=(protocol=tcp)(host=198.31.10.50)(port=1521)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=meu_banco))</pre>
<p>No final da string faltou um fecha parênteses &#8220;)&#8221;.</p>
<p>Abaixo string que funciona sem problemas:</p>
<pre class="brush: php">

jdbc:oracle:thin:@(DESCRIPTION=(LOAD_BALANCE=on)(FAILOVER=on)(ADDRESS_LIST=(ADDRESS=(protocol=tcp)(host=198.31.10.51)(port=1521))(ADDRESS=(protocol=tcp)(host=198.31.10.50)(port=1521)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=meu_banco)))</pre>
<p>portanto quando ocorrer esse erro verifique sua string nos mínimos detalhes.</p>
<p>Até mais,</p>
]]></content:encoded>
			<wfw:commentRss>http://www.furutani.com.br/2011/09/erro-jdbc-io-exception-nl-exception-was-generated/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Fatorial com Oracle SQL</title>
		<link>http://www.furutani.com.br/2011/07/fatorial-com-oracle-sql/</link>
		<comments>http://www.furutani.com.br/2011/07/fatorial-com-oracle-sql/#comments</comments>
		<pubDate>Tue, 05 Jul 2011 21:50:44 +0000</pubDate>
		<dc:creator>Roberto Furutani</dc:creator>
				<category><![CDATA[Oracle]]></category>

		<guid isPermaLink="false">http://www.furutani.com.br/?p=739</guid>
		<description><![CDATA[Olá Abaixo um SQL diferente que calcula o fatorial de um número with fatorial as (select level idx from dual connect by level &#60;= 15) select idx, exp( sum( ln(idx) ) over (order by idx) ) fact from fatorial Resultado: Eu achei interessante, pois alguns comandos ali eu nunca tinha visto apesar de trabalhar a [...]]]></description>
			<content:encoded><![CDATA[<p>Olá</p>
<p>Abaixo um SQL diferente que calcula o fatorial de um número</p>
<pre class="brush: php">with fatorial as
    (select level idx from dual connect by level &lt;= 15)
    select idx, exp( sum( ln(idx) ) over (order by idx) ) fact
      from fatorial</pre>
<p>Resultado: <div class="wp-caption aligncenter" style="width: 532px"><img alt="Resultado da query" src="http://furutani.com.br/wp-content/uploads/2011/07/2011-07-05_134138.jpg" title="Resultado da query" width="522" height="479" /><p class="wp-caption-text">Resultado da query</p></div></p>
<p>Eu achei interessante, pois alguns comandos ali eu nunca tinha visto apesar de trabalhar a bastante tempo com Oracle DB.</p>
<p>Até mais.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.furutani.com.br/2011/07/fatorial-com-oracle-sql/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ORA-01722: invalid number</title>
		<link>http://www.furutani.com.br/2011/03/ora-01722-invalid-number/</link>
		<comments>http://www.furutani.com.br/2011/03/ora-01722-invalid-number/#comments</comments>
		<pubDate>Sun, 13 Mar 2011 03:21:04 +0000</pubDate>
		<dc:creator>Roberto Furutani</dc:creator>
				<category><![CDATA[Oracle]]></category>

		<guid isPermaLink="false">http://www.furutani.com.br/?p=727</guid>
		<description><![CDATA[Olá, Se você usa o to_number() para converter varchar2 em number provavelmente já teve esse problema ou um dia terá. O problema aparenta ser simples quando tem uma variável varchar2 com caracteres estranhos no meio, mas e quando você tem certeza que o número esta certo. E quando to_number() funciona corretamente só quando o número [...]]]></description>
			<content:encoded><![CDATA[<p>Olá,</p>
<p>Se você usa o <strong>to_number()</strong> para converter <strong>varchar2 </strong>em number provavelmente já teve esse problema ou um dia terá.<br />
O problema aparenta ser simples quando tem uma variável varchar2 com caracteres estranhos no meio, mas e quando você tem certeza que o número esta certo. E quando to_number() funciona corretamente só quando o número é inteiro .<br />
Essa dor de cabeça aparece quando tem o separador de decimal e/ou de milhar, que é diferente conforme a localização usada. Geralmente usamos o ponto, que é o normal para programadores. Mas o oracle pode te pegar de calças curtas.</p>
<p>Vamos usar a simples query abaixo para demonstrar o problema</p>
<pre class="brush: sql">select to_number(&#039;3.1415&#039;, &#039;9D9999&#039;), 1/2 from dual;</pre>
<p>Rode a query abaixo para saber as configurações da sessão atual.</p>
<pre class="brush: sql">
 select *
   from v$nls_parameters
  where parameter in
		(&#039;NLS_LANGUAGE&#039;, &#039;NLS_CHARACTERSET&#039;);
</pre>
<p>Se retornar isso:</p>
<pre class="brush: text">
   	PARAMETER	        VALUE
1	NLS_LANGUAGE	    BRAZILIAN PORTUGUESE
2	NLS_CHARACTERSET	WE8ISO8859P1
</pre>
<p>A query de exemplo vai retornar erro: ORA-01722: invalid number</p>
<pre class="brush: text">
SQL&gt; select  to_number(&#039;3.1415&#039;, &#039;9D9999&#039;), 1/2 from dual;
select  to_number(&#039;3.1415&#039;, &#039;9D9999&#039;), 1/2 from dual
                  *
ERROR at line 1:
ORA-01722: invalid number
</pre>
<p>Se trocarmos o ponto pela vírgula vai funcionar perfeitamente</p>
<pre class="brush: text">
SQL&gt;  select  to_number(&#039;3,1415&#039;, &#039;9D9999&#039;), 1/2 from dual;

TO_NUMBER(&#039;3,1415&#039;,&#039;9D9999&#039;)        1/2
---------------------------- ----------
                      3,1415         ,5
</pre>
<p>Para funcionar com ponto, o <strong>NLS_LANG</strong> deve ser o <strong>AMERICAN_AMERICA.WE8ISO8859P1</strong>, mostrado abaixo:</p>
<pre class="brush: text">
   	PARAMETER	        VALUE
1	NLS_LANGUAGE	    AMERICAN
2	NLS_CHARACTERSET	WE8ISO8859P1
</pre>
<p>Desse forma se usarmos o ponto vai funcionar.</p>
<pre class="brush: text">
SQL&gt; select  to_number(&#039;3.1415&#039;, &#039;9D9999&#039;), 1/2 from dual
  2  ;

TO_NUMBER(&#039;3.1415&#039;,&#039;9D9999&#039;)        1/2
---------------------------- ----------
                      3.1415         .5
</pre>
<p>Com esse post demonstrei que o cliente é que manda, não sei tem como o DBA travar isso, mas pelo menos nos bancos que eu acesso tem essa característica.</p>
<p>Para alterar esse comportamento no linux basta usar o <strong>export </strong>para criar a variável NLS_LANG</p>
<pre class="brush: text">
export NLS_LANG=&quot;BRAZILIAN PORTUGUESE_BRAZIL.WE8ISO8859P1&quot;
export NLS_LANG=&quot;AMERICAN_AMERICA.WE8ISO8859P1&quot;
</pre>
<p>No <strong>windows </strong>vá nas propriedades do sistema, aba avançado e clique no botão variáveis de ambiente. Utilize o botão novo para criar uma nova variável, coloque no nome NLS_LANG e o valor que desejar.</p>
<p>Até mais,</p>
]]></content:encoded>
			<wfw:commentRss>http://www.furutani.com.br/2011/03/ora-01722-invalid-number/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JasperReports com Oracle ADF</title>
		<link>http://www.furutani.com.br/2010/12/jasperreports-com-oracle-adf/</link>
		<comments>http://www.furutani.com.br/2010/12/jasperreports-com-oracle-adf/#comments</comments>
		<pubDate>Tue, 07 Dec 2010 23:48:23 +0000</pubDate>
		<dc:creator>Roberto Furutani</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[jasperreports]]></category>

		<guid isPermaLink="false">http://www.furutani.com.br/?p=703</guid>
		<description><![CDATA[Olá Escrevo este post para deixar uma dica para quem precisa integrar ADF com JasperReports. No blog GEBS foi publicado um artigo sobre esse tema com direito a exemplo para download. Veja o artigo clicando no link a seguir: http://www.gebs.ro/blog/oracle/jasper-reports-in-adf/ Até mais Roberto]]></description>
			<content:encoded><![CDATA[<p>Olá</p>
<p>Escrevo este post para deixar uma dica para quem precisa integrar ADF com<a href="http://furutani.com.br/tags/ireport"> JasperReports</a>. No blog <a href="http://www.gebs.ro/">GEBS </a>foi publicado um artigo sobre esse tema com direito a exemplo para download.</p>
<p>Veja o artigo clicando no link a seguir: <a href="http://www.gebs.ro/blog/oracle/jasper-reports-in-adf/">http://www.gebs.ro/blog/oracle/jasper-reports-in-adf/</a></p>
<p>Até mais</p>
<p>Roberto</p>
]]></content:encoded>
			<wfw:commentRss>http://www.furutani.com.br/2010/12/jasperreports-com-oracle-adf/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Oracle e suas peripécias</title>
		<link>http://www.furutani.com.br/2010/10/oracle-e-suas-peripecias/</link>
		<comments>http://www.furutani.com.br/2010/10/oracle-e-suas-peripecias/#comments</comments>
		<pubDate>Fri, 22 Oct 2010 21:39:28 +0000</pubDate>
		<dc:creator>Roberto Furutani</dc:creator>
				<category><![CDATA[Oracle]]></category>

		<guid isPermaLink="false">http://www.furutani.com.br/?p=692</guid>
		<description><![CDATA[Olá Hoje o Oracle me deu um baile, como faço todos os dias, estava eu tranquilo fazendo minha procedure PL/SQL quando de repente começo a obter esse erro: LINE/COL ERROR -------- ------------------------------------------ 167/17 PL/SQL: ORA-00984: column not allowed here 160/7 PL/SQL: SQL Statement ignored Olho aqui, olho lá, leio e releio as linha indicadas mas [...]]]></description>
			<content:encoded><![CDATA[<p>Olá</p>
<p>Hoje o Oracle me deu um baile, como faço todos os dias, estava eu tranquilo fazendo minha <em>procedure </em>PL/SQL quando de repente começo a obter esse erro:</p>
<pre>LINE/COL ERROR
-------- ------------------------------------------
167/17   PL/SQL: ORA-00984: column not allowed here
160/7    PL/SQL: SQL Statement ignored</pre>
<p>Olho aqui, olho lá, leio e releio as linha indicadas mas nada de ter uma luz para resolver esse problema. Resolvo criar o teste no PLSQL  Developer (ver abaixo) com o trecho em torno da linha 167 mas o erro continua:</p>
<pre class="brush: sql">
declare
  -- Local variables here
  i integer;
  --num_iden number;
  --num_cli number;
begin
  -- Test statements here
  insert into cad_endereco
    (num_cli_ende,
     cod_ende_ende,
     num_iden_ende,
     cod_ende_ende,
     cod_situ_ende,
     data_ende,
     usu_ende)
  values
    (num_cli,
     &#039;0001&#039;,
     num_iden,
     &#039;0001&#039;,
     &#039;EN&#039;,
     &#039;01&#039;,
     sysdate,
     user);
end;
</pre>
<p>Como o quantidade de código diminui e o scroolbar sumiu percebi que as variáveis <strong>num_cli</strong> e <strong>num_iden</strong> não estavam declaradas, lógico que não iria funcionar.<br />
Visto isso, criei as benditas variáveis (no código acima estão comentadas). E não é que <strong>funcionou!!!</strong></p>
<p>Poxa vida!! Não dava para me mostrar uma mensagem mais intuitiva do tipo a variável num_cli não está criada seu idiota??!! Mas com um <em>column not allowed here</em> é pra acabar com o meu dia. Já vi erro cuja mensagens não era assim uma beleza, mas essa ganhou disparado.</p>
<p>[desabafo mode="off"]</p>
<p>Até mais,<br />
Roberto</p>
]]></content:encoded>
			<wfw:commentRss>http://www.furutani.com.br/2010/10/oracle-e-suas-peripecias/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>IsNumber em Oracle PL/SQL</title>
		<link>http://www.furutani.com.br/2010/02/isnumber-em-oracle-plsql/</link>
		<comments>http://www.furutani.com.br/2010/02/isnumber-em-oracle-plsql/#comments</comments>
		<pubDate>Fri, 05 Feb 2010 11:12:55 +0000</pubDate>
		<dc:creator>Roberto Furutani</dc:creator>
				<category><![CDATA[Oracle]]></category>

		<guid isPermaLink="false">http://www.furutani.com.br/?p=608</guid>
		<description><![CDATA[Olá Existem duas formas de verificar se uma string contém um número válido. A primeira forma é usando as funções translate, trim e length. Quando usadas em conjunto você obtém null se a string for número ou o comprimento da string sem espaços em branco. Veja abaixo: select length(trim(translate(&#039;minha_variavel&#039;, &#039; +-0123456789.&#039;, &#039; &#039;))) n1, length(trim(translate(&#039;123456789.9999&#039;, [...]]]></description>
			<content:encoded><![CDATA[<p>Olá</p>
<p>Existem duas formas de verificar se uma string contém um número válido. A primeira forma é usando as funções <strong>translate, trim e length</strong>. Quando usadas em conjunto você obtém <strong>null </strong>se a string for número ou o comprimento da string sem espaços em branco. Veja abaixo:</p>
<pre class="brush: php"> select

length(trim(translate(&#039;minha_variavel&#039;, &#039; +-0123456789.&#039;, &#039; &#039;))) n1,

length(trim(translate(&#039;123456789.9999&#039;, &#039; +-0123456789.&#039;, &#039; &#039;))) n2

from dual;
</pre>
<p>O resultado dessa query é:</p>
<p><strong>N1    N2</strong><br />
14    null</p>
<p>Outra forma é usando a função <strong>to_number()</strong>.  Caso a string passada contiver caracteres não numéricos é lançada uma exceção.</p>
<pre class="brush: php">

declare
n number;
s varchar2(10);
begin
s :=  &#039;1236&#039;;
n :=  to_number(s);
dbms_output.put_line(&#039;É número&#039;);
exception when others then
dbms_output.put_line(&#039;Não é número&#039;);
end;
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.furutani.com.br/2010/02/isnumber-em-oracle-plsql/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Introdução ao BPEL utilizando o Oracle SOA Suíte 10g</title>
		<link>http://www.furutani.com.br/2009/06/introducao-ao-bpel-utilizando-o-oracle-soa-suite-10g/</link>
		<comments>http://www.furutani.com.br/2009/06/introducao-ao-bpel-utilizando-o-oracle-soa-suite-10g/#comments</comments>
		<pubDate>Sun, 28 Jun 2009 01:29:14 +0000</pubDate>
		<dc:creator>Roberto Furutani</dc:creator>
				<category><![CDATA[Oracle]]></category>
		<category><![CDATA[SOA]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://www.furutani.com.br/?p=471</guid>
		<description><![CDATA[Olá! Para quem quer saber um pouco mais sobre BPEL e a ferramenta Oracle SOA Suite escrevi um artigo sobre eles. Disponibilizei o web service utilizado no artigo nesse endereço http://www.furutani.com.br/CalculadoraServices/services/Calculadora?wsdl Os fontes podem ser baixados clicando em e aqui. Espero que ajude. Até mais, Roberto]]></description>
			<content:encoded><![CDATA[<p>Olá!</p>
<p>Para quem quer saber um pouco mais sobre BPEL e a ferramenta Oracle SOA Suite escrevi um artigo sobre eles.</p>
<p><strong><span style="font-size: small;"><a href="http://www.furutani.com.br/a/Introducao-ao-BPEL-utilizando-o-Oracle-SOA-Suite-10g.pdf" title="Baixado: 3687 vezes. Tamanho: 4.53 MB">Introdução ao BPEL utilizando o Oracle SOA Suíte 10g</a> </span></strong><strong><span style="font-size: medium;"><a href="http://www.furutani.com.br/tutoriais/bpel/Introducao-ao-BPEL-utilizando-o-Oracle-SOA-Suite-10g.pdf"><em></em></a></span></strong></p>
<p>Disponibilizei o web service utilizado no artigo nesse endereço <a href="http://www.furutani.com.br/CalculadoraServices/services/Calculadora?wsdl" target="_blank">http://www.furutani.com.br/CalculadoraServices/services/Calculadora?wsdl</a></p>
<p>Os fontes podem ser baixados clicando em <a href="http://www.furutani.com.br/a/CalculadoraServices.war" title="Baixado: 561 vezes. Tamanho: 1.73 MB">CalculadoraServices.war</a>  e <a href="http://www.furutani.com.br/tutoriais/bpel/CalculadoraBPEL.zip" target="_blank">aqui</a>.</p>
<p>Espero que ajude.</p>
<p>Até mais,<br />
Roberto</p>
<div id="_mcePaste" style="overflow: hidden; position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px;"><a href="http://www.furutani.com.br/a/CalculadoraServices.war" title="Baixado: 561 vezes. Tamanho: 1.73 MB">CalculadoraServices.war</a> </div>
]]></content:encoded>
			<wfw:commentRss>http://www.furutani.com.br/2009/06/introducao-ao-bpel-utilizando-o-oracle-soa-suite-10g/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Quer passar objetos Java para procedure Oracle</title>
		<link>http://www.furutani.com.br/2009/05/quer-passar-objetos-java-para-procedure-oracle/</link>
		<comments>http://www.furutani.com.br/2009/05/quer-passar-objetos-java-para-procedure-oracle/#comments</comments>
		<pubDate>Sun, 31 May 2009 20:44:39 +0000</pubDate>
		<dc:creator>Roberto Furutani</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Oracle]]></category>

		<guid isPermaLink="false">http://www.furutani.com.br/?p=454</guid>
		<description><![CDATA[Olá Sabia que há a possibilidade de passar um objeto Java para dentro de uma procedure ou function do Oracle ? Dica do blog do André LS. Até mais, Roberto]]></description>
			<content:encoded><![CDATA[<p>Olá</p>
<p>Sabia que há a <a href="http://www.andrels.com/wp-pt_BR/?p=31" target="_blank">possibilidade de passar um objeto Java para dentro de uma procedure ou function do Oracle</a> ?</p>
<p>Dica do blog do <a href="http://www.andrels.com/" target="_blank">André LS</a>.</p>
<p>Até mais,<br />
Roberto</p>
]]></content:encoded>
			<wfw:commentRss>http://www.furutani.com.br/2009/05/quer-passar-objetos-java-para-procedure-oracle/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Oracle Java Stored Procedure</title>
		<link>http://www.furutani.com.br/2009/04/oracle-java-stored-procedure/</link>
		<comments>http://www.furutani.com.br/2009/04/oracle-java-stored-procedure/#comments</comments>
		<pubDate>Wed, 29 Apr 2009 13:05:29 +0000</pubDate>
		<dc:creator>Roberto Furutani</dc:creator>
				<category><![CDATA[Oracle]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://www.furutani.com.br/?p=409</guid>
		<description><![CDATA[Olá! No banco de dados Oracle, além de guardar dados é possivel criar rotinas para manipulá-los. A linguagem default é o PL/SQL mas é possivel criar rotinas em Java. Teoricamente é possível usar todos os recursos da linguagem e de mais algumas tecnologias como Java Mail, JMS, fazer chamadas a EJBs. Acredito que só não seja [...]]]></description>
			<content:encoded><![CDATA[<p>Olá!<br />
No banco de dados <a href="http://www.oracle.com">Oracle</a>, além de guardar dados é possivel criar rotinas para manipulá-los. A linguagem default é o <a href="http://pt.wikipedia.org/wiki/PL/SQL">PL/SQL</a> mas é possivel criar rotinas em <a href="http://www.java.com">Java</a>.<br />
Teoricamente é possível usar todos os recursos da linguagem e de mais algumas tecnologias como Java Mail, JMS, fazer chamadas a EJBs. Acredito que só não seja possível usar classes de interface gráfica (JFrame, JPanel e etc.).<br />
No caso do JavaMail é preciso que o objeto tenha um grant especial senão ele conseguirá enviar os emails.<br />
Abaixo um exemplo de classe que executa um update em uma tabela de paramêtros.</p>
<pre class="brush: java">
create or replace and compile java source named
Parametro as

import java.sql.*;
import oracle.jdbc.driver.*;

public class Parametro {
  public static java.lang.String
                            atualizarParam(java.lang.String codigo,
                                                java.lang.String valor)
                                                throws SQLException { 

    // Obtem um conexão com o banco de dados
    Connection conn = new OracleDriver().defaultConnection();

    String sql = &quot;UPDATE tab_param SET &quot; +
                    &quot;vlr_par = ? WHERE cod_param = ?&quot;;

    // Todos os parametros devem estar preenchidos
    if (codigo == null || valor == null){
       return &quot;Parametros nulo&quot;;
    }

    try {

      PreparedStatement pstmt = conn.prepareStatement(sql);
      pstmt.setString(1, valor);
      pstmt.setString(2, codigo);
      pstmt.executeUpdate();
      pstmt.close();
      conn.commit();

    } catch (SQLException e) {
        return e.getMessage();
    }

    return &quot;OK&quot;;
  }
}</pre>
<p>Como não é possível chamar a classe Java diretamente, preciamos criar uma função PL/SQL encarregada de invocar o método da classe Java.</p>
<pre class="brush: sql">
create or replace function fun_atualizar(codigo varchar2, valor varchar2)
  return varchar2 is
  LANGUAGE JAVA NAME &#039;Parametro.atualizarParam(java.lang.String, java.lang.String) return java.lang.String&#039;;</pre>
<p>Código para testar a função.</p>
<pre class="brush: sql">
declare
     retorno varchar2(500);
begin
     retorno := fun_atualizar(&#039;parametro&#039;,&#039;valor&#039;);

     dbms_output.put_line(retorno);

exception
     when others then
        dbms_output.put_line(&#039;Erro -&gt; &#039; || sqlerrm);
end;</pre>
<p>Caso ocorrer esse erro:</p>
<pre class="brush: sql">
ORA-29531: no method atualizarParam in class Parametro
</pre>
<p>Verifique se os tipo dos paramêtros na function atualizar estão corretos, por exemplo:<br />
- Se o nome das classes estão completos. Ao invés de String deve estar java.lang.String;<br />
- Se os tipos primitivos estão todas em minúsculas. No lugar de Int deve ser int ou FLOAT deve ser float.</p>
<p>Até mais</p>
]]></content:encoded>
			<wfw:commentRss>http://www.furutani.com.br/2009/04/oracle-java-stored-procedure/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

