quinta-feira, 24 de maio de 2012

PostrgreSQL Uso do "Copy To"


Introdução 


Pessoal, hoje, eu gostaria de mostrar um exemplo simples, de como usar o comando "Copy To".  Este comando, faz a carga de uma tabela para dentro de um arquivo. 


Sintaxe do comando


COPY tablename [ ( column [, ...] ) ]
    TO { 'filename' | STDOUT }
    [ [ WITH ] 
          [ BINARY ]
          [ OIDS ]
          [ DELIMITER [ AS ] 'delimiter' ]
          [ NULL [ AS ] 'null string' ]
          [ CSV [ HEADER ]
                [ QUOTE [ AS ] 'quote' ] 
                [ ESCAPE [ AS ] 'escape' ]
                [ FORCE QUOTE column [, ...] ]


Obs: Maiores explicações sobre cada parâmetro, acesse a documentação em português
do PostgreSQL em http://pgdocptbr.sourceforge.net/pg80/sql-copy.html
                
Mãos ao trabalho.  


Vamos criar uma função, onde o conteúdo de uma de nossas tabelas, neste caso, a de "clientes" serão gravados dentro de um arquivo.



CREATE OR REPLACE FUNCTION "CopyTo"(Caminho Varchar)  RETURNS boolean AS
$BODY$
Declare
  /*
  Duas variáveis, A primeira, "Retorno" do tipo "Record" utilizada para guardar registros. Ela   assume a strutura 
  da tabela ou tabelas informadas no SQL. 
  A segunda, "Sql" do tipo "Varchar" utilizada para guardar os comandos SQL, que após  serão executados por    
  outro comando "Execute". 
  */
  Retorno Record;
  Sql     Varchar default '';
Begin 
  /*
  Aqui, é criado uma tabela tempória para receber dados criteriados, de outra tabela de nosso banco de dados.
  */
  Sql = 'Create Temp Table "RemessaTemp"("CodigoCliente" integer) On Commit Drop;';
  Execute Sql;


  /*
  Neste ponto, o SQL, envia para dentro da variável "Retorno" os registros 
  encontrados e criteriados na claúsula "Where".
  */
  For Retorno in
      Select "CodigoCliente"
      From   "Cliente"
      Where  "DataNascimentoCliente" between '2012-01-01' and '2012-03-01'
  Loop 
    /* 
    Após, entramos em um loop, dando um "Insert" dos dados para dentro da tabela temporária.
    */
    XSql = 'Insert Into "Temp" ("CodigoCliente")  Values ('||Quote_Literal(XRetorno."CodigoCliente")||');';
    Execute XSql;
  End Loop;


  /*
  Agora vamos para o final, criar o arquivo com os dados contidos na tabela  temporária.
  */
  XSql = 'Copy "Temp" To '||Quote_Literal($1);
  Execute XSql;
  Return true;
end;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE;


Para executar a função, onde que cria o arquivo com os dados de uma tabela, faça:


Select "CopyTo"('Diretório para gravação\Nome do arquivo.csv');


Considerações: No próximo artigo, eu irei demonstrar o inverso deste comando, utilizando o "Copy From", onde irei ler o contéudo de um arquivo e gravar dentro de uma tabela. Uma detalhe importante, mas não exatamente uma regra, é que, o arquivo lido, deverá ter a mesma estrutura de registros igual a sua tabela. No exemplo acima, eu uso um único campo, com isto o arquivo terá uma única coluna. Para demais colunas, usar os caracteres determinados pela sintaxe do comando. 


Nenhum comentário:

Postar um comentário

Comente sempre por favor.