2014-07-25 3:15 GMT-03:00 Wellington <wm...@yahoo.com.br>: > quando eu executo o comando "SET search_path TO nome_schema" dentro de > uma funcao, em uma mesma sessao, o SGDB nao altera o search_path nos > comandos executados apos o primeiro, me parece que o schema fica em um tipo > de cache. > > Duvida: Existe alguma forma de contornar isso? > >
O que creio que está acontecendo é que quando você executa uma função PL/pgSQL a primeira vez é feito o cache dos planos de execução, e esse cache utiliza o oid das relações e não o nome exato que você passou. Assim sendo, na primeira execução será usada as tabelas respeitando o search_path informado, nas próximas execuções, mesmo alterando o search_path, ele irá continuar com o plano de execução com o search_path anterior. Agora. O comportamento quanto a isso foi alterado na versão 9.3 [1]: "Force cached plans to be replanned if the search_path changes (Tom Lane) Previously, cached plans already generated in the current session were not redone if the query was re-executed with a new search_path setting, resulting in surprising behavior." Ou seja, sempre que o search_path é alterado, os planos armazenados são descartados. O efeito que isso causa é que se você altera sempre o search_path, sempre irás ter que fazer o planejamento dos planos e não utilizará o cache. Sei que posso usar o comando "Execute" passando o schema em uma variavel, > mas gostaria de evitar fazer comandos sql concatenando Strings. > Sim. Você pode, na verdade nem precisa passar o schema como variável, as consultas executadas pelo EXECUTE não têm os planos "cacheados", basta executá-las então que o search_path corrente será sempre respeitado. As outras alternativas são: clonar sua função em cada esquema ou atualizar para a 9.3. [1] http://www.postgresql.org/docs/9.3/static/release-9-3.html Atenciosamente, -- Matheus de Oliveira Analista de Banco de Dados Dextra Sistemas - MPS.Br nível F! www.dextra.com.br/postgres
_______________________________________________ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral