Matheus funcionou como você me falou.
Eu não sabia que tinha q instalar contrib hstore ai funcionou, mas encontrei dois problemas... Se eu deixo um campo nulo ele não realiza o insert, também não consigo adicionar a função na outra base para fazer como uma replicação. Tudo isso é possível?? Mais uma vez muito obrigado. Att— Matheus Ferreira De: pgbr-geral [mailto:[email protected]] Em nome de Matheus de Oliveira Enviada em: quinta-feira, 26 de fevereiro de 2015 13:33 Para: Comunidade PostgreSQL Brasileira Assunto: Re: [pgbr-geral] RES: RES: RES: Função de inserção 2015-02-26 11:08 GMT-03:00 Matheus Ferreira <[email protected] <mailto:[email protected]> >: Muito obrigado pela ajuda Mas eu sou leigo na construção do script Você poderia me especificar o que cada comando faz para eu aprender.... Claro. Fiz um teste rápido aqui e parece estar funcionando também. Seguinte, a ideia é chamar o dblink_exec e passar um texto (string) com o comando SQL propriamente. Por exemplo, se inserir na tabela "processos2" com os dados `idprocesso=1` e `nrprocesso='xpto'`, a ideia é fazer a chamada dblink_exec da seguinte forma: PERFORM dblink_exec('...', $$INSERT INTO processo(idprocesso, nrprocesso) VALUES('1', 'xpto')$$); Assim, para fazer isso eu uso várias funções da contrib hstore [1] (você deve instalá-la primeiro): - hstore(NEW): transforma o registro NEW em um hstore (que é basicamente um tipo chave/valor, sendo chave o nome da coluna e valor uma _string_ com o conteúdo); - each(...): função que retorna uma tabela com duas colunas "key" e "value", cada linha é uma chave e um valor retirado do hstore, exemplo: postgres=# SELECT * FROM each(hstore('"idprocesso"=>"1","nrprocesso"=>"xpto"')); key | value ------------+------- idprocesso | 1 nrprocesso | xpto (2 rows) Explicando o código (vou modificá-lo um pouco para entender melhor): DECLARE v_cmd text; ... BEGIN; /** * Vamos fazer um SELECT que na verdade retorna uma * _string_ (ou text) com o comando SQL. Repare que * até a linha do debug isso é um comando só, cuidado * para não confundir. */ SELECT /* começa a criação do comando com o INSERT na tabela em questão */ 'INSERT INTO processo(' /* * each retorna várias linhas, usa string_agg para * agregar suas chaves separadas por vírgula e * usando quote_ident [2] para evitar SQL injection */ || string_agg(quote_ident(key), ',') /* Adição dos valores */ || ') VALUES(' /** * Mesma ideia acima, usa o string_agg para agregar * os valores (retornados pelo each) e separando por * vírgula, junto com o quote_literal [2] para evitar * SQL injection e garantir escape correto das strings */ || string_agg(quote_literal(value), ',') || ')' /* Salva o resultado dessa string na variável v_cmd */ INTO v_cmd /* Retorna uma linha para cada chave (key) e valor (value) */ FROM each(hstore(NEW)); /* Debug: */ RAISE NOTICE 'Comando: %', v_cmd; /* Execução: */ PERFORM dblink_exec('...', v_cmd); É isso, veja se ficou mais claro, tente executar pra ver (não testei em detalhes, pode ter erros ainda). Outra dica, ao invés de usar o dblink, você pode usar um FDW (que aceitam escritas, a partir da 9.3 _se não me engano_), ficaria bem mais fácil já que é só tratar a tabela estrangeira como se fosse uma local, daí o código seria como passei primeiramente (quando não havia a informação de que estava sendo usado o dblink). [1] http://www.postgresql.org/docs/current/static/hstore.html [2] http://www.postgresql.org/docs/current/static/functions-string.html Atenciosamente, -- Matheus de Oliveira Analista de Banco de Dados Dextra Sistemas - MPS.Br nível F! www.dextra.com.br/postgres <http://www.dextra.com.br/postgres/> --- Este email foi escaneado pelo Avast antivírus. http://www.avast.com
_______________________________________________ pgbr-geral mailing list [email protected] https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
