Buenos días,
Tengo un problema con un código para el que necesito usar Bulk Collet Es el siguiente:
VARIABLE Retorno NUMBER
set serveroutput on;
alter session set skip_unusable_indexes=true;
DECLARE
-- ------------------------
-- DECLARACIÓN DE VARIABLES
-- ------------------------
TYPE TTB_ID IS TABLE OF sgc_hoc_msisdn.ID%TYPE INDEX BY BINARY_INTEGER;
TYPE TTB_MAX IS TABLE OF sgc_hoc_msisdn.contactdate%TYPE INDEX BY BINARY_INTEGER;
VTB_ID TTB_ID;
VTB_MAX TTB_MAX;
CURSOR CUR_RECREA_ID IS
SELECT
max(contactdate) MAX_CONTACTDATE,
ID
FROM sgc_hoc_msisdn
GROUP BY id
HAVING count(id)>1;
v_num_reg NUMBER(10);
v_contador NUMBER(20);
BEGIN
:Retorno := 0;
v_num_reg := 0;
v_contador := 0;
OPEN CUR_RECREA_ID;
LOOP
FETCH CUR_RECREA_ID BULK COLLECT INTO VTB_MAX, VTB_ID LIMIT 100;
FORALL i IN 1 .. VTB_ID.COUNT
UPDATE SGCADMIP.SGC_HOC_MSISDN
SET OLD_ID = VTB_ID(i), ID = SGCADMIP.SEQ_HOC_MSISDN.NEXTVAL
WHERE ID = VTB_ID(i)
AND CONTACTDATE = VTB_MAX(i);
v_contador := v_contador + 1;
IF v_contador = 1000 THEN
COMMIT;
v_num_reg := v_num_reg + v_contador;
v_contador := 0;
END IF;
EXIT WHEN CUR_RECREA_ID%NOTFOUND ;
END LOOP ;
COMMIT ;
CLOSE CUR_RECREA_ID;
v_num_reg := v_num_reg + v_contador;
DBMS_OUTPUT.PUT_LINE ('--');
DBMS_OUTPUT.PUT_LINE ('Numero de registros actualizados: '||v_num_reg);
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Error Oracle: ');
DBMS_OUTPUT.PUT_LINE(SQLERRM);
:Retorno := 2;
END;
/
EXIT :Retorno
Intento actualizar el campo old_id con el id antiguo e id con un nuevo secuencial. El problema es que VTB_ID.COUNT me aparece como no definido (undeclare identifier VTB_ID) Por lo que no realiza el UPDATE, pero si las lineas posteriores. Es únicamente el update lo que se salta sin mostrar ningún tipo de error.
Ya no sé que más comprobar, por favor alguien sabe por que puede pasar esto??