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;
>
>         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
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a