[firebase-br] Copia de tabela de um banco Firebird para outro banco

Gladiston Santana gladiston em vidy.com.br
Ter Ago 13 13:46:00 -03 2019


Exemplo de uma procedure que faz uso de external, ela retorna uma lista de
endereços baseado nas iniciais do cep informado como parâmetro.
Note que para facilitar o debug cada parâmetro do external está numa
variável local diferente.
O uso do external torna difícil o debug, então separar os parametros em
variaveis ajuda na manutenção do código.
No seu caso, o problema é a inexistência do "campo" na "tabelaA".
Como sugestão, quando usar 'external data' use o primeiro select como sendo
select 1 as resultado from rdb$database
pois o select acima é certeza que não tem erro, daí você apenas se
concentra se os parametros do 'external data' estão corretos, se funcionar
daí então troca a query sabendo que a conexão tá beleza.

Use o exemplo, adapte segundo suas necessidades:

create or alter procedure GET_CEP (
    P_CEP varchar(8) = '')
returns (
    CEP char(8),
    LOGRADOURO varchar(125),
    BAIRRO varchar(70),
    CIDADE varchar(70),
    UF char(2),
    LAST_UPDATE timestamp)
as
declare variable L_CONN_STRING varchar(255) =
'server:\caminho\para\ceps.fdb';
declare variable L_CONN_USER varchar(30) = 'SYSDBA';
declare variable L_CONN_PASSWORD varchar(30) = 'masterkey';
declare variable L_CONN_ROLE varchar(30) = 'rdb$admin';
declare variable L_SQL varchar(1024) = '';
begin
  cep='';
  logradouro='';
  bairro='';
  cidade='';
  uf='';
  last_update='01.01.1970';

  l_sql='select cep, logradouro, bairro, cidade, uf, last_update from ceps
';
  if (:p_cep<>'') then
  begin
    if ((char_length(:p_cep)<8) and (position ('%' in :p_cep)=0)) then
p_cep=:p_cep||'%';
    if (position ('%' in :p_cep)=0)
    then l_sql=:l_sql||'where cep like '''||:p_cep||'''';
    else l_sql=:l_sql||'where cep='''||:p_cep||'''';
  end
  for execute statement :l_sql
  on external :l_conn_string
    as user :l_conn_user
    password :l_conn_password
    role :l_conn_role
  into :cep, :logradouro, :bairro, :cidade, :uf, :last_update do
  begin
    suspend;
  end

end

Em ter, 13 de ago de 2019 às 12:07, UPSAI | Informatica <
informatica em upsai.com.br> escreveu:

> Prezados
>
> Na semana passada solicitei ajuda do grupo para a execução da função de
> copiar uma tabela de um banco Firebird para outro.
>
> Na oportunidade, me foi sugerido que procurasse informações sobre o comando
> "execute statement on external".
>
> Nesta pesquisa cheguei ao código abaixo, porem ao tentar executa-lo estou
> recebendo mensagem de erro (Column does not belong to referenced table.
> Dynamic SQL Error. SQL error code = -206.Column unknown. CAMPO. At line 8,
> column 29.)
>
>
> EXECUTE block AS
>     DECLARE variable campoTemp VARCHAR(500);
> BEGIN
>     FOR EXECUTE STATEMENT 'select campo from tabelaA'
>     ON EXTERNAL DATA SOURCE '192.168.0.250:C:\database\BancoA.FDB' AS USER
> 'sysdba' PASSWORD 'masterkey'
>     INTO :campoTemp
>     DO BEGIN
>       INSERT INTO TabelaB (campo) VALUES (:campoTemp);
>     END
> END;
>
>
> Alguém tem alguma informação para eu corrigir este procedimento?
>
>
>
> Saudações
>
> Wagner Aranha
>
>
> ______________________________________________
> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
> Para saber como gerenciar/excluir seu cadastro na lista, use:
> http://www.firebase.com.br/fb/artigo.php?id=1107
> Para consultar mensagens antigas:
> http://www.firebase.com.br/pesquisa_lista.html
>


-- 
A Vidy possui um Sistema de Gestão da Qualidade estruturado e com
Certificação ISO 9001 há mais de 10 anos, mantendo seu foco na Qualidade e
na Melhoria Continua.

Em março de2018 migramos com sucesso para a nova versão da ISO 9001.

Somos a única Empresa Brasileira de Engenharia de Laboratórios com
certificação com o Escopo Completo; desde Projetos, Engenharia, Construção,
Fabricação e Instalação de Laboratórios.



Mais detalhes sobre a lista de discussão lista