Estou com o seguinte problema.
Criei uma procedure que lê alguns dados do cursor, joga esses dados para uma Type. Que atendendo à algumas regras faz o update.
O problema vem agora. Vamos dizer que o cursor retorne 1000 Registros, mas depois que eu executo a procedure apenas 200 foram alterados. Ficando 800 registros sem atualizar. Se eu rodar novamente, mas alguns registros são atualizados e outros não...
Segue abaixo a versão, ferramenta e o código.
Versão do SGBD: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
Ferramenta: Oracle SQL Developer (3.2.20.09)
create or replace
PACKAGE BODY PACK_COMPARA_SOLIC IS
------------------------------------------------------------------------------------
PROCEDURE PROC_QRY_COMPARA_SOLIC(P_TYPE IN OUT NOCOPY TYP_TAB_EV_COMPARA,
P_CD_RETORNO OUT NUMBER,
P_DS_MENSAGEM OUT VARCHAR2) IS
------------------------------------------------------------------------------------
V_CONT NUMBER(10) := 0;
CURSOR CUR_TYPE IS
SELECT
EVS1.ID_ACESSO,
EVS1.COD_SOLIC,
REPLACE(REPLACE(TO_CHAR(EVS2.IP_LAN_01_F), CHR(10), ''), CHR(13), '') AS IP_LAN_01_F_A,
REPLACE(REPLACE(TO_CHAR(EVS1.IP_LAN_01_I), CHR(10), ''), CHR(13), '') AS IP_LAN_01_I,
REPLACE(REPLACE(TO_CHAR(EVS1.IP_LAN_01_F), CHR(10), ''), CHR(13), '') AS IP_LAN_01_F,
EVS1.IP_LAN_01_A,
CASE WHEN EVS1.IP_LAN_01_A = 'SIM' THEN
CASE WHEN NVL(TO_CHAR(EVS2.IP_LAN_01_F), 'NULL') = NVL(TO_CHAR(EVS1.IP_LAN_01_I), 'NULL') THEN 'OK' ELSE 'ERRO' END
ELSE -- NÃO É ALTERADO
CASE WHEN NVL(TO_CHAR(EVS2.IP_LAN_01_F), 'NULL') = NVL(TO_CHAR(EVS1.IP_LAN_01_F), 'NULL') THEN 'OK' ELSE 'ERRO' END
END AS IP_LAN_01_C
FROM
EV_COMPARA_SOLIC_BKB EVS1
LEFT JOIN EV_CONCORRENTE_SOLIC EVCS1 ON EVS1.COD_SOLIC = EVCS1.COD_SOLIC_ATUAL
JOIN EV_ORDEM_SOLIC EVO1 ON EVS1.COD_SOLIC = EVO1.COD_SOLIC
JOIN EV_COMPARA_SOLIC_BKB EVS2 ON EVO1.COD_SOLIC_ANT = EVS2.COD_SOLIC
JOIN (SELECT EVO1.ID_ACESSO, MIN(EVO1.COD_ORDEM) COD_ORDEM FROM EV_ORDEM_SOLIC EVO1 WHERE EVO1.COD_SOLIC_TIPO = 600 GROUP BY EVO1.ID_ACESSO) T1 ON EVS1.ID_ACESSO = T1.ID_ACESSO
WHERE (EVS1.IP_LAN_01_A = 'SIM' AND NVL(TO_CHAR(EVS2.IP_LAN_01_F), 'NULL') <> NVL(TO_CHAR(EVS1.IP_LAN_01_I), 'NULL'))
OR (EVS1.IP_LAN_01_A = 'NÃO' AND NVL(TO_CHAR(EVS2.IP_LAN_01_F), 'NULL') <> NVL(TO_CHAR(EVS1.IP_LAN_01_F), 'NULL'))
ORDER BY
EVO1.COD_ORDEM ASC;
BEGIN
DBMS_OUTPUT.DISABLE();
V_CONT := 0;
FOR X IN CUR_TYPE LOOP
V_CONT := V_CONT + 1;
P_TYPE(V_CONT).ID_ACESSO := X.ID_ACESSO;
P_TYPE(V_CONT).COD_SOLIC := X.COD_SOLIC;
P_TYPE(V_CONT).IP_LAN_01_F_A := X.IP_LAN_01_F_A;
P_TYPE(V_CONT).IP_LAN_01_I := X.IP_LAN_01_I;
P_TYPE(V_CONT).IP_LAN_01_F := X.IP_LAN_01_F;
P_TYPE(V_CONT).IP_LAN_01_A := X.IP_LAN_01_A;
P_TYPE(V_CONT).IP_LAN_01_C := X.IP_LAN_01_C;
END LOOP;
IF P_TYPE.COUNT > 0 THEN
FOR I IN P_TYPE.FIRST .. P_TYPE.LAST LOOP
IF P_TYPE(I).IP_LAN_01_C = 'ERRO' THEN
IF P_TYPE(I).IP_LAN_01_A = 'SIM' THEN
UPDATE EV_COMPARA_SOLIC_BKB
SET IP_LAN_01_I = P_TYPE(I).IP_LAN_01_F_A
WHERE COD_SOLIC = P_TYPE(I).COD_SOLIC;
ELSIF P_TYPE(I).IP_LAN_01_A = 'NÃO' THEN
UPDATE EV_COMPARA_SOLIC_BKB
SET IP_LAN_01_F = P_TYPE(I).IP_LAN_01_F_A
WHERE COD_SOLIC = P_TYPE(I).COD_SOLIC;
END IF;
END IF;
END LOOP;
END IF;
EXCEPTION
WHEN DUP_VAL_ON_INDEX THEN
P_CD_RETORNO := 3;
P_DS_MENSAGEM := 'Registro com chave duplicada!! PROC_UPD_COMPARA_SOLIC';
ROLLBACK;
WHEN OTHERS THEN
P_CD_RETORNO := 9999;
P_DS_MENSAGEM := 'PROC_QRY_COMPARA_SOLIC: '|| SQLERRM;
ROlLBACK;
END PROC_QRY_COMPARA_SOLIC;
END PACK_COMPARA_SOLIC;
