In una precedura posso aprire un ciclo for all'interno di un ciclo for tramite questa sintassi???
FOR REC IN C3 LOOP
FOR RIGA IN C1 LOOP
....
...
....
END LOOP
END LOOP
Qui ci vuole FLOYYYYYYDDD :tongue:
In una precedura posso aprire un ciclo for all'interno di un ciclo for tramite questa sintassi???
FOR REC IN C3 LOOP
FOR RIGA IN C1 LOOP
....
...
....
END LOOP
END LOOP
Qui ci vuole FLOYYYYYYDDD :tongue:
Abbattiamo il consumismo http://video.google.it/videoplay?do...91301&hl=it
direi di si
e di solito puoi annidare fino a 255 cicli (ma non so se si può generalizzare)
E' che dura<nte la compilazione mi da questo errore :Originariamente inviato da darkblOOd
direi di si
e di solito puoi annidare fino a 255 cicli (ma non so se si può generalizzare)
PLS-00103: Encountered the symbol "LOOP" when expecting one of the following:
if
ma la chiusura dei loop e delle IF è corretta.. non so più cosa guardare...![]()
Abbattiamo il consumismo http://video.google.it/videoplay?do...91301&hl=it
qualche ; dimenticato? :master:Originariamente inviato da Elena78
E' che dura<nte la compilazione mi da questo errore :
PLS-00103: Encountered the symbol "LOOP" when expecting one of the following:
if
ma la chiusura dei loop e delle IF è corretta.. non so più cosa guardare...![]()
facce vede er codice
Originariamente inviato da darkblOOd
qualche ; dimenticato? :master:![]()
Abbattiamo il consumismo http://video.google.it/videoplay?do...91301&hl=it
eddai co sta faccinaOriginariamente inviato da Elena78
![]()
segui il consiglio di floyd
Originariamente inviato da floyd
facce vede er codice
lunghiissssssimooooo
CREATE OR REPLACE PROCEDURE SCHEDE_STALE_NUOVA_PROC
AS
-- dichiaro i cursori e le variabili
esito_scheda VARCHAR(3);
esito_storico CHAR(30);
num NUMBER;
numtmp NUMBER;
ind NUMBER;
es_dett_outb CHAR(3);
rc_type CHAR(1);
rc_status CHAR(1);
c_result CHAR(1);
rc_type_storico CHAR(1);
rc_status_storico CHAR(1);
c_result_storico CHAR(1);
err CONSTANT varchar(5) default 'err';
ok CONSTANT varchar(5) default 'ok';
esito Recall18.COL_ESITO%TYPE;
esito_storico Recall_storico.COL_ESITO_NEW%TYPE;
es_storico CHAR(5);
CURSOR c1 IS
select * from Recall18 where col_esito is not null and record_status=5;
--riga c1%ROWTYPE;
CURSOR c3 IS
select * from recall18;
FUNCTION stato_scheda (param dett_esiti_outb.COD_ESITO%TYPE) RETURN VARCHAR IS esito_scheda VARCHAR(3);
BEGIN
IF param = '00' THEN
esito_scheda := '110' ;
ELSIF param = '01' THEN
esito_scheda := '141' ;
ELSIF param = '02' THEN
esito_scheda := '141' ;
ELSIF param = '03' THEN
esito_scheda := '141' ;
ELSIF param = '05' THEN
esito_scheda := '510' ;
END IF;
rc_type:= SUBSTR(esito_scheda,1,1);
rc_status:= SUBSTR(esito_scheda,2,1);
c_result:= SUBSTR(esito_scheda,3,1);
RETURN esito_scheda;
END stato_scheda;
BEGIN
DBMS_OUTPUT.ENABLE(100000);
ind:=0;
DBMS_OUTPUT.PUT_LINE('Controllo Schede in Stale del giorno' || to_date(sysdate,'DD/MM/YYYY'));
DBMS_OUTPUT.PUT_LINE(' ');
for reco in c3 LOOP;
IF rc.record_status='5' THEN /* Se e uno stale */
for riga in c1 LOOP /*inizio il ciclo per ogni scheda in c1 */
ind := ind+1;
SELECT MAX(ID_STORICO) as Max into num from Recall_storico where colonna5= riga.colonna5;
IF num = 0 or num is null then /* la scheda e un'anteprima */
DBMS_OUTPUT.PUT_LINE(err || ' ' || riga.COLONNA5 || ' La scheda e un anteprima');
ind:=ind+1; /*incremento il numero di schede con anomalia */
ELSE
numtmp:=LENGTH(rtrim(riga.col_esito));
IF numtmp= 4 THEN /* recuper i primi 2 o 3 caratteri di col_esito */
esito:= SUBSTR(riga.col_esito,3,2);
END IF;
IF numtmp= 5 THEN /* recuper i primi 2 o 3 caratteri di col_esito */
esito:= SUBSTR(riga.col_esito,3,3);
END IF;
IF numtmp= 2 THEN /* recuper i primi 2 o 3 caratteri di col_esito */
esito:= riga.col_esito;
END IF;
SELECT tipo_esito into es_dett_outb FROM dett_esiti_outb WHERE COD_CAMPAGNA='18' AND cod_esito= esito;
SELECT COL_ESITO_NEW INTO es_storico FROM Recall_storico WHERE colonna5= riga.colonna5 and id_storico=num;
IF riga.COL_ESITO = es_storico then /* verifica l esito applicativo */
SELECT record_type_new, record_status_new, call_result_new INTO rc_type_storico,rc_status_storico,c_result_storico FROM Recall_storico where colonna5=riga.colonna5 and id_storico=num;
esito_scheda:= stato_scheda(es_dett_outb);
IF rc_type= rc_type_storico AND rc_status= rc_status_storico AND c_result= c_result_storico THEN
UPDATE Recall18 SET record_type= rc_type, record_status= rc_status, call_result= c_result
WHERE colonna5= riga.colonna5;
COMMIT;
DBMS_OUTPUT.PUT_LINE(ok || ' ' || riga.COLONNA5 || ' Scheda aggiornata correttamente');
ELSE
DBMS_OUTPUT.PUT_LINE(err ||' ' || riga.COLONNA5 || ' L esito telefonico della tabella RECALL_STORICO non coincide con l esito telefonico della scheda ON LINE');
END IF;
ELSE /* l'esito applicativo della tabella on line non corrisponde con l'esito dello storico */
DBMS_OUTPUT.PUT_LINE(err || ' ' || riga.COLONNA5 || ' L esito applicativo della tabella RECALL_STORICO non coincide con l esito applicativo della scheda ON LINE');
END IF;
END IF;
END LOOP;
IF ind = 0 THEN
DBMS_OUTPUT.PUT_LINE(' Nessuna scheda in Stale per la Campagna18 ');
END IF;
END LOOP;
ELSE /* Se Non e una scheda in stale */
ind := ind+1;
SELECT MAX(ID_STORICO) as Max into num from Recall_storico where colonna5= rc.colonna5;
SELECT record_type_new, record_status_new, call_result_new INTO rc_type_storico,rc_status_storico,c_result_storico , es_storico FROM Recall_storico WHERE colonna5= rc.colonna5 and id_storico=num;
IF rc.COL_ESITO = es_storico then /* verifica l esito applicativo, se congruente */
IF rc.record_type = rc_type_storico and rc.record_status= rc_status_storico and rc.call_result= c_result_storico then
END LOOP;
END IF;
ELSE
DBMS_OUTPUT.PUT_LINE(err ||' ' || rc.COLONNA5 || ' L esito telefonico/applicativo della tabella RECALL_STORICO non coincide con l esito della scheda ON LINE (scheda non in Stale)');
END IF;
END IF;
END LOOP;
END SCHEDE_STALE_NUOVA_PROC;
/
Abbattiamo il consumismo http://video.google.it/videoplay?do...91301&hl=it
buttando un occhio mi sembra ci sia qualche problema di chiusura
prova ad indentare il codice così ti rendi conto meglio:
codice:FOR ... LOOP1 IF1 ... THEN FOR ... LOOP2 xxxx xxxx IF2 ... THEN xxx xxx xxx ELSE2 xxx END IF2 END LOOP ELSE1 xxx END IF1 END LOOP1![]()
mi sembra sbagliato for reco in c3 LOOP; togli il ;