Escolar Documentos
Profissional Documentos
Cultura Documentos
8/4/2014
sigla do ingls User Defined Functions). Elas permitem que o programador crie funes de diferentes tipos que retornem a informao desejada e que possam ser usadas dentro de declaraes SQL. Apenas para ilustrar, o programador pode, por exemplo, criar uma funo que exiba os nomes dos dias da semana em portugus e usar esta funo para preparar um relatrio. UDFs so recursos criados atravs de uma linguagem de programao que uma extenso do SQL. Outros objetos que so criados da mesma forma so os procedimentos armazenados e gatilhos (ou, se preferir, stored procedures e triggers, respectivamente). Por se tratar de uma extenso da linguagem SQL, cada fornecedor de sistemas gerenciadores de bancos de dados (SGBDs) cria a sua prpria linguagem particular. Assim, temos vrios dialetos em matria de linguagem procedural: a Oracle inclui no seu produto o PL/SQL, o SQL Server da Microsoft traz o T/SQL e a IBM usa no DB2 o SQL/PL. Todas elas so parecidas em sua estrutura, mas preciso cuidado na converso dos cdigos, porque as sintaxes acabam apresentando diferenas marcantes. Havamos mencionado nos artigos anteriores que a srie foi criada a partir de uma palestra que apresentei aos meus colegas de trabalho sobre o uso do DB2. Portanto, neste texto usaremos o SQL/PL para criao da maioria das funes e para fins ilustrativos mostrarei apenas um exemplo de UDF sendo criada em outros SGBDs.
http://www.devmedia.com.br/websys.5/webreader_print.asp?cat=2&artigo=4307&revista=impressao_96#a-4307
2/17
8/4/2014
Assumiremos neste artigo que o leitor j est familiarizado com conceitos bsicos de programao, alm de j dominar os conceitos da linguagem SQL apresentados nos artigos anteriores desta srie.
Tipos de UDFs
As UDFs so bastante versteis e existem diferentes tipos de funes para atender as mais variadas necessidades. Definimos o tipo de cada funo conforme o resultado que esta funo retorna ao ser executada. O padro SQL reconhece dois tipos principais, que so suportados pela maioria dos SGBDs relacionais: as funes escalares, que retornam um nico valor de um tipo de dados qualquer (nmeros, cadeia de caracteres, datas, etc); as funes tabulares, que retornam uma tabela, cuja estrutura (campos e tipos de dados) definida dentro da prpria funo e que no tem um limite de registros a serem retornados. Em geral, as UDFs podem ser criadas em SQL ou mesmo em uma linguagem externa ao SGBD, como C, C++, C#, JAVA, PHP, etc. Neste artigo, nos limitaremos a descrever as UDFs criadas via SQL. O leitor interessado em outras possibilidades deve pesquisar informaes sobre a criao de UDFs externas suportadas pelo seu SGBD especfico.
8/4/2014
internas do SGBD, destinada a ser usada dentro de declaraes SQL, como SELECT, INSERT, UPDATE e DELETE. Um procedimento armazenado no pode ser usado desta maneira, porque ele se destina a interagir com a aplicao. A estrutura de uma funo escalar inclui necessariamente a definio do nome da funo, o nome do parmetro de sada e seu tipo de dados. As funes em geral recebem parmetros de entrada, que precisam ter seus tipos de dados definidos tambm. Na Listagem 1, apresentamos a sintaxe para criao de uma UDF escalar simples, tambm conhecida como inline. Grosso modo, esta sintaxe pode ser usada em qualquer SGBD. A limitao que ela s se aplica criao de funes cuja lgica se restrinja a uma nica linha de cdigo (que simbolizamos na listagem como calculo_simples).
Listagem 1. Sintaxe para criao de UDF escalar simples.
C R E A T EF U N C T I O Nn o m e _ d a _ f u n c a o ( a r g u m e n t o 1t i p o _ d e _ d a d o s 1 ,. . .) R E T U R N St i p o _ d e _ d a d o s _ S a i d a R E T U R N( c a l c u l o _ s i m p l e s ) ;
Evidentemente, a criao de UDFs simples uma situao restrita, porque muitas vezes temos que considerar lgicas complexas, com desvios condicionais, etc. Nestes casos, a sintaxe muda para aceitar recursos de programao mais poderosos. A Listagem 2 mostra a sintaxe usada pelo DB2. Existem mais parmetros opcionais especficos deste SGBD que omitimos por questo de simplicidade.
Listagem 2. Sintaxe para criao de UDF escalar no DB2.
C R E A T EF U N C T I O Nn o m e _ d a _ f u n c a o( a r g u m e n t o 1t i p o _ d e _ d a d o s 1 ,. . .) R E T U R N St i p o _ d e _ d a d o s _ S a i d a L A N G U A G ES Q L B E G I NA T O M I C D E C L A R En o m e _ d a _ v a r i a v e lt i p o _ d e _ d a d o s ; . . . ; S E Tn o m e _ d a _ v a r i a v e l=( P r o c e d i m e n t o _ d e _ c a l c u l o ) ; . . . ; R E T U R Nn o m e _ d a _ v a r i a v e l ; E N D
Para ilustrar, vamos estudar como usar UDFs para solucionar um problema que vimos no artigo anterior desta srie: como calcular o primeiro dia do ms anterior. Naquela oportunidade, apresentamos um clculo de datas dentro da prpria declarao SQL. A inteno era ter uma lgica de manipulao de datas que pudesse ser empregada em qualquer SGBD. O primeiro problema daquela abordagem que a lgica um tanto confusa para se apresentar dentro do SELECT. O segundo, muito pior que o anterior, que a lgica falhava quando a consulta fosse usada durante o ms de Janeiro de cada ano. Nestes casos, a consulta retornaria uma mensagem de erro, que seria causada por esta lgica que mencionei. O erro ocorria porque a lgica no testava se o ms considerado era Janeiro. Nesta situao, seria necessrio usar um clculo diferente: mudar o ms para 12 e subtrair 1 unidade do ano. A Listagem 3 mostra a criao da UDF MesAnterior no DB2. A lgica usada identifica o ms correspondente data de referncia, para evitar o problema para clculo de Janeiro,
http://www.devmedia.com.br/websys.5/webreader_print.asp?cat=2&artigo=4307&revista=impressao_96#a-4307 4/17
8/4/2014
conforme citei anteriormente. Depois deste teste, feito um clculo para compor a data do ms anterior, concatenando o ano, ms e o dia 1. Para isso, so usadas as funes ANSISQL YEAR(), MONTH(), RIGHT() e CAST(). A funo RIGHT() s foi includa pra se garantir que o ms retornado ter sempre duas posies, tipo MM.
Listagem 3. Definindo a UDF escalar MesAnterior no DB2.
C R E A T EF U N C T I O NM e s A n t e r i o r( d t D a t a R e f e r e n c i ad a t e ) R E T U R N Sd a t e L A N G U A G ES Q L B E G I NA T O M I C D E C L A R Ed t D a t a R e s u l t a n t ed a t e ; I FM O N T H ( d t D a t a R e f e r e n c i a )>1T H E N S E Td t D a t a R e s u l t a n t e= C A S T( Y E A R ( d t D a t a R e f e r e n c i a )| |' ' | |R I G H T (' 0 '| |( M O N T H ( d t D a t a R e f e r e n c i a )-1 ),2 ) | |' 0 1 ' A SD A T E ); E L S E S E Td t D a t a R e s u l t a n t e= C A S T ( ( Y E A R ( d t D a t a R e f e r e n c i a ) 1 ) | |' 1 2 0 1 'A SD A T E ); E N DI F; R E T U R Nd t D a t a R e s u l t a n t e ; E N D
Como eu havia dito, a vantagem da lgica da Listagem 3 que ela pode ser reproduzida em qualquer SGBD. Porm, o DB2 oferece recursos de manipulao de datas que poderiam melhorar significativamente a performance desta funo. Apresentamos esta verso melhorada na Listagem 4. Esta lgica faz exatamente a mesma coisa que a lgica anterior, mas usa as funcionalidades de manipulao de datas do DB2 que nos permite acrescentar/subtrair dias, meses ou anos de uma data de referncia. Com isso temos uma lgica muito mais simples e limpa.
Listagem 4. Outra Verso da UDF escalar MesAnterior para o DB2.
C R E A T EF U N C T I O NM e s A n t e r i o r 2( d t D a t a R e f e r e n c i ad a t e ) R E T U R N Sd a t e R E T U R N( d t D a t a R e f e r e n c i a-1m o n t h+1d a y -d a y ( d t D a t a R e f e r e n c i a )d a y s ) ;
A lgica da Listagem 4 to simples que qualquer pessoa suporia que seu clculo deve ser mais rpido que o da lgica da Listagem 3. Na verdade, mesmo, como veremos mais adiante. Para satisfazer a curiosidade do leitor mais detalhista, vamos repetir a lgica da Listagem 4 para criar a mesma funo no SQL SERVER e no ORACLE. Veja na Listagem 5 a sintaxe para criao da funo no SQL SERVER.
Listagem 5. Reescrevendo a UDF escalar MesAnterior2 no SQL SERVER.
C R E A T EF U N C T I O NM e s A n t e r i o r 2( @ d t D a t a R e f e r e n c i as m a l l d a t e t i m e ) R E T U R N Ss m a l l d a t e t i m eA S B E G I N R E T U R N( d a t e a d d ( d ,1-d a y ( @ d t D a t a R e f e r e n c i a ), d a t e a d d ( m ,1,@ d t D a t a R e f e r e n c i a ) ) ) E N D
http://www.devmedia.com.br/websys.5/webreader_print.asp?cat=2&artigo=4307&revista=impressao_96#a-4307
5/17
8/4/2014
Fora as evidentes diferenas de sintaxe, vemos na Listagem 5 alguns detalhes importantes do SQL SERVER: 1. o SGBD no suporta o tipo de dados DATE, que padro ANSI SQL; necessrio usar o tipo SMALLDATETIME; 2. as variveis definidas dentro da funo devem ser precedidas do caractere @; 3. as operaes com datas so realizadas usando-se a funo DATEADD, que usa trs parmetros que especificam, respectivamente, a parte da data tratada (dia, ms, ano, etc), nmero que ser somado data e finalmente a data de referncia. No ORACLE, vamos criar esta funo com a declarao exibida na Listagem 6.
Listagem 6. Reescrevendo a UDF escalar MesAnterior2 no ORACLE.
C R E A T EO RR E P L A C EF U N C T I O NM E S A N T E R I O R 2( d t D a t a R e f e r e n c i ad a t e ) R E T U R Nd a t eI S d t R e t o r n od a t e: =c u r r e n t _ d a t e; B E G I N d t R e t o r n o: =T R U N C ( d t D a t a R e f e r e n c i a-i n t e r v a l' 1 'm o n t h ,' M M ' ) ; R E T U R Nd t R e t o r n o ; E N DM E S A N T E R I O R 2 ; /
Usando a funo TRUNC exibida na Listagem 6 o ORACLE calcula o primeiro dia do ms da data considerada como argumento. Assim, o argumento passado na UDF subtrai um ms da data de referncia e em seguida usa a funo TRUNC. E est pronto!
Agora vamos reescrever esta consulta usando uma UDF. Obviamente, a sintaxe ser exatamente a mesma independente de usarmos as UDFs MesAnterior ou MesAnterior2, uma vez que ambas usam os mesmo argumentos. Assim,
http://www.devmedia.com.br/websys.5/webreader_print.asp?cat=2&artigo=4307&revista=impressao_96#a-4307 6/17
8/4/2014
Veja que a sentena da Listagem 8 ficou bastante limpa com uso da UDF MesAnterior2. O nico cuidado foi corrigir o argumento usado na segunda chamada da UDF (data atual mais um ms). Claro que se poderia criar uma segunda UDF para clculo da data final do ms anterior, assim o SQL ficaria ainda mais simples. Apresentamos na Listagem 9 esta nova funo e o relatrio de ranking usando as duas UDFs criadas.
Listagem 9. UDF FimDoMes para o DB2 e seu Uso.
C R E A T EF U N C T I O NF i m D o M e s( d t D a t a R e f e r e n c i ad a t e ) R E T U R N Sd a t e R E T U R N( d t D a t a R e f e r e n c i a-d a y ( d t D a t a R e f e r e n c i a )d a y s ) ;
-U s od e s t af u n on or e l a t r i od er a n k i n g S E L E C TP . p k P r o d u t o ,P . P r o d u t o ,S U M ( T . V a l o r R e a l )A SD e m a n d a F R O Mt b l D e m a n d aT I N N E RJ O I Nt b l P r o d u t oPO NT . f k P r o d u t o=P . p k P r o d u t o W H E R ET . D a t aB E T W E E NM e s A n t e r i o r 2 ( C U R R E N T _ T I M E S T A M P ) A N DF i m D o M e s ( C U R R E N T _ T I M E S T A M P ) G R O U PB YP . p k P r o d u t o ,P . P r o d u t o ;
Nota Devman 1: Otimizador de Consultas: O plano de execuo de uma consulta o roteiro que define os passos que o mecanismo do SGBD dever realizar para conseguir executar uma consulta.
Este plano pode ser preparado usando-se diferentes estratgias e o usurio pode obter
http://www.devmedia.com.br/websys.5/webreader_print.asp?cat=2&artigo=4307&revista=impressao_96#a-4307 7/17
8/4/2014
informaes sobre ele atravs de ferramentas especficas, que retornam informaes em texto e/ou graficamente. Porm, no uma tarefa simples avaliar e decidir qual dos possveis planos de execuo o melhor deles, isto , qual deles tem menor custo de execuo em termos de performance e uso de recursos de hardware. Para isso que os principais SGBDs do mercado dispem de um componente interno muito importante chamado Otimizador de Consultas. este otimizador que avalia estes possveis planos com base em dados estatsticos e define qual deles ser efetivamente usado na execuo da consulta. O usurio at pode influenciar nas escolhas do otimizador, mas no recomendvel faz-lo. Via de regra, mais seguro confiar na escolha do otimizador, a menos que voc saiba exatamente o que est fazendo. As Figuras 2 e 3 mostram o plano de execuo das consultas apresentadas nas Listagens 7 e 8, respectivamente. Primeiramente, vemos que as Figuras 2 e 3 mostram diagramas visivelmente diferentes, mas cujo custo total de execuo praticamente o mesmo: 2.460,47 e 2.469,82, respectivamente. A diferena entre os custos de cada consulta irrisria, menos de 0,4%. Observando-se mais atentamente, notamos que os planos de execuo tm os mesmos passos, eles apenas so executados numa sequncia diferente, como se nota pelo ndice de cada um destes passos.
[abrir im age m e m jane la]
http://www.devmedia.com.br/websys.5/webreader_print.asp?cat=2&artigo=4307&revista=impressao_96#a-4307
8/17
8/4/2014
A Tabela 1 mostra esta sequncia em destaque e calcula o custo de execuo de cada etapa individual, j que os nmeros apresentados pelo VISUAL EXPLAIN representam o custo acumulado de todas as etapas que antecedem um dado passo.
[abrir im age m e m jane la]
http://www.devmedia.com.br/websys.5/webreader_print.asp?cat=2&artigo=4307&revista=impressao_96#a-4307
9/17
8/4/2014
A Tabela 1 traz informaes importantes, pois temos o clculo do custo de cada etapa. Mas observamos tambm que os dois planos de execuo usam exatamente as mesmas operaes, alm de que os custos de cada passo so praticamente os mesmos. Mas mais fcil observar isso na Tabela 2.
[abrir im age m e m jane la]
Note que o nico custo muito diferente o hash join (HSJOIN), pela simples razo de serem executados em momentos diferentes e, portanto, trabalhando com volumes de dados diferentes. Pela mesma razo, a etapa de ordenao de dados (SORT) tambm apresenta alguma diferena. Os demais passos so praticamente idnticos. Por este comparativo vemos que o otimizador de consultas consegue uma boa soluo para ambas as consultas, que acabam apresentando performance muito parecida.
http://www.devmedia.com.br/websys.5/webreader_print.asp?cat=2&artigo=4307&revista=impressao_96#a-4307 10/17
8/4/2014
De fato, no se espera que uma UDF seja usada para melhorar performance de uma consulta. No esse o seu propsito. As UDFs se propem a garantir que uma lgica complexa seja repetida consistentemente em diferentes consultas. Porm, necessrio cuidado com a lgica escolhida para uma UDF. Usamos na Listagem 8 uma funo com uma lgica muito simples e otimizada, que foi definida na Listagem 4. O Otimizador de Consultas do DB2 trata as funes como um pacote fechado, uma caixa preta, e no influencia na sua operao. Portanto, a UDF precisa garantir uma boa performance por si s, porque seu contedo no ser otimizado durante a execuo da consulta.
Vejamos um exemplo. Imagine que precisamos gerar um relatrio de vendas mensais por produto, mas que uma rotina que precisa ser repetida para todos os produtos da companhia. A ideia termos uma UDF tabular que aceite como parmetros o cdigo do produto e o ano desejado. Mais uma vez, usaremos sintaxe e funes disponveis no DB2. A Listagem 11
http://www.devmedia.com.br/websys.5/webreader_print.asp?cat=2&artigo=4307&revista=impressao_96#a-4307 11/17
8/4/2014
mostra esta UDF. Ela define uma funo que retorna uma tabela de quatro campos e ento faz um SELECT filtrando dados de demanda para o ano que informado como parmetro da funo. A questo aqui que se usa novamente uma composio de datas usando a funo CAST().
Listagem 11. Definindo a UDF tabular DemandaAno no DB2.
C R E A T EF U N C T I O ND e m a n d a A n o( @ i n t P r o d u t oI N T ,@ c h Y e a rC H A R ( 4 )) R E T U R N ST A B L E ( c o d P r o d u c tI N T , Y e a rI N T , M o n t hI N T , S a l e sD e c i m a l ( 9 , 2 ) ) L A N G U A G ES Q L R E A D SS Q LD A T AD E T E R M I N I S T I CN OE X T E R N A LA C T I O N B E G I NA T O M I C R E T U R N S E L E C Tf k P r o d u t o ,Y E A R ( D a t a ) ,M O N T H ( D a t a ) , S U M ( V a l o r R e a l )A SS a l e s F R O Mt b l D e m a n d a W H E R Ef k P r o d u t o=@ i n t P r o d u t o A N DD a t aB E T W E E NC A S T ( ( @ c h Y e a r| |0 1 0 1 )A SD A T E ) A N DC A S T ( ( @ c h Y e a r| |1 2 3 1 )A SD A T E ) G R O U PB Yf k P r o d u t o ,Y E A R ( D a t a ) ,M O N T H ( D a t a ) ; E N D
Via de regra, no uma boa ideia tratar datas como caracteres, assim como fizemos na Listagem 11. Esta prtica geralmente tem um impacto maior no desempenho da consulta do que se usssemos funes que lidam com datas e nmeros. Uma alternativa seria reescrever esta funo, mudando o parmetro de entrada @chYear para uma data de referncia e substituir as chamadas funo CAST (de converso de dados) por clculos do primeiro e do ltimo dia do ano para aquela data de referncia. Com estas informaes, apresentamos a nova UDF na Listagem 12. A grande diferena aqui que se usa novamente as funcionalidades do DB2 para manipulao de datas, tornando a declarao SQL muito mais limpa. Em outros SGBDs, a sintaxe e as funes so um tanto diferente. A seguir, a Listagem 13 apresenta a reproduo desta mesma lgica para uma UDF tabular criada no SQL SERVER.
Listagem 12. Outra verso da UDF tabular DemandaAno no DB2.
C R E A T EF U N C T I O ND e m a n d a A n o 2( @ i n t P r o d u t oI N T ,@ d t R e f e r e n c i aD A T E ) R E T U R N ST A B L E ( c o d P r o d u c tI N T , Y e a rI N T , M o n t hI N T , S a l e sD e c i m a l ( 9 , 2 ) ) L A N G U A G ES Q L R E A D SS Q LD A T AD E T E R M I N I S T I CN OE X T E R N A LA C T I O N B E G I NA T O M I C D E C L A R E@ d t I n i c i a lD A T E; D E C L A R E@ d t F i n a lD A T E;
S E T@ d t I n i c i a l=@ d t R e f e r e n c i a -d a y o f y e a r ( @ d t R e f e r e n c i a )d a y s+1d a y;
http://www.devmedia.com.br/websys.5/webreader_print.asp?cat=2&artigo=4307&revista=impressao_96#a-4307
12/17
8/4/2014
S E T@ d t F i n a l
-d a y o f y e a r ( @ d t R e f e r e n c i a )d a y s+1y e a r ; R E T U R N S E L E C Tf k P r o d u t o ,Y E A R ( D a t a ) ,M O N T H ( D a t a ) , S U M ( V a l o r R e a l )A SS a l e s F R O Mt b l D e m a n d a W H E R Ef k P r o d u t o=@ i n t P r o d u t o A N DD a t aB E T W E E N@ d t I n i c i a lA N D@ d t F i n a l G R O U PB Yf k P r o d u t o ,Y E A R ( D a t a ) ,M O N T H ( D a t a ) ; E N D
I N S E R TI N T O@ t m p R e s u l t a d o S E L E C Tf k P r o d u t o ,Y E A R ( D a t a ) ,M O N T H ( D a t a ) , S U M ( V a l o r R e a l )A SS a l e s F R O Mt b l D e m a n d a W H E R Ef k P r o d u t o=@ i n t P r o d u t o A N DD a t aB E T W E E N@ d t I n i c i a lA N D@ d t F i n a l G R O U PB Yf k P r o d u t o ,Y E A R ( D a t a ) ,M O N T H ( D a t a ) ;
R E T U R N E N D
Talvez a diferena mais importante entre as sintaxes do DB2 e SQL SERVER que neste ltimo precisamos definir uma varivel de tabela (@tmpResultado) e inserir registros nela. Veja que definimos esta varivel no incio da funo e ao final no fechamento da funo, quando aparece a palavra reserva RETURN, nem preciso informar que ela a tabela retornada, pela simples razo de que a funo s pode retornar um nico objeto tabela. Essa a sintaxe do SQL SERVER para funes tabulares que incluem vrias declaraes. A sintaxe mais simples quando se trata de funes de uma nica declarao (as funes inline). No caso do ORACLE, o processo mais complexo. So necessrios alguns passos intermedirios, como a criao de um tipo de dados que retorne um objeto. O processo como um todo tem uma estrutura bastante diferente dos DB2 ou SQL SERVER, alm de ter um processamento diferente tambm. Deixamos para o leitor mais curioso checar na seo Referncias as instrues sobre como proceder para criao de UDFs tabulares no ORACLE.
http://www.devmedia.com.br/websys.5/webreader_print.asp?cat=2&artigo=4307&revista=impressao_96#a-4307
13/17
8/4/2014
http://www.devmedia.com.br/websys.5/webreader_print.asp?cat=2&artigo=4307&revista=impressao_96#a-4307
14/17
8/4/2014
As consultas exibidas nas Listagens 14 e 15 usam os mesmos parmetros de cdigo de produto e data e retornam exatamente o mesmo resultado, que o apresentado na Tabela 3. Feitas as consideraes, vamos ao que interessa. Para comear, vejamos os planos de execuo destas consultadas apresentados nas Figuras 4 e 5.
[abrir im age m e m jane la]
http://www.devmedia.com.br/websys.5/webreader_print.asp?cat=2&artigo=4307&revista=impressao_96#a-4307
15/17
8/4/2014
Analisando a Figura 5, vemos que o plano de execuo da consulta tem um custo baixo: 262,18. Por este nmero, entendemos que a consulta est bem otimizada e tem um bom desempenho. Porm, quando olhamos a Figura 4 com mais ateno, notamos que ela mostra um custo surpreendentemente baixo: 15,1439. Este nmero realmente muito estranho. Ele sugere que a performance com a UDF tabular muito melhor do que a consulta direta, o que no verdade! O que acontece que a UDF tabular tratada como um bloco e o que vemos no plano de execuo no inclui o custo de execuo da UDF. Para verificar este comportamento, basta checar no DATA STUDIO o tempo de execuo da consulta. As Figuras 6 e 7 mostram estes resultados.
Agora sim temos nmeros mais representativos! A consulta direta roda em 734 milissegundos, enquanto que a consulta com a UDF tabular roda em 6s 422 milissegundos, ou seja, 775% mais tempo!
http://www.devmedia.com.br/websys.5/webreader_print.asp?cat=2&artigo=4307&revista=impressao_96#a-4307 16/17
8/4/2014
Portanto muito cuidado ao se usar UDFs tabulares. Alm de terem um impacto importante na performance, muitas vezes as informaes que temos a seu respeito mascaram a sua performance real, que pode facilmente levar a decises desastrosas.
[abrir im age m e m jane la]
Concluso
Vimos aqui informaes bsicas sobre a criao, uso e performance de UDFs. UDFs so recursos muito interessantes e teis, pois permitem ao usurio criar funes customizadas que atendam necessidades especficas de uma aplicao. E ainda oferecem a facilidade de poder retornar variveis de diferentes tipos de dados (inteiros, caracteres, datas, tabelas, etc). Mas as UDFs devem ser usadas com cuidado, especialmente as UDFs tabulares. necessrio muito cuidado com otimizao do cdigo das UDFs durante a fase de desenvolvimento, pois como mostramos aqui, uma vez criada, a UDF tratada como uma caixa-preta pelo otimizador de consultas do SGBD. No prximo artigo, vamos estudar as expresses de tabela (conhecidas como CTEs Common Table Expressions), recursos muito interessantes e poderosos e que permitem inclusive operao de clculos recursivos dentro de consultas SQL. At l!
Wagner Crivelini
Engenheiro formado pela UNICAMP, consultor em TI com 15 anos de experincia, particularmente em projetos de Business Intelligence. Atualmente trabalha na IBM, onde atua como DBA em projeto internacional.
http://www.devmedia.com.br/websys.5/webreader_print.asp?cat=2&artigo=4307&revista=impressao_96#a-4307
17/17