<?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; procedures</title>
	<atom:link href="http://www.diaadiaoracle.com.br/category/procedures/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>Oralce PL/SQL &#8211; Funções (Funtions) e Procedures</title>
		<link>http://www.diaadiaoracle.com.br/2009/03/27/oralce-plsql-funcoes-funtions-e-procedures/</link>
		<comments>http://www.diaadiaoracle.com.br/2009/03/27/oralce-plsql-funcoes-funtions-e-procedures/#comments</comments>
		<pubDate>Fri, 27 Mar 2009 20:22:00 +0000</pubDate>
		<dc:creator>oracle</dc:creator>
				<category><![CDATA[functions]]></category>
		<category><![CDATA[oracle]]></category>
		<category><![CDATA[pl/sql]]></category>
		<category><![CDATA[procedures]]></category>

		<guid isPermaLink="false">http://www.diaadiaoracle.com.br/?p=6</guid>
		<description><![CDATA[Fala PessoAll,
Bom&#8230; hoje em mais um dia a dia de trabalho, rolou mais uma dúvida sobre o uso de procedures e funções no PL/SQL. Aí fiz a seguinte pergunta: Qual a diferença entre Procedure e Function no PL/SQL? Aí surgiram aquelas velhas respostas decoradas da faculdade: &#8220;Procedure não retorna valor!&#8221;, &#8220;Função retorna valor e procedure [...]]]></description>
			<content:encoded><![CDATA[<p>Fala PessoAll,</p>
<p>Bom&#8230; hoje em mais um dia a dia de trabalho, rolou mais uma dúvida sobre o uso de procedures e funções no PL/SQL. Aí fiz a seguinte pergunta: Qual a diferença entre Procedure e Function no PL/SQL? Aí surgiram aquelas velhas respostas decoradas da faculdade: &#8220;Procedure não retorna valor!&#8221;, &#8220;Função retorna valor e procedure não retorna.&#8221;, entre outras. Vamos lá então:</p>
<p>No Oracle a diferença básica entre uma e outra é que a Function OBRIGATÓRIAMENTE tem que retornar um valor, você pode até criar a função e compilar ela sem um Return, mas na hora que você rodar esta função você vai obter um erro oracle dizendo que: &#8220;Function Retorned withou value&#8221;, ou seja, função não retorna nenhum valor (algo parecido), e não funciona. Porque a diferença básica? Porque procedures no Oracle também podem retornar valores, isso mesmo, basta você criar um parametro do tipo OUT, assim:<br />
<code><br />
create or replace procedure pr_teste(p_t number, p_ret out varchar2) is<br />
begin<br />
if(p_t = 1) then<br />
p_ret := 'É 1';<br />
else<br />
p_ret := 'Não é 1';<br />
end if;<br />
end;<br />
</code><br />
Neste exemplo de código, note que estamos atribuindo ao parâmetro <code>p_ret</code> o valor que será retornado para o local que chamou essa procedure (veremos exemplo desta chamada nos exemplos a seguir).</p>
<p>Ah&#8230; então, se as duas retorna valor, porque eu tenho procedure e function? E porque eu uso uma e não outra ou a outra e não uma?</p>
<p>Vamos aos pontos de cada uma delas:</p>
<p><strong>Nas Funtions:</strong><br />
- Pode ser usada em comandos select, insert etc para ser retornada como uma coluna da query:<br />
<code>select codigo, nome, fn_calculaIdade(codigo) Idade from pessoas;</code> Neste exemplo, fn_calculaIdade recebe o codigo da pessoa como parametro e retorna a idade dela, isso será exibido como uma coluna na query com nome <code>Idade</code></p>
<p>- Pode ser atribuida diretamente a uma variável:<br />
<code><br />
declare<br />
v_idade number;<br />
begin<br />
.<br />
.<br />
v_idade := fn_calculaIdade(codigo);<br />
.<br />
.<br />
end;<br />
</code></p>
<p>Neste exemplo, estamos no meio de um bloco PL/SQL e atribuímos diretamente a uma variável o valor que retornará da função.</p>
<p>E mais algumas coisas sobre função.</p>
<p><strong>Nas Procedures:</strong><br />
- O grande &#8220;plus&#8221; das procedures é: Podem retornar mais de um resultado! Ah&#8230; isso mesmo, essa é a grande vantagem das procedures, existe a possibilidade de ser retornado mais de um retorno (retornar retorno, coisa feia não? você entenderá jájá), coisa que é completamente impossível usando função. Funções só retornam um único resultado.</p>
<p>Complicou? Vamos ao exemplo:</p>
<p>Primeiro vamos criar uma procedure com 3 (isso mesmo 3, três, III, rsrs) parâmetros de retorno:</p>
<p><code><br />
create or replace procedure pr_buscaEndereco(p_codigo_pessoa number, p_rua out varchar2, p_bairro out varchar2, p_cidade out varchar2) is<br />
begin<br />
begin<br />
select rua,<br />
estado,<br />
cidade<br />
into p_rua,<br />
p_bairro,<br />
p_cidade<br />
from pessoas<br />
where codigo = p_codigo_pessoa;<br />
exception<br />
when no_data_found then<br />
p_rua    := 'Rua não encontrada.';<br />
p_bairro := 'Bairro não encontrada.';<br />
p_cidade := 'Cidade não encontrada.';<br />
end;<br />
end;<br />
</code><br />
Note que os parâmetros que serão usados para retorno, tem uma cláusula OUT na frente do tipo, isso que diferencia ele de um parâmetro comum, IN.</p>
<p>Ah&#8230; bom, mas e como é que eu vou usar isso? Assim:<br />
<code><br />
declare<br />
v_pessoa_rua    varchar2(100);<br />
v_pessoa_bairro varchar2(100);<br />
v_pessoa_cidade varchar2(100);<br />
begin<br />
pr_teste(212, v_pessoa_rua, v_pessoa_bairro, v_pessoa_cidade);<br />
dbms_output.put_line('Endereço da pessoa 212: Rua: '||v_pessoa_rua||' Bairro: '||v_pessoa_bairro||' Cidade: '||v_pessoa_cidade);<br />
end;<br />
</code></p>
<p>Neste exemplo, temos três variáveis criadas, estas três variáveis são passadas na chamada da procedure e como estes parâmetros no qual elas são passadas são OUT, irão retornar algum valor, que será o valor da variável após execução da procedure.</p>
<p>É isso aí, portanto, caso você precise de uma função que retorne mais de um valor, não tente criar uma função genérica cheia de IF&#8217;s e chamar ela mais de uma vez fazendo o mesmo select em colunas diferentes, use uma procedure com mais de um parâmetro OUT que isso provavelmente resolverá seus problemas.</p>
<p>Momento DBA: Lembrem que quanto menos funções são chamadas, mais agradável para o banco. A cada função que chamamos o banco vai ter que ver, executar, retornar, isso usa memória, processador e etc. Se no lugar de 10 chamadas para uma função voce usar uma procedure com 10 parametros OUT, é bem menos &#8220;doloroso&#8221; para o banco. Outra coisa que é muito importante e que ocorre muito é usar função para retornar como uma determinada coluna de um comando select&#8230; lembre-se que se está função está na clausula <code>select</code> ela será chamada exatamente a quantidade de vezes de quantos registros existirem. No exemplo da função <code>fn_calculaIdade</code> que citei lá em cima, se tivermos 1.000.000 de registros, esta função será executada 1.000.000 de vezes, se é uma função mais robusta e complexa, imagine pra onde vai a performance da sua query. Além da perda de performance na query, de quebra você ainda perde uma credibilidade com o DBA! Que quando você degradar o banco todo, ele vai ficar bravo com você!!</p>
<p>Grande abraço a todos.</p>
<p>Fiquem a vontade para comentários e/ou e-mails.</p>
<p>Atc.<br />
Gerson Júnior<br />
gerson.vasconcelos@gmail.com</p>
]]></content:encoded>
			<wfw:commentRss>http://www.diaadiaoracle.com.br/2009/03/27/oralce-plsql-funcoes-funtions-e-procedures/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
