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

Responder a