Já usei sim, Marcelo, mas eu tinha um problema de compatibilidade de uma aplicação desenvolvida para o Oracle, sendo utilizado com o PostgreSQL. Neste caso de migração, era mais simples criar as funções nvl do que ter que alterar centenas de SQL. A questão é: existe algum tipo de dado generico que se possa utilizar nos argumentos dessas funções?
Rudinei Dias Marcelo Angelo da Cunha Battistini wrote: > Voce já chegou a usar a funcão coalesce()? > > sintaxe. > select coalesce(campo,valor) > > > -----Mensagem original----- > De: [EMAIL PROTECTED] > [mailto:[EMAIL PROTECTED] nome de Rudinei Dias > Enviada em: quinta-feira, 7 de dezembro de 2006 09:12 > Para: [EMAIL PROTECTED]; Grupo de Usuários do PostgreSQL no Brasil > Assunto: Re: [PostgreSQL-Brasil]Colaboração: Funções > > > Colega, gostei da idéia. > Então começo com duas sugestões e também com um questionamento. > > Sugestaão 1: > > Como antes de vir para o PostgreSQL trabalhava muito com ORACLE, me > deparei com a terrível falta do comando NVL, que em caso do campo ser > null numa querie, retornava um valor default como segue: > select nvl(campo, 0) as novonome, .... > from tabela. > onde o primeiro argumento é o nome do campo e o segundo o valor dafault. > Então desenvolvi a função nvl no pg/plsql da seguinte forma: > CREATE OR REPLACE FUNCTION nvl(int4, int4) > RETURNS int4 AS > $BODY$ > DECLARE > pCAMPO ALIAS FOR $1; > pSUBST ALIAS FOR $2; > BEGIN > if (pCAMPO isnull) then > return pSUBST; > else > return pCAMPO; > end if; > end > $BODY$ > LANGUAGE 'plpgsql' VOLATILE; > O problema que me deparei é que precisei criar uma função nvl para cada > tipo de dado tratado, não chega a ser um problema, mas é chato... > - CREATE OR REPLACE FUNCTION nvl("numeric", int4) RETURNS int4 AS > - CREATE OR REPLACE FUNCTION nvl(bpchar, bpchar) RETURNS bpchar AS > - CREATE OR REPLACE FUNCTION nvl(date, date) RETURNS date AS > Estas funções "quebraram meu galho", funcionando bem e rápido, > principalmente nos casos de portabilidade de aplicações entre bancos > distintos. > Poderiam ser melhores, nesse sentido peço a colaboração de vocês. Tem > como definir tipo de dado genérico no postgres, sem a necessidade de > fazer CAST? > > Sugestão 2: > > Também senti falta de uma função de conversão to_number (oracle), que > faz a conversão pbchar para numero. Como precisei, novamente por > questões de portabilidade de aplicações, a criei: > CREATE OR REPLACE FUNCTION to_number(bpchar) > RETURNS int8 AS > $BODY$ > DECLARE > pCAMPO ALIAS FOR $1; > cCAMPO bpchar; > vCAMPO int8; > BEGIN > cCAMPO := trim(translate(upper(pCAMPO),'ÚÁÉÍÓÔÛÎÂÊÃÕÜÙÀÈÌÒ > QWERTYUIOP[]ASDFGHJKL;ZXCVBNM,./<>?|{}:"-_=+)(*&[EMAIL PROTECTED]','')); > if (cCAMPO='') then > cCAMPO='0'; > end if; > vCAMPO := CAST (cCAMPO as int8); > --vCAMPO := cCAMPO; > return vCAMPO; > end > $BODY$ > LANGUAGE 'plpgsql' VOLATILE; > > > Estas funções podem não ser o "Estado da Arte", mas resolveram meus > problemas naquele determinado momento e situação. > > Por favor, teçam comentários. > > Rudinei Dias > > > > > > > Iannsp wrote: > >> [EMAIL PROTECTED] escreveu: >> >> >>> Pessoal, >>> >>> Se me permitem uma colaboração: >>> >>> <plpgsql> >>> >>> drop function dias_nummes(integer, integer); >>> create or replace function dias_nummes(integer, integer) returns >>> integer as >>> $$ >>> select >>> extract(day from (date (trim(to_char($2, '0000'))||'-'||trim(to_char($1, >>> '00'))||'-01') + interval '1 month') - interval '1 day')::integer; >>> $$ language 'sql'; >>> >>> select dias_nummes(1, 2006), dias_nummes(2, 2006), dias_nummes(12, 2006), >>> dias_nummes(2, 2004); >>> >>> </plpgsql> >>> >>> Só com SQL resolve-se o problema, inclusive do ultimo dia de Dezembro. >>> >>> Cordialmente, >>> >>> >>> -- >>> Fabrízio de Royes Mello >>> [EMAIL PROTECTED] >>> _______________________________________________ >>> Grupo de Usuários do PostgreSQL no Brasil >>> Antes de perguntar consulte o manual >>> http://pgdocptbr.sourceforge.net/ >>> >>> Para editar suas opções ou sair da lista acesse a página da lista em: >>> http://pgfoundry.org/mailman/listinfo/brasil-usuarios >>> >>> >>> >>> >> Gostei da resposta, pensei en usar o interval mas não quiz o overhead de >> buscar mais uma funcao se com aritimética simples resolvia, mas ficou a >> mais simples mesmo, creio eu. >> >> Pessoal, pensei em propor o seguinte a todos: Que tal começarmos a >> enviar propostas para esta lista de soluções para problemas do dia a dia? >> >> Nós vamos enviando sugestoes de problemas e os integrantes que tiverem >> afim vão respondendo com sugestoes de codigo para que cheguemos no final >> à uma "biblioteca "de funcoes que podem ajudar a todos. >> Bem, se me permitem sugiro os problemas abaixo, que se encaixam em >> problemas do tipo simples. >> A intenção é criar funcoes que possam ser usadas em qualquer situação, >> portanto, genéricas. >> >> -Pesquisar palavras sem acentos. >> -Limpar valores de espaços duplos e espaços no inicio e fim. >> -limpar valores de substrings quaisquer. >> -verificar dia da semana com resposta em numero e em texto em portugues. >> -retornar mes em portugues. >> -calcular diferenca de dias entre datas. >> -exemplo de funcoes cujo parametro de entrada seja array para que mais >> pessoas conheçam esse tipo de implementação. >> -modelos de ACL. >> -exemplos de funções recursiva >> >> Bem, estes itens seriam iniciais e quem desejar poderia adicionar mais >> itens. >> Creio que isso vai facilitar em muito o trabalho de iniciantes e talvez >> mostre a muito usuários atuais maneiras diferentes de se resolver os >> mesmos "problemas". >> >> Obrigado. >> Grande Abraço. >> >> >> >> > > _______________________________________________ > Grupo de Usuários do PostgreSQL no Brasil > Antes de perguntar consulte o manual > http://pgdocptbr.sourceforge.net/ > > Para editar suas opções ou sair da lista acesse a página da lista em: > http://pgfoundry.org/mailman/listinfo/brasil-usuarios > _______________________________________________ > Grupo de Usuários do PostgreSQL no Brasil > Antes de perguntar consulte o manual > http://pgdocptbr.sourceforge.net/ > > Para editar suas opções ou sair da lista acesse a página da lista em: > http://pgfoundry.org/mailman/listinfo/brasil-usuarios > _______________________________________________ Grupo de Usuários do PostgreSQL no Brasil Antes de perguntar consulte o manual http://pgdocptbr.sourceforge.net/ Para editar suas opções ou sair da lista acesse a página da lista em: http://pgfoundry.org/mailman/listinfo/brasil-usuarios
