Oracle - CORTAR UN FOR LOOP SIN CONTINUE

 
Vista:
sin imagen de perfil

CORTAR UN FOR LOOP SIN CONTINUE

Publicado por miriam (1 intervención) el 07/04/2017 22:19:37
como estan soy nueva en este de subir mis codigos pero estoy tratando con esto
el problema es que tengo dos tablas aag_lectura y aag_cuenta, mi for recorre las dos donde cada cuenta tiene n lecturas, sin embargo deseo extraer aquellas cuentas cuyas lecturas anteriores y actuales sean iguales, practicamente es lo que este procedimiento realiza, pero solo debe traerme aquellas cuyas lecturas repetidas son hasta el mes corrido, es decir si estamos abril 2016 y mi cuenta 1 tiene la misma lectura desde enero 2017 hasta abril 2017 debe traerla, pero si mi cuenta 1 tiene la misma lectura desde enero 2017 hasta marzo 2017 y en abril 2017 cambio NO DEBE MOSTRARLA y este es el problema
intente con EXIT WHEN PERO SE ME SALE DEL BUCLE Y NO SIGUE CON LAS OTRAS CUENTAS de las misma forma con CONTINUE pero en esta version no me permite usarlo. alguna idea ?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
DECLARE
 err_num NUMBER;
 err_msg VARCHAR2(255);
 
CURSOR CUENTAS IS
SELECT  UNIQUE(A.CUENTA)
FROM AAG_LECTURA a, AAG_CUENTA B
WHERE A.CUENTA = B.CODIGO_CUENTA AND a.ESTADO ='PRO' AND  ANIO = :ANO AND B.CODIGO_CUENTA > 8000 ORDER BY a.CUENTA DESC;
 
CURSOR LECTURAS IS
SELECT  a.cuenta,a.ANIO,A.DESDE,a.secuencia,a.lec_anterior,a.lec_actual, B.PRO_NOMBRE1,B.PRO_APELLIDO1, B.PRO_NOMBRE2,B.PRO_APELLIDO2
FROM AAG_LECTURA a, AAG_CUENTA B
WHERE A.CUENTA = B.CODIGO_CUENTA AND a.ESTADO ='PRO' AND  ANIO = :ANO AND B.CODIGO_CUENTA > 8000 ORDER BY a.CUENTA,A.DESDE DESC;
 
MES NUMBER(2):=0;
CUENTA NUMBER(5) :=0;
--para que verifique SI EL SGT REGISTRO TIENE CONSUMO 0
CONSUMOANTERIOR NUMBER(8):=-1;
CONSUMO NUMBER(5) :=0;
BANDERA NUMBER(1) :=1;
BANDERAC NUMBER(1) :=1;
BANDERA2 NUMBER(1) :=1;
BANDERA3 NUMBER(1) :=0;
BEGIN
 
SELECT  MIN(a.cuenta) INTO CUENTA
FROM AAG_LECTURA a, AAG_CUENTA B
WHERE A.CUENTA = B.CODIGO_CUENTA AND a.ESTADO ='PRO' AND  ANIO = :ANO AND B.CODIGO_CUENTA >8000 ORDER BY a.CUENTA,A.DESDE DESC;
 
FOR REG2 IN CUENTAS LOOP
 
   FOR REG IN LECTURAS  LOOP
 
	 CONSUMO:=REG.LEC_ACTUAL-REG.LEC_ANTERIOR;
 
 
	 --para ver si el regiostro es? de la misma cuenta
     IF CUENTA=REG.CUENTA THEN
     BANDERAC:=1;
     ELSE
     BANDERAC:=0;
     END IF;
	 --para ver si la lectura es 0
     IF CONSUMO=0 THEN
     BANDERA:=1;
     ELSE
     BANDERA:=0;
     END IF;
 
	 -- SI EL CONSUMO ANTERIOR ES CERO QUIERER DECIR QUE SE DEBE INGRESAR
	 IF CONSUMOANTERIOR = 0 THEN
	 BANDERA2 := 1;
	 ELSE
	 BANDERA2 :=0;
	 END IF;
 
 
	    --- SI EL CONSUMO ES 0 Y EL CONSUMOANTERIOR ES 0 ENTONCES SE INSERTA
         IF CONSUMO=0 AND BANDERAC=1 AND BANDERA=1  AND BANDERA2 = 1 AND BANDERA3 = 0  THEN
         MES := MES  + 1;
	     INSERT INTO AAG_T_SC (cuenta,PRO_NOMBRE1,PRO_NOMBRE2,PRO_APELLIDO1,PRO_APELLIDO2,lectura_anterior,lectura_actual,mes, ANIO)
         values (reg.cuenta,REG.PRO_NOMBRE1,REG.PRO_NOMBRE2,REG.PRO_APELLIDO1,REG.PRO_APELLIDO2,reg.lec_anterior,reg.lec_actual,mes, REG.ANIO);
         ELSE
         MES  := 0;
         BANDERA:=0;
		 BANDERA2 :=0;
         END IF;
 
        CONSUMOANTERIOR:= CONSUMO;
 
	    CUENTA := REG.CUENTA;
 
   END LOOP;
 
END LOOP;
EXCEPTION
WHEN OTHERS THEN
  err_num := SQLCODE;
  err_msg := SQLERRM;
  DBMS_OUTPUT.put_line('Error:'||TO_CHAR(err_num));
  DBMS_OUTPUT.put_line(err_msg);
END;
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder