Buenas pessoal, hoje rapidamente lembrei de algo que muitas vezes e comum mas nao e de uso de todos. Fazer SQL com campos de tabelas associadas. Ou a grosso modo, pegar o valor de um campo de outra tabela e mostrar no sql que estamos construindo. No PG, eu tenho sempre uma funcao que ao passar o ID que esta gravado na tabela principal a tabela secundaria, me retorna o valor do campo que desejo. Isto, daria para fazer sem a necessidade de uma funcao, mas e mais organizado e tu pode aproveitar em outras partes do sistema.Bom, esta funcao, recebe o ID da Cidade que esta na tabela de clientes e retorna o nome da cidadeCREATE OR REPLACE FUNCTION "RetornaCidadeNome"(Integer) RETURNS Varchar AS$BODY$ Select Cast("NomeCidade" as Varchar) From "Cliente" Where "CodigoIDCliente"=$1$BODY$ LANGUAGE 'sql';Este e o SQL que mostra os dados dos clientes mais o nome da cidade, do cliente 1 ao 1000Select "CodigoCliente", "NomeCliente, "RetornaCidadeNome"("CodigoIDCidadeCliente") as "XNomeCidade"From "Cidade"Where "CodigoCliente" between 1 and 1000;Detalhes: Aspas duplas, garante que no postgresql o nome da funcao fique como foi digitada.Obs: Pessoal, fiz algumas alteracoes pontuacoes, das quais, estao em negrito. Neste exemplo, criei em plpgsql, uma funcao para o calculo do modulo10, para usar na geracao do "Nosso Numero" para a remessa e bloquetos do banco do brasil. CREATE OR REPLACE FUNCTION "TS_CalculaModulo10BancoBrasili"(xdocumento character varying) RETURNS character varying AS$BODY$declare XNumero Varchar; XNumeroOrg Varchar; XCont Integer; XParcial Integer; XParcialPosterior Integer; XDivisorM10 Integer; XResto Integer; XDigVerM10 Varchar(1); XMultiplo Integer; XTotalM10 Integer; begin /* Funcao responsavel por calcular o modulo 10 para os campos da linha digitavel cobranca banco do brasil */ --Pegando somente os numeros do documentos XNumeroOrg = regexp_replace(XDocumento, '[^[:digit:]]', '', 'g'); /* *** Calculando Modulo "10" *** */ XDivisorM10 = 2; XParcial = 0; XNumero = trim(XNumeroOrg); XCont = length(XNumero); loop XTotalM10 = Cast(SubStr(trim(XNumero),XCont,1) as Integer) * XDivisorM10; if XTotalM10 < 10 then XParcial = XParcial + XTotalM10; else XParcial = XParcial + (Cast(SubStr(XTotalM10,1,1) as Integer) + Cast(SubStr(XTotalM10,2,1) as Integer)); end if; XCont = XCont - 1; if XCont = 0 then Exit; end if; --Pegando numero a numero e multiplicando por 2 e 1 e acumulando o resultado linha a linha if XDivisorM10 = 1 then XDivisorM10 = 2; else XDivisorM10 = 1; end if; end loop; /* Apos achar o resto da divisao, encontrar o maior valor da soma e fazer a subtracao */ if Length(XParcial) <= 2 then XParcialPosterior = (SubStr(Cast(XParcial+10 as Varchar),1,1)||'0'); elsif Length(XParcial) = 3 then XParcialPosterior = (SubStr(Cast(XParcial+10 as Varchar),1,2)||'0'); elsif Length(XParcial) = 4 then XParcialPosterior = (SubStr(Cast(XParcial+10 as Varchar),1,2)||'0'); end if; if (XParcialPosterior-XParcial) = 10 then -- Se maior que 9 desmembrar o numero e soma-los Resto = 18 fazer 1 + 8 = 9 Return (0); else Return (XParcialPosterior-XParcial); end if; end;$BODY$ LANGUAGE 'plpgsql' VOLATILE;*** Para executar esta funcao digite: ***Select "TS_CalculaModulo10BancoBrasili"('12345678')No proximo post, mostrarei a funcao que calcula o DV, usando o modulo11. Neste artigo, eu tento demostrar o uso que eu faco dos comandos "Create Type" e do "Execute". O "Create Type", permite criar um novo tipo de dado. No meu caso, uso ele