[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