como puedo

tema enviado por paolita en ORACLE
tema iniciado el 06/12/2007

como puedo manejar loops anidados en plsql, solo me realiza una vez el loop interno y luego de que este termina, termina el externo igual y no realiza todo lo que se tiene que hacer ... = ( ayudenme este es el codigo

 

PROCEDURE SEIS IS

 CURSOR C_DATOS IS
 select * from 
 (SELECT AA.SRI_EMPRESA,AA.SRI_AUTORIZACION,CC.SRI_T_TPDCODIGO,DECODE (CC.SRI_T_TPDCODIGO,27,1,127,2,9,4,8,5,34,6,2,7) as numero,
 DD.TPD_ID,DD.TPD_NOMBRE,BB.SRI_DAUT_ALMACEN, EE.ALM_ID,EE.ALM_NOMBRE ,
 BB.SRI_DAUT_PV, FF.PVE_ID, FF.PVE_NOMBRE
 FROM DATA_USR.SRI_MAN_AUTORIZACION AA, DATA_USR.SRI_MAN_AUT_ALM_PV BB, DATA_USR.SRI_MAN_TIPODOC CC, DATA_USR.TIPODOC DD,
 DATA_USR.ALMACEN EE, DATA_USR.PUNTOVENTA FF
 WHERE AA.SRI_EMPRESA = BB.SRI_DAUT_EMPRESA AND AA.SRI_AUTORIZACION = BB.SRI_DAUT_AUTORIZACION
 AND   AA.SRI_EMPRESA = CC.SRI_T_EMPRESA
 AND   CC.SRI_T_TPDCODIGO = DD.TPD_CODIGO
 AND   EE.ALM_EMPRESA = BB.SRI_DAUT_EMPRESA AND EE.ALM_CODIGO = BB.SRI_DAUT_ALMACEN
 AND   FF.PVE_EMPRESA = BB.SRI_DAUT_EMPRESA AND FF.PVE_ALMACEN = BB.SRI_DAUT_ALMACEN AND FF.PVE_SECUENCIA = BB.SRI_DAUT_PV
 AND AA.SRI_EMPRESA = :PARAMETER.PA_EMPRESA2
 AND EE.ALM_CODIGO = :PARAMETER.PA_ALMACEN
 AND FF.PVE_SECUENCIA = :PARAMETER.PA_PV
 AND DD.TPD_CODIGO = :PARAMETER.PA_TIPODOC) xx
 ORDER BY xx.SRI_EMPRESA,xx.SRI_AUTORIZACION, xx.numero, xx.ALM_ID, xx.PVE_ID;

  NUM_CCO_NUMERO NUMBER(10); 
  NUM_CONTADOR NUMBER(10);

BEGIN
 
 --ELIMINO DATOS DE LA TABLE REP_SRI_AUTOIMPRESORES
 delete from data_usr.rep_sri_autoimpresores;
 -- Baja el nivel de mensaje de Forms 
 :System.Message_Level := 5;
 -- Graba registro actual
 COMMIT;
 -- Restaura el nivel de mensaje de Forms
 :System.Message_Level := 0; 
 
 GO_BLOCK(f_global.g_bloque);
 FIRST_RECORD; 
  LOOP         
  IF NAME_IN(f_global.g_bloque||'.DSP_MARCADO' ) = 1 then   
   GO_BLOCK(f_global.g_bloque_D);
   FIRST_RECORD; 
    LOOP  
      IF NAME_IN(f_global.g_bloque_D||'.DSP_MARCADO1' ) = 1 then 
   
      :PARAMETER.PA_ALMACEN := NAME_IN(f_global.g_bloque||'.ALM_CODIGO');
      :PARAMETER.PA_PV := NAME_IN(f_global.g_bloque||'.PV_CODIGO');
      :PARAMETER.PA_TIPODOC := NAME_IN(f_global.g_bloque_D||'.TDO_CODIGO');
     
       IF NAME_IN('BUSQUEDA.DSP_EMPRESA_ID') IS NOT NULL AND NAME_IN('BUSQUEDA.DSP_FECHA') IS NOT NULL THEN   
        FOR I IN C_DATOS LOOP         
           NUM_CCO_NUMERO :=   DATA_USR.CCO_INICIO(:PARAMETER.PA_EMPRESA2,I.SRI_DAUT_ALMACEN,I.SRI_DAUT_PV,I.SRI_T_TPDCODIGO,:PARAMETER.PA_FECHA,:PARAMETER.PA_FECHA_V);
           IF NUM_CCO_NUMERO <> -2 THEN
            IF NUM_CCO_NUMERO = - 1 THEN
                INSERT INTO DATA_USR.Rep_Sri_Autoimpresores A
              (A.SRI_RUC,A.SRI_AUTORIZACION_A,A.SRI_AUTORIZACION_N,A.SRI_TIPO_TRAMITE,A.SRI_FECHA_REPORTE,A.SRI_COD_TIP_DOC,
                  A.SRI_COD_ESTABLECIMIENTO,A.SRI_COD_PUN_EMISION,A.SRI_SEQ_A,A.SRI_SEQ_N)                                   
              VALUES (:PARAMETER.PA_RUC,NULL,:PARAMETER.PA_AUTN,6,:PARAMETER.PA_FECHA_REPORTE,I.NUMERO,
                I.ALM_ID,I.PVE_ID,NULL,0);                                                      
            -- Baja el nivel de mensaje de Forms 
            :System.Message_Level := 5;
            -- Graba registro actual
             COMMIT;
            -- Restaura el nivel de mensaje de Forms
             :System.Message_Level := 0;                                    
            ELSE
             INSERT INTO DATA_USR.Rep_Sri_Autoimpresores A
              (A.SRI_RUC,A.SRI_AUTORIZACION_A,A.SRI_AUTORIZACION_N,A.SRI_TIPO_TRAMITE,A.SRI_FECHA_REPORTE,A.SRI_COD_TIP_DOC,
                  A.SRI_COD_ESTABLECIMIENTO,A.SRI_COD_PUN_EMISION,A.SRI_SEQ_A,A.SRI_SEQ_N)                                   
              VALUES (:PARAMETER.PA_RUC,NULL,:PARAMETER.PA_AUTN,6,:PARAMETER.PA_FECHA_REPORTE,I.NUMERO,
                I.ALM_ID,I.PVE_ID,NULL,NUM_CCO_NUMERO);                                                      
            -- Baja el nivel de mensaje de Forms 
            :System.Message_Level := 5;
            -- Graba registro actual
             COMMIT;
            -- Restaura el nivel de mensaje de Forms
             :System.Message_Level := 0;   
            END IF;     
           ELSE
             f_alert.mostrar_error('','LA FUNCION CCO_INICIO ARROJO ERRORES', f_global.g_error);      
           END IF;    
        END LOOP;         
       END IF;  
      
      
      END IF;
   EXIT WHEN :SYSTEM.LAST_RECORD = 'TRUE'; 
   IF :SYSTEM.LAST_RECORD != 'TRUE' THEN
     NEXT_RECORD;
   END IF; 
    END LOOP; 
   
   
   END IF;
  EXIT WHEN :SYSTEM.LAST_RECORD = 'TRUE';
  IF :SYSTEM.LAST_RECORD != 'TRUE' THEN
    NEXT_RECORD;
  END IF;  
  END LOOP; 
  
END;