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