Pular para o conteúdo

Fóruns SQL e PL/SQL Tuning em Cursor com Update Tuning em Cursor com Update

#105995
rman
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;
    /