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

Responder a