Integração - Cursor com update em robô multithread

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
Moloukos
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 54
Registrado em: Qui, 18 Set 2008 10:22 pm
Localização: São Paulo - SP
Moloukos Rox

--Boa tarde

--Tenho a seguinte situação:

--O ROBO PEGA 50 REGISTROS POR VEZ ORDENADOS POR ID E SEQUENCIA(QUE PODEM CHEGAR ATÉ 9) E ENVIA PARA INTEGRACAO

Selecionar tudo

DECLARE
  CURSOR C_ENVIO IS
    SELECT ID, DATA, TX_1, TX_2, TX_3, ID_SEQUENCIA
      FROM (SELECT ID, DATA, TX_1, TX_2, TX_3, ID_SEQUENCIA
              FROM TB_ENVIO
             WHERE ENVIO = 1
             ORDER BY 1, 6) TESTE
     WHERE ROWNUM <= 50;

BEGIN
  OPEN C_ENVIO;
  LOOP
    FETCH C_ENVIO
      INTO C_ENVIO;
  
    EXIT WHEN C_ENVIO%NOTFOUND;
  
-- PREENCHO UMA TAB DE RETORNO E 
    .. . .. . .. .........
--DEPOIS ATUALIZO O ENVIO PARA 2 PARA não PEGAR NA PROXIMA VEZ QUE FOR ACIONADO PELO ROBO.....
    
    UPDATE TB_ENVIO 
       SET ENVIO = 2
     WHERE ID = TAB.ID AND ID_SEQUENCIA = TAB.ID_SEQUENCIA;
  
    COMMIT;
  END LOOP;
  CLOSE C_ENVIO;
END;
--O problema é que esse robo será multithread e chamara a mesma procedure de envio
--Duvida...?
--Quando executar 3 threads ao mesmo tempo não vai pegar a mesma informacao nos 3 cursores?
--Como faço um controle para não encavalar os dados - Existe algum tipo de controle?
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Creio que este é um caso pra se usar Oracle Advanced Queuing.
https://docs.oracle.com/cd/B10500_01/ap ... exampl.htm
https://docs.oracle.com/cd/B10500_01/ap ... qintro.htm

Daí ele cria uma fila, e não importa qual processo pegar, nunca vai repetir.
É um pouco chato de lidar com isso, mas acho que vale a pena dar uma lida.
seva
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 3
Registrado em: Sex, 20 Nov 2015 1:46 pm

Bom dia.

Você poderia criar uma procedure 'mestre', que é responsável por executar 3 vezes a procedure de carga ao mesmo tempo. Essa procedure será responsável por fazer que uma thread não processe os mesmos dados que a outra.

Executa a procedure mestre, ela da um select na tabela TB_ENVIO, vê quais ID tem pra processar, e divide os IDs de acordo com o número de threas que você quer. Ex: com 3 threads, tem IDs do 100 ao 130 na tabela para processar, então ela chama uma thread passando como parametros IdInicial=100 IdFinal=110, outra thread passando IdInicial=111, IdFinal=120, etc...

Não sei se você já tinha pensado como fazer a execução via threads...
Se for 'banco' puro, faria com que o processo mestre criasse 3 JOBs que executam uma unica vez (nem sei se existe uma outra forma - existe?).
Se você está excutando isso através de uma aplicação (Java, por exemplo), o próprio java pode ser o mestre, e chamar 3 execuções no banco em paralelo (aí desconheço a implementação que deve ser feita em java)
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Google Adsense [Bot] e 17 visitantes