› Fóruns › SQL e PL/SQL › Tuning em Cursor com Update › Tuning em Cursor com Update
10 de outubro de 2013 às 5:24 pm
#105995
Participante
@Andrei Rubino
Realmente com esses números não é viável fazer numa tacada só. Quando vi o GROUP BY no CURSOR achei estranho, creio que você deve utilizar a tabela pai, não a filha. Remova o ORDER BY também.
Creio que assim fica melhor:
DECLARE
CURSOR C1 IS
SELECT /*+ PARALLEL(4) */
NR_MATRICULA_UNIDADE, DT_MES_ANO_REF
FROM MOVTO_SERVICO_FATURA_AUX
GROUP BY NR_MATRICULA_UNIDADE, DT_MES_ANO_REF
ORDER BY DT_MES_ANO_REF, NR_MATRICULA_UNIDADE;
TYPE TR1 IS TABLE OF C1%ROWTYPE INDEX BY PLS_INTEGER;
R1 TR1;
v_MAX_NR_DIFER NUMBER;
BEGIN
OPEN C1;
LOOP
FETCH C1 BULK COLLECT
INTO R1 LIMIT 3000;
EXIT WHEN R1.COUNT = 0;
COMMIT;
FOR I IN 1 .. R1.COUNT LOOP
BEGIN
UPDATE MOVTO_SERVICO_FATURA_AUX
SET ID_SITUACAO_MOVTO = 'F', ID_INSERIR = 'S'
WHERE (NR_MATRICULA_UNIDADE, DT_MES_ANO_REF, NR_DIFER_ORI) IN
(SELECT NR_MATRICULA_UNIDADE,
DT_MES_ANO_REF,
MAX(NR_DIFER_ORI)
FROM MOVTO_SERVICO_FATURA_AUX
WHERE NR_MATRICULA_UNIDADE = R1(I)
.NR_MATRICULA_UNIDADE
AND DT_MES_ANO_REF = R1(I).DT_MES_ANO_REF
GROUP BY NR_MATRICULA_UNIDADE, DT_MES_ANO_REF)
EXCEPTION
WHEN OTHERS THEN RAISE_APPLICATION_ERROR(-20000, 'SQL ERROR: ' || SQLERRM || ' SQL CODE: ' || SQLCODE);
END;
END LOOP;
END LOOP;
COMMIT;
END;
/