Integração do cadastro de Órgãos do Sistema do PJERJ com o cadastro de locais físicos, via banco de dados, de forma assíncrona, mediante a utilização de tabela com os registros a serem unificados.
No esquema
UC, do PJERJ, foi criado a tabela integracao_grp_service com a estrutura que armazena a lista dos registro a serem unificados. Através do job, esses registros são lidos e processado a sua integração.
Tabela criada no lado do cliente. Esta atividade foi realizada pelo próprio cliente em seu esquema de dados:
create table INTEGRACAO_GRP_SERVICE
(
sequencia NUMBER not null,
origem VARCHAR2(90) not null,
chaveorigem VARCHAR2(4000) not null,
operacao VARCHAR2(90) not null,
acao VARCHAR2(90) not null,
dataoperacao DATE not null,
situacao VARCHAR2(30) not null,
erro VARCHAR2(4000),
dataerro DATE,
dataprocessamento DATE,
observacao VARCHAR2(4000)
)
Sequence criada no lado do cliente. Esta atividade foi realizada pelo próprio cliente em seu esquema de dados:
create sequence INTEGRACAO_GRP_SERVICE_SEQ
minvalue 1
maxvalue 9999999999
start with 1
increment by 1
nocache;
Na tabela
UC.ORGAO, foi criada a trigger para registro na tabela de integração. Esta atividade foi realizada pelo próprio cliente em seu esquema de dados:
ORGAO_AIUD_INTEGRACAO
A rotina de integração ficou de responsabilidade do Owner
ERP_UC, que deve possuir as seguintes permissões de banco:
-- Grant/Revoke object privileges
grant execute on ERP.GRP_BAS_CONTEXTO_PACK to ERP_UC;
grant select, insert, update, delete on ERP.GRP_BAS_INTEGRACAO to ERP_UC;
grant select, insert, update, delete on ERP.GRP_BAS_LOCALFISICO to ERP_UC;
grant select on ERP.GRP_BAS_LOCALIZACAO_TOTAL_V to ERP_UC;
grant execute on ERP.GRP_BAS_ORGAO_PATRIMONIAL_PACK to ERP_UC;
grant execute on ERP.GRP_BAS_TRATA_SQLERRM_F to ERP_UC;
grant execute on ERP.ISNUMBER to ERP_UC;
grant execute on ERP.PACK_SESSAO to ERP_UC;
grant execute on SYS.DBMS_SCHEDULER to ERP_UC;
-- Grant/Revoke role privileges
grant bas$_usuario_role to ERP_UC;
grant connect to ERP_UC;
grant resource to ERP_UC;
-- Grant/Revoke system privileges
grant create job to ERP_UC;
Também devem ser criados dois sinônimos privados para o usuário
ERP_UC apontando para os objetos do Owner
UC, através do dblink a ser utilizado na integração. Desta forma, é possível ter o mesmo procedimento (package) tanto para o banco de homologação quanto de produção, que possuia dblinks diferentes.
HML:
create synonym ERP_UC$_INTEGRACAO_GRP_SERVICE for uc.INTEGRACAO_GRP_SERVICE@INT_ERP_DSV03;
create synonym ERP_UC$_ORGAO for uc.ORGAO@INT_ERP_DSV03;
PRD:
create synonym ERP_UC$_INTEGRACAO_GRP_SERVICE for uc.INTEGRACAO_GRP_SERVICE@int_erp_tj03;
create synonym ERP_UC$_ORGAO for uc.ORGAO@int_erp_tj03;
Deve ser carregado o pacote ERP_UC$_INTEGRACAO_PACK do owner
ERP_UC com a seguinte descrição:
CREATE OR REPLACE PACKAGE ERP_UC$_INTEGRACAO_PACK IS
/*
Pacote destinado a funções e procedimentos de integrações
Utiliza dois sinônimos: ERP_UC$_INTEGRACAO_GRP_SERVICE e ERP_UC$_ORGAO
*/
/* ************************************************************************************************ */
/*
Procedure: defineCliente
--------------------------------------------------------------------------------
Procedimento que define o código do cliente para utilização na integração
Parametros:
in_cliente - código do cliente
Histórico:
> Fernando Souza 24/06/2020 Criação
--------------------------------------------------------------------------------
*/
PROCEDURE defineCliente (in_cliente IN NUMBER);
/* ************************************************************************************************ */
/*
Procedure: processaIntegracaoService
--------------------------------------------------------------------------------
Procedimento que define o código do cliente para utilização na integração
Parametros:
in_cliente - código do cliente
in_quantidadeRegistro - quantidade de registros a serem processados
in_numeroExecucoesPendentes - número de execuções que o registro pode restar com pendência
Histórico:
> Fernando Souza 24/06/2020 Criação
--------------------------------------------------------------------------------
*/
PROCEDURE processaIntegracaoService(in_cliente IN NUMBER,
in_quantidadeRegistro IN NUMBER,
in_numeroExecucoesPendentes IN NUMBER);
/* ************************************************************************************************ */
/*
Procedure: insereLocal
--------------------------------------------------------------------------------
Procedimento que realiza a inclusão do local
Parametros:
iv_chaveOrigem - código da chave de origem
Histórico:
> Fernando Souza 24/06/2020 Criação
--------------------------------------------------------------------------------
*/
PROCEDURE insereLocal(iv_chaveOrigem IN VARCHAR2);
/* ************************************************************************************************ */
/*
Procedure: atualizaLocal
--------------------------------------------------------------------------------
Procedimento que realiza a atualização dos dados do local
Parametros:
iv_chaveOrigem - código da chave de origem
Histórico:
> Fernando Souza 24/06/2020 Criação
--------------------------------------------------------------------------------
*/
PROCEDURE atualizaLocal(iv_chaveOrigem IN VARCHAR2);
/* ************************************************************************************************ */
/*
Procedure: removeLocal
--------------------------------------------------------------------------------
Procedimento que realiza a remoção da integração do local
Parametros:
iv_chaveOrigem - código da chave de origem
Histórico:
> Fernando Souza 20/07/2020 Criação
--------------------------------------------------------------------------------
*/
PROCEDURE removeLocal(iv_chaveOrigem IN VARCHAR2);
/* ************************************************************************************************ */
END;
Importante Deve ser criado um registro na tabela de integração, apontando para a sequencia da unidade principal, onde serão criados os locais sem superior ou cujo superior for 0 (zero).
insert into grp_bas_integracao (CODIGO_CLIENTE, TAG, ORIGEM, DESTINO, DESCRICAO)
values (#cliente#, 'TJRJ_LOCALFISICO', '0', #sequencia da unidade#, 'Local padrão da unidade');
Por fim, deve ser criado o job de sincronização pelo usuário
ERP_UC:
BEGIN
DBMS_SCHEDULER.CREATE_JOB (
job_name => 'SINCRONIZA_ORGAO_LOCALFISICO',
job_type => 'PLSQL_BLOCK',
job_action => 'DECLARE BEGIN erp_uc$_integracao_pack.processaintegracaoservice(#código do cliente#, 10, 3); commit; END;',
start_date => CAST('21/07/20 09:20:00' AS TIMESTAMP WITH LOCAL TIME ZONE),
repeat_interval => 'freq=minutely; interval=10',
enabled => TRUE,
auto_drop => FALSE,
comments => 'Job que realiza a sincronização do cadastro de Órgão com os locais fisicos');
END;
Neste exemplo o job roda a cada 10 minutos, porém pode ser configurado essa periodicidade em outro tempo, conforme análise com o cliente.