PostrgreSQL Uso do "Copy To"
Autor: Marcos G.A | Publicado: 2012-05-24T10:55:00-07:00


Introdução&nbsp;

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

Sintaxe do comando

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

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

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

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

&nbsp; /*
&nbsp; Agora vamos para o final, criar o arquivo com os dados contidos na tabela&nbsp; temporária.
&nbsp; */
&nbsp; XSql = 'Copy "Temp" To '||Quote_Literal($1);
&nbsp; Execute XSql;
&nbsp; Return true;
end;
$BODY$
&nbsp; 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.&nbsp;