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.