Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 29
  1. #1
    Utente di HTML.it L'avatar di Elena78
    Registrato dal
    Oct 2001
    Messaggi
    535

    ORACLE : PL/SQL Aperturta più cicli FOR ...LOOP

    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:

  2. #2
    Utente di HTML.it L'avatar di darkblOOd
    Registrato dal
    Jul 2001
    Messaggi
    2,212
    direi di si

    e di solito puoi annidare fino a 255 cicli (ma non so se si può generalizzare)

  3. #3
    Utente di HTML.it L'avatar di Elena78
    Registrato dal
    Oct 2001
    Messaggi
    535
    Originariamente inviato da darkblOOd
    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 :
    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...

  4. #4
    Utente di HTML.it L'avatar di darkblOOd
    Registrato dal
    Jul 2001
    Messaggi
    2,212
    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...
    qualche ; dimenticato? :master:

  5. #5
    Utente di HTML.it L'avatar di floyd
    Registrato dal
    Apr 2001
    Messaggi
    3,837
    facce vede er codice

  6. #6
    Utente di HTML.it L'avatar di Elena78
    Registrato dal
    Oct 2001
    Messaggi
    535
    Originariamente inviato da darkblOOd
    qualche ; dimenticato? :master:

  7. #7
    Utente di HTML.it L'avatar di darkblOOd
    Registrato dal
    Jul 2001
    Messaggi
    2,212
    Originariamente inviato da Elena78
    eddai co sta faccina

    segui il consiglio di floyd

  8. #8
    Utente di HTML.it L'avatar di Elena78
    Registrato dal
    Oct 2001
    Messaggi
    535
    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;
    /

  9. #9
    Utente di HTML.it L'avatar di darkblOOd
    Registrato dal
    Jul 2001
    Messaggi
    2,212
    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

  10. #10
    Utente di HTML.it L'avatar di floyd
    Registrato dal
    Apr 2001
    Messaggi
    3,837
    mi sembra sbagliato for reco in c3 LOOP; togli il ;

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.