<?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; execute immediate</title>
	<atom:link href="http://www.diaadiaoracle.com.br/category/execute-immediate/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>Oracle Execute Immediate SQL Dinâmico</title>
		<link>http://www.diaadiaoracle.com.br/2009/04/28/oracle-execute-immediate-sql-dinamico/</link>
		<comments>http://www.diaadiaoracle.com.br/2009/04/28/oracle-execute-immediate-sql-dinamico/#comments</comments>
		<pubDate>Tue, 28 Apr 2009 02:05:00 +0000</pubDate>
		<dc:creator>oracle</dc:creator>
				<category><![CDATA[dinamico]]></category>
		<category><![CDATA[execute immediate]]></category>
		<category><![CDATA[oracle]]></category>
		<category><![CDATA[query]]></category>
		<category><![CDATA[sql]]></category>

		<guid isPermaLink="false">http://www.diaadiaoracle.com.br/?p=8</guid>
		<description><![CDATA[Fala pessoAll,
Vamos nós novamente.
A pedido do amigo Marcos Castro dessa vez estaremos falando sobre SQL Dinâmicos, um recurso muito interessante no PL/SQL que em diversas vezes não é utilizado por nossos excelentíssimos desenvolvedores, fazendo com que nossos códigos sejam bem maiores, bem mais complexos e bem mais chatos de dar manutenção. Mas&#8230; o lado B [...]]]></description>
			<content:encoded><![CDATA[<p>Fala pessoAll,</p>
<p>Vamos nós novamente.<br />
A pedido do amigo Marcos Castro dessa vez estaremos falando sobre SQL Dinâmicos, um recurso muito interessante no PL/SQL que em diversas vezes não é utilizado por nossos excelentíssimos desenvolvedores, fazendo com que nossos códigos sejam bem maiores, bem mais complexos e bem mais chatos de dar manutenção. Mas&#8230; o lado B dessa história é: Se você complicar muito no uso de SQL Dinâmico, não tenha dúvida de que seu código vai ficar muito complexo e todo mundo que for dar manutenção vai te xingar um bocado! Rsrs.</p>
<p>Vamos lá, ao exemplo prático e simples, que é o que interessa.</p>
<p>Suponha que você tem uma função para ser feita, que deve retornar o nome de uma determinada pessoa&#8230; essa pesquisa pode ser pelo seu RG, CPF ou Habilitação. Como podemos fazer isso?</p>
<p>Exemplo 1 (sem SQL Dinâmico):</p>
<p>create or replace function pesquisa_pessoa(pcodigo number, pfiltro varchar2) return varchar2 is<br />
   v_nome_pessoa pessoas.nome%type;<br />
begin<br />
   if(pfiltro = &#8216;RG&#8217;) then<br />
      select nome<br />
         into v_nome_pessoa<br />
        from pessoas<br />
      where rg = pcodigo;<br />
   elsif(pfiltro = &#8216;CPF&#8217;) then<br />
      select nome<br />
         into v_nome_pessoa<br />
        from pessoas<br />
      where cpf = pcodigo;<br />
   elsif(pfiltro = &#8216;CNH&#8217;) then<br />
      select nome<br />
         into v_nome_pessoa<br />
        from pessoas<br />
      where cnh = pcodigo;<br />
   end if;</p>
<p>   return v_nome_pessoa;<br />
end;</p>
<p>Notemos que o SQL é o mesmo sempre (select nome into v_nome_pessoa from pessoas where &#8230; = pcodigo ), o que muda é apenas o nome do campo que será utilizado para filtrar a pessoa, portanto, podemos utilizar o recurso de SQL Dinâmico para otimizar este código, e como ele ficaria? Assim:</p>
<p>create or replace function pesquisa_pessoa(pcodigo number, pfiltro varchar2) return varchar2 is<br />
v_nome_pessoa pessoas.nome%type;<br />
v_where varchar2(50);<br />
begin<br />
if(pfiltro = &#8216;RG&#8217;) then<br />
v_where := &#8216;rg&#8217;;<br />
elsif(pfiltro = &#8216;CPF&#8217;) then<br />
v_where := &#8216;cpf&#8217;;<br />
elsif(pfiltro = &#8216;CNH&#8217;) then<br />
v_where := &#8216;cnh&#8217;;<br />
end if;</p>
<p>dbms_output.put_line(&#8217;select nome into v_nome_pessoa from pessoas where &#8216;||v_where||&#8217; = &#8216;||pcodigo||&#8217;;');</p>
<p>execute immediate &#8217;select nome from pessoas where &#8216;||v_where||&#8217; = &#8216;||pcodigo<br />
into v_nome_pessoa;</p>
<p>return v_nome_pessoa;<br />
end;</p>
<p>Bem mais simples, e não precisamos ficar repetindo o mesmo comando várias vezes.</p>
<p>Bom, isso é só um exemplo bem simples, mas&#8230; o Execute Immediate pode ser usado de diversas outras maneiras.</p>
<p>Achei um site bem interessante, que mostra as diversas usabilidades deste recurso com exemplos que podem ser utilizados para um melhor entendimento. O site é o DBA Support.</p>
<p>É isso aí, espero que este recurso seja útil e bem utilizado nas suas aplicações.</p>
<p>Atc.</p>
<p>Gerson Júnior</p>
<p>(gerson.vasconcelos@gmail.com)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.diaadiaoracle.com.br/2009/04/28/oracle-execute-immediate-sql-dinamico/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>
