SoloCodigo
Bases de Datos => Oracle => Mensaje iniciado por: Kina en Martes 8 de Abril de 2008, 10:12
-
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?? :(
-
Ok, consegui solucionarlo.
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
ID,
max(contactdate) MAX_CONTACTDATE
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_ID, VTB_MAX LIMIT 100;
FORALL indx IN VTB_ID.FIRST .. VTB_ID.LAST
UPDATE SGCADMIP.SGC_HOC_MSISDN
SET OLD_ID = VTB_ID(indx), ID = SGCADMIP.SEQ_HOC_MSISDN.NEXTVAL
WHERE ID = VTB_ID(indx)
AND CONTACTDATE = VTB_MAX(indx);
v_num_reg := v_num_reg + 100;
EXIT WHEN CUR_RECREA_ID%NOTFOUND ;
COMMIT ;
END LOOP ;
COMMIT ;
CLOSE CUR_RECREA_ID;
Tenia mal la asignación el el Bulk. Un saludo.