[firebase-br] Update de 1M Registros

Gladiston Santana gladiston.santana em gmail.com
Quinta Agosto 14 14:37:08 -03 2025


Frederico, veja se essa forma de transferir os dados te ajuda,  este é um
exemplo do que fiz para ajudar numa consultoria. o objetivo era migrar de
uma versão mais antiga para uma nova onde também tinha que mudar para
unicode. Como ambos os bancos eram firebird então usei o próprio mecanismo
FOR..SELECT/EXTERNAL, além disso, se eu desejasse poderia transformar os
dados de origem antes de irem para o destino:
Use uma tabela com o exemplo abaixo e veja se o resultado é animador. Se
funcionar e puder, coloque os dois bancos no mesmo localhost e apenas mude
a porta de um deles, assim será mais rápido ainda.
O exemplo abaixo está em formato de script então voce executa assim:
isql.exe "localhost/3050:banconovo.fdb"  -q  -i "script.sql"
<--- INICIO --->
SET AUTODDL on;
SET LIST ON;
set names UTF8;
SET TERM ^ ;

EXECUTE BLOCK AS
  declare variable vfound boolean;
  declare variable upsert_sql VARCHAR(512);

  -- variaveis de destino
  declare variable v_ID_CALENDARIO BIGINT;
  declare variable v_LOGINNAME     VARCHAR(31);
  declare variable v_DT_INICIAL    DATE;
  declare variable v_DT_FINAL      DATE;
  declare variable v_DESCRICAO     VARCHAR(255);
  declare variable v_STATUS        CHAR(1);
  declare variable v_LAST_UPDATE   TIMESTAMP;
  declare variable v_LAST_OWNER    VARCHAR(31);

  -- credenciais da origem
  declare VARIABLE v_USERNAME      VARCHAR(63);
  declare VARIABLE v_USERNAME_PASS VARCHAR(63);
BEGIN
  v_USERNAME= 'sysdba';
  v_USERNAME_PASS= 'masterkey';
  upsert_sql =
    'UPDATE OR INSERT INTO ADMIN_CALENDARIO ' ||
    '(ID_CALENDARIO, LOGINNAME, DT_INICIAL, DT_FINAL, DESCRICAO, STATUS,
LAST_UPDATE, LAST_OWNER) ' ||
    'VALUES (:p_id, :p_login, :p_dt_ini, :p_dt_fin, :p_desc, :p_stat,
:p_lut, :p_lo) ' ||
    'MATCHING (ID_CALENDARIO)';

  FOR
    EXECUTE STATEMENT
      -- CAST em UTF8 na origem(win1252) + TRIM para evitar espacos
residuais
      'SELECT ' ||
      '  ID_CALENDARIO,' ||
      '  TRIM(LOGINNAME) AS LOGINNAME,' ||
      '  DT_INICIAL,' ||
      '  DT_FINAL,' ||
      '  CAST(DESCRICAO AS VARCHAR(255) CHARACTER SET UTF8) AS DESCRICAO,'
||
      '  COALESCE(STATUS, ''A'') AS STATUS,' ||
      '  LAST_UPDATE,' ||
      '  TRIM(LAST_OWNER) AS LAST_OWNER ' ||
      'FROM ADMIN_CALENDARIO'
    ON EXTERNAL 'db/3050:vidy15.fdb'
      AS USER :v_USERNAME
      PASSWORD :v_USERNAME_PASS
    INTO
      v_ID_CALENDARIO,
      v_LOGINNAME,
      v_DT_INICIAL,
      v_DT_FINAL,
      v_DESCRICAO,
      v_STATUS,
      v_LAST_UPDATE,
      v_LAST_OWNER
  DO
  BEGIN
      EXECUTE STATEMENT (upsert_sql)
        ( p_id     := v_ID_CALENDARIO,
          p_login  := v_LOGINNAME,
          p_dt_ini := v_DT_INICIAL,
          p_dt_fin := v_DT_FINAL,
          p_desc   := v_DESCRICAO,
          p_stat   := v_STATUS,
          p_lut    := v_LAST_UPDATE,
          p_lo     := v_LAST_OWNER );
  END

END^

SET TERM ;^
<--- FIM --->


Mais detalhes sobre a lista de discussão lista