Después de un poco de prueba, tenemos
- un script que siempre funciona
- uno que siempre produce este error, en la primera declaración al consultar Exact Online.
Este es el que produce el error:
use ****@eol, ****@eol, ****@eol, ****@eol, ****@eol, ****@eol, ****@eol, ****@eol, ****@eol, ****@eol, ****@eol, ****@eol, ****@eol, ****@eol;
Create or Replace procedure sendmail
( email_subject text
, email_body text
, email_recipients text
)
as
declare
l_error_txt varchar2;
l_error_cnt varchar2;
l_email_table varchar2;
begin
set smtp-host-address@mail ‘smtp.office365.com’;
set smtp-user-name@mail ‘user@mycompany.com’;
set smtp-password@mail ‘****’;
set [mail-from-name]@mail ‘systems’;
set [mail-from-email]@mail ‘reporting@mycompany.com’;
set smtp-enable-ssl@mail true;
set smtp-minimum-deliver-duration-ms@mail 1000;
set mail-body-html@mail true;
set mail-priority@mail 0;
begin
– enviando correo electrónico
insert into smtp@mail
( toEmail
, ccEmail
, bccEmail
, subject
, body
–, attachmentContents – comenzando PROD 20.2.112, usa Attachment1Contents en su lugar
–, attachmentName
–, attachmentMimeType
)
select email_recipients
as toEmail
, cast(null as varchar2)
as ccEmail
, cast(null as varchar2)
as bccEmail
, email_subject
as subject
, email_body
as body
–, null – rfe.file_contents
– attachmentContents – comenzando PROD 20.2.112, usa Attachment1Contents en su lugar
–, null – basename(‘{USER_MULTI_PARTIES_FILE_NAME}’)
– attachmentName
–, null – cast(null as varchar2)
– attachmentMimeType
;
end;
end;
– deja una línea en blanco arriba, de lo contrario el procedimiento almacenado entra en conflicto con el bloque de SQL a continuación.
declare
l_scriptstart datetime;
l_stmtstart datetime;
l_sqlresult INT;
l_log varchar2;
l_debug varchar2;
l_scriptsuccess boolean;
l_scriptduration varchar2;
l_emailrecipients text :=‘user1@mycompany.com,user2@mycompany.com’;
–l_emailrecipients text :=‘user1@mycompany.com’;
begin
l_scriptstart := sysdate;
l_debug := 'script started at ’ || l_scriptstart;
dbms_output.put_line(l_debug); l_log := l_log || sysdate || ’ ’ || l_debug || chr(13);
l_stmtstart := sysdate;
create or replace table eol_rest_cashflowpaymentsbulk@sqlserver as select * from paymentsbulk@eol where EntryDate > dateadd(‘year’,-2,sysdate) and isbatchbooking = 1;
l_sqlresult := sqlrowcount;
l_debug := 'paymentsbulk@eol con filtro en EntryDate>(hoy-2 años) y isbatchbooking = 1 actualizado. duración: ’ || round((sysdate-l_stmtstart)6060*24,0) || 's. número de registros: ’ || l_sqlresult;
dbms_output.put_line(l_debug); l_log := l_log || sysdate || ’ ’ || l_debug || chr(13);
l_stmtstart := sysdate;
create or replace table eol_rest_glaccountsbulk@sqlserver as select * from ExactOnlineREST.Financial.glaccountsbulk@eol;
l_sqlresult := sqlrowcount;
l_debug := 'ExactOnlineREST.Financial.glaccountsbulk@eol actualizado. duración: ’ || round((sysdate-l_stmtstart)6060*24,0) || 's. número de registros: ’ || l_sqlresult;
dbms_output.put_line(l_debug); l_log := l_log || sysdate || ’ ’ || l_debug || chr(13);
l_stmtstart := sysdate;
create or replace table eol_rest_GlClassificationsBulk@sqlserver as select * from ExactOnlineREST.Financial.GLClassificationsBulk@eol;
l_sqlresult := sqlrowcount;
l_debug := 'ExactOnlineREST.Financial.GLClassificationsBulk@eol actualizado. duración: ’ || round((sysdate-l_stmtstart)6060*24,0) || 's. número de registros: ’ || l_sqlresult;
dbms_output.put_line(l_debug); l_log := l_log || sysdate || ’ ’ || l_debug || chr(13);
l_stmtstart := sysdate;
create or replace table eol_rest_GLAccountClassificationMappings@sqlserver as select * from ExactOnlineREST.GLAccountClassificationMappings@eol;
l_sqlresult := sqlrowcount;
l_debug := 'ExactOnlineREST.GLAccountClassificationMappings@eol actualizado. duración: ’ || round((sysdate-l_stmtstart)6060*24,0) || 's. número de registros: ’ || l_sqlresult;
dbms_output.put_line(l_debug); l_log := l_log || sysdate || ’ ’ || l_debug || chr(13);
l_stmtstart := sysdate;
create or replace table eol_xml_balancelines@sqlserver as select * from ExactOnlineXML.XML.BalanceLines@eol;
l_sqlresult := sqlrowcount;
l_debug := 'ExactOnlineXML.XML.BalanceLines@eol actualizado. duración: ’ || round((sysdate-l_stmtstart)6060*24,0) || 's. número de registros: ’ || l_sqlresult;
dbms_output.put_line(l_debug); l_log := l_log || sysdate || ’ ’ || l_debug || chr(13);
l_stmtstart := sysdate;
–create or replace table eol_rest_accountsbulk@sqlserver as select * from accountsbulk@eol;
create or replace table eol_rest_accountsbulk@sqlserver as select * from syncAccounts@eol where Timestamp >0 batchsize 50000; – ajusta el tamaño del lote (predeterminado: 3000)
– la declaración de sincronización se ejecuta en aproximadamente 2 minutos cuando la caché está actualizada. el Bulk se ejecuta en aproximadamente 5,2 minutos. 135710 registros a partir del 26/06/2024.
– el punto final de sincronización tiene un poco menos de información (156 vs 190 campos)
l_sqlresult := sqlrowcount;
l_debug := 'sync.account@eol actualizado vía SYNC. duración: ’ || round((sysdate-l_stmtstart)6060*24,0) || 's. número de registros: ’ || l_sqlresult;
dbms_output.put_line(l_debug); l_log := l_log || sysdate || ’ ’ || l_debug || chr(13);
l_stmtstart := sysdate;
create or replace table eol_rest_agingreceivableslist@sqlserver as select * from AgingReceivablesList@eol;
l_sqlresult := sqlrowcount;
l_debug := 'AgingReceivablesList@eol actualizado. duración: ’ || round((sysdate-l_stmtstart)6060*24,0) || 's. número de registros: ’ || l_sqlresult;
dbms_output.put_line(l_debug); l_log := l_log || sysdate || ’ ’ || l_debug || chr(13);
l_stmtstart := sysdate;
create or replace table eol_rest_agingpayableslist@sqlserver as select * from AgingPayablesList@eol;
l_sqlresult := sqlrowcount;
l_debug := 'AgingPayablesList@eol actualizado. duración: ’ || round((sysdate-l_stmtstart)6060*24,0) || 's. número de registros: ’ || l_sqlresult;
dbms_output.put_line(l_debug); l_log := l_log || sysdate || ’ ’ || l_debug || chr(13);
l_stmtstart := sysdate;
create or replace table eol_rest_ReportingBalance@sqlserver as select * from ReportingBalance@eol where reportingYear >= to_char(dateadd(‘year’,-2,sysdate),‘YYYY’) batchsize 50000; – ajusta el tamaño del lote (predeterminado: 3000)
l_sqlresult := sqlrowcount;
l_debug := 'ReportingBalance@eol con filtrado por reportingYear en los últimos 3 años actualizado. duración: ’ || round((sysdate-l_stmtstart)6060*24,0) || 's. número de registros: ’ || l_sqlresult;
dbms_output.put_line(l_debug); l_log := l_log || sysdate || ’ ’ || l_debug || chr(13);
l_stmtstart := sysdate;
create or replace table EOL_REST_CURRENTYEAR_OPENIGNBALANCE@sqlserver as select * from CurrentYearAfterEntry@eol;
l_sqlresult := sqlrowcount;
l_debug := 'CurrentYearAfterEntry@eol actualizado. duración: ’ || round((sysdate-l_stmtstart)6060*24,0) || 's. número de registros: ’ || l_sqlresult;
dbms_output.put_line(l_debug); l_log := l_log || sysdate || ’ ’ || l_debug || chr(13);
l_stmtstart := sysdate;
create or replace table EOL_REST_PREVIOUSYEAR_OPENIGNBALANCE@sqlserver as select * from PreviousYearAfterEntry@eol;
l_sqlresult := sqlrowcount;
l_debug := 'PreviousYearAfterEntry@eol actualizado. duración: ’ || round((sysdate-l_stmtstart)6060*24,0) || 's. número de registros: ’ || l_sqlresult;
dbms_output.put_line(l_debug); l_log := l_log || sysdate || ’ ’ || l_debug || chr(13);
l_scriptduration := round((sysdate-l_scriptstart)*60*60*24,0); – en segundos.
l_debug := 'el script termina. Duración total del script: ' || l_scriptduration || 's.';
dbms_output.put_line(l_debug); l_log := l_log || sysdate || ' ' || l_debug || chr(13);
sendmail(
– asunto del correo aquí
'script de sincronización para tablas eol excepto transactionlines: éxito.'
– cuerpo del correo aquí
,'estado del script: OK.' || ''
|| 'hora de inicio del script: ' || to_char(l_scriptstart, 'YYYY-MM-DD HH24:MI:SS') || ''
|| 'duración del script: ' || l_scriptduration || ' segundos.' || ''
|| 'registro completo abajo' || ''
|| replace(l_log, chr(13), '')
– destinatarios aquí
,l_emailrecipients
);
exception
when others
then
l_debug := 'Error capturado en excepción: ' || chr(13) || sqlerrm;
dbms_output.put_line(l_debug); l_log := l_log || sysdate || ' ' || l_debug || chr(13);
l_scriptsuccess := false;
l_scriptduration := round((sysdate-l_scriptstart)*60*60*24,0); – en segundos. calculado de nuevo aquí debido a que la excepción lo saltó.
sendmail(
– asunto del correo aquí
'script de sincronización para tablas eol excepto transactionlines: ERROR. Ocurrió una excepción SQL.'
– cuerpo del correo aquí
,'estado del script: ERROR. Ocurrió una excepción SQL.' || ''
|| 'hora de inicio del script: ' || to_char(l_scriptstart, 'YYYY-MM-DD HH24:MI:SS') || ''
|| 'duración del script: ' || l_scriptduration || ' segundos.' || ''
|| 'registro completo abajo' || ''
|| replace(l_log, chr(13), '')
– destinatarios aquí
,l_emailrecipients
);
end;