Bom dia, pessoal. Estou com uma aplicação executando uma atualização, onde busco informações em uma tabela de transações com aproximandamente uns 10 milhões de linhas (ultima compra/credito) e faço um update em outra tabela com 1,5 de linhas.
Criei uma tabela onde tenho o numero dos cartões e uma sequencia, assim consigo executar o mesmo processo simultaneamente no banco. O grande problema é que esta executando fazem mais de 40 horas e ainda não acabou! Preciso urgente de uma ajuda!!!! Alguém pode me ajudar? Segue dados e processo abaixo: Banco: Oracle 10g CREATE OR REPLACE PROCEDURE Atualizar_Snccr( p_Seq1 GRUPO_SNCCR.SEQ% TYPE , p_Seq2 GRUPO_SNCCR.SEQ% TYPE ) IS -- CURSOR c_Comp(pc_CrtNum SNCRT.CRTNUM%TYPE) IS SELECT /*+ INDEX(SNTRN,ISNTRN19) */ SNTRN.TRNDAT, SNTRN.TRNVAL FROM SNTRN WHERE SNTRN.TRNPRECRT = pc_CrtNum AND SNTRN.TRNPRCCOD IN (240000,241000,770000,778000) AND SNTRN.TRNDAT = (SELECT /*+ INDEX(SNTRN,ISNTRN19) */ MAX (SNTRN.TRNDAT) FROM SNTRN WHERE SNTRN.TRNPRECRT = pc_CrtNum AND SNTRN.TRNPRCCOD IN (240000,241000,770000,778000)); -- CURSOR c_Cred(pc_CrtNum SNCRT.CRTNUM%TYPE) IS SELECT /*+ INDEX(SNTRN,ISNTRN20) */ SNTRN.TRNDAT, SNTRN.TRNVAL FROM SNTRN WHERE SNTRN.TRNSUBCRT = pc_CrtNum AND SNTRN.TRNPRCCOD IN (620000,621000,625000) AND SNTRN.TRNDAT = (SELECT /*+ INDEX(SNTRN,ISNTRN20) */ MAX (SNTRN.TRNDAT) FROM SNTRN WHERE SNTRN.TRNSUBCRT = pc_CrtNum AND SNTRN.TRNPRCCOD IN (620000,621000,625000)); -- r_TrnDat_Comp SNTRN.TRNDAT%TYPE; r_TrnVal_Comp SNTRN.TRNVAL%TYPE; r_TrnDat_Cred SNTRN.TRNDAT%TYPE; r_TrnVal_Cred SNTRN.TRNVAL%TYPE; r_CrtNum SNCRT.CRTNUM%TYPE; -- v_Cod_Em FJCFJ.CFJSEQ%TYPE; -- v_qtd_registros NUMBER(10); -- BEGIN -- -- inicializa variaveis r_TrnDat_Comp := TO_DATE('01/01/0001','DD/MM/YYYY'); r_TrnVal_Comp := 0; r_TrnDat_Cred := TO_DATE('01/01/0001','DD/MM/YYYY'); r_TrnVal_Cred := 0; v_qtd_registros := 0; -- -- Agrupamento de cartoes por RH/Filial/Matricula FOR r_Crt IN (SELECT SEQ , CRTNUM FROM GRUPO_SNCCR WHERE GRUPO_SNCCR.SEQ BETWEEN p_Seq1 AND p_Seq2 AND GRUPO_SNCCR.PROCESSADO = 0 ) LOOP -- -- busca dados da ultima compra e atualiza BEGIN -- -- busca dados da ultima compra e atualiza OPEN c_Comp(r_Crt.crtnum); FETCH c_Comp INTO r_TrnDat_Comp, r_TrnVal_Comp; CLOSE c_Comp; -- -- busca dados do ultimo credito e atualiza OPEN c_Cred(r_Crt.crtnum); FETCH c_Cred INTO r_TrnDat_Cred, r_TrnVal_Cred; CLOSE c_Cred; -- UPDATE SNCCR SET SNCCR.CCRCMPRULTDAT = r_TrnDat_Comp , SNCCR.CCRCMPRULTVLR = r_TrnVal_Comp , SNCCR.CCRCRDULTDAT = r_TrnDat_Cred , SNCCR.CCRCRDULTVLR = r_TrnVal_Cred WHERE SNCCR.CRTNUM = r_Crt.crtnum AND SNCCR.APLCOD = '02001'; -- v_qtd_registros := v_qtd_registros + 1; -- -- Zera variaveis de data e valor, para o proximo cartao r_TrnDat_Comp := TO_DATE('01/01/0001','DD/MM/YYYY'); r_TrnVal_Comp := 0; r_TrnDat_Cred := TO_DATE('01/01/0001','DD/MM/YYYY'); r_TrnVal_Cred := 0; -- UPDATE GRUPO_SNCCR SET GRUPO_SNCCR.PROCESSADO = 1 , GRUPO_SNCCR.GCRATUDAT = SYSDATE WHERE GRUPO_SNCCR.SEQ = r_Crt.Seq AND GRUPO_SNCCR.CRTNUM = r_Crt.CrtNum; -- IF v_qtd_registros = 1000 THEN COMMIT; v_qtd_registros := 0; END IF; -- END; -- END LOOP; -- IF v_qtd_registros <> 0 THEN COMMIT; END IF; -- END;