Opa,

Já que comecei vou terminar a ajuda.

Em 16 de março de 2010 15:26, JotaComm <[email protected]> escreveu:

> Olá,
>
> Em 16 de março de 2010 14:40, Rogério A Bassete 
> <[email protected]>escreveu:
>
>  Estou usando a função set_config para configurar a configuração do
>> search_path dentro de uma função pl/pgsql, mas não esta funcionando como o
>> esperado.
>>
>> O total que deveria ser retornado pela função seria 8000.00 e não 3000.00
>> como acontece com o exemplo abaixo. Pelo que li no manual do PostgreSQL a
>> chama a função set_config esta correta. Estou escrevendo para certificar se
>> o comportamento é esse mesmo ou se trata de um BUG.
>>
>
> Não verdade não tem nenhum erro com a função set_config.
>
> Veja como esta seu for. Você faz um for para pegar o nome dos esquemas,
> como você tem 3 esquemas o for irá iterar apenas 3 vezes, sendo 1 iteração
> para cada esquema, por isso o seu retorno é de 3000.00, sendo 1.000 de cada
> tabela de cada esquema, e na verdade você quer o somatório de tudo e para
> isso é necessário modificar a sua lógica.
>
>>
>> Posso resolver isso facilmente usando EXECUTE, mas acho o exemplo abaixo
>> mais elegante.
>>
>> Sugestões?
>>
>>
>> select version();
>> -- "PostgreSQL 8.4.2, compiled by Visual C++ build 1400, 32-bit"
>>
>> CREATE SCHEMA emp0001;
>> CREATE SCHEMA emp0002;
>> CREATE SCHEMA emp0005;
>>
>> CREATE TABLE emp0001.salario (
>> valor NUMERIC(12,2)
>> ) WITHOUT OIDS;
>>
>> CREATE TABLE emp0002.salario (
>> valor NUMERIC(12,2)
>> ) WITHOUT OIDS;
>>
>> CREATE TABLE emp0005.salario (
>> valor NUMERIC(12,2)
>> ) WITHOUT OIDS;
>>
>>
>> INSERT INTO emp0001.salario VALUES (1000.00);
>>
>> INSERT INTO emp0002.salario VALUES (1000.00);
>> INSERT INTO emp0002.salario VALUES (1000.00);
>>
>> INSERT INTO emp0005.salario VALUES (1000.00);
>> INSERT INTO emp0005.salario VALUES (1000.00);
>> INSERT INTO emp0005.salario VALUES (1000.00);
>> INSERT INTO emp0005.salario VALUES (1000.00);
>> INSERT INTO emp0005.salario VALUES (1000.00);
>>
>> CREATE LANGUAGE plpgsql;
>>
>> CREATE OR REPLACE FUNCTION GetTotalSalario() RETURNS numeric AS
>> $body$
>> DECLARE
>>     empresas record;
>>     total_empresa numeric := 0;
>>     total_geral numeric := 0;
>> BEGIN
>>
>>     FOR empresas IN SELECT nspname FROM pg_namespace WHERE nspname LIKE
>> 'emp%'
>>     LOOP
>>
>>         PERFORM set_config('search_path',empresas.nspname,false);
>>
>>         RAISE NOTICE 'search_path atual %',current_setting('search_path');
>>
>>         SELECT INTO total_empresa sum(valor) from salario;
>>
> Troque a linha de cima por:

 EXECUTE 'SELECT sum(valor) FROM salario' INTO total_empresa;

>
>>         total_geral := total_geral + total_empresa;
>>
>>     END LOOP;
>>
>>     RETURN total_geral;
>> END
>> $body$
>> LANGUAGE 'plpgsql';
>>
>> select GetTotalSalario()
>>
>> Sem mais,
>>
>> Rogério Augusto Bassete
>>
>>
>> _______________________________________________
>> pgbr-geral mailing list
>> [email protected]
>> https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
>>
>>
>
> []s
>
> --
> JotaComm
> http://jotacomm.wordpress.com
>


[]s
-- 
JotaComm
http://jotacomm.wordpress.com
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a