• Domingo 22 de Diciembre de 2024, 13:14

Autor Tema:  Problema Con Bulk Collect  (Leído 2009 veces)

Kina

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
Problema Con Bulk Collect
« en: Martes 8 de Abril de 2008, 10:12 »
0
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??  :(

Kina

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
Re: Problema Con Bulk Collect
« Respuesta #1 en: Martes 8 de Abril de 2008, 13:01 »
0
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.