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
