Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 18
  1. #1

    [PL\SQL] Procedura assicurativa for innestati

    Salve a tutti chiedo un grandissimo aiuto.
    sto creando delle procedure il PL\sql con oracle ma questa procedura mi sta dando parecchie rogne
    prendiamo in considerazione le 2 tabelle che mi servono in questa procedura
    CLIENTI E VIAGGIO
    in clienti ci son molti attributi tra cui un cod_matricola PK
    e un codice fiscale
    mentre in viaggi abbiamo in ID_viaggio
    cod_cliente ovvero la FK a cod_matricola
    e altri atribbuti che non ci interessano
    in pratica questa procedura deve vedere se un cliente ha piu di 2 vetture (facendo un caunt sul codice fiscale) e inserirlo nella tabella viaggio sempre se in questultima non sia gia inserito

    ovvero cliente 101 ha 3 assicurazioni ok vince 1 viaggio
    oppure
    cliente 101 ha 4 assicurazioni ma e gia inserito in viaggi quindi non vince nulla XD









    Codice PHP:



    CREATE 
    OR REPLACE PROCEDURE P3(ID_VIAGGIO VARCHAR2,LUOGO VARCHAR2,GIORNI NUMBER,D_PARTENZA VARCHAR2,COD_CLIENTE VARCHAR2,COD_AGENZIA VARCHAR2)IS
    CURSOR CONTROLLOVIAGGI IS 
    (SELECT COUNT(CC_F),MIN(C_MATRICOLA),CC_F FROM CLIENTE GROUP BY CC_F HAVING COUNT(CC_F)>=2);
    CURSOR VIAGG IS (SELECT COD_CLIENTE FROM VIAGGIO WHERE COD_CLIENTE IS NOT NULL);
    A NUMBER :=0; --i del for (controllo viaggi)
    B NUMBER :=0; -- i del for (viagg)
    C_MATRI CLIENTE.C_MATRICOLA%TYPE; --matricola presente nella tabella cliente
    C_VIAGGIO VIAGGIO
    .COD_CLIENTE%TYPE; - codice viaggio presente nella tabella viaggio
    VIAGGIO_NOT_FOUND EXCEPTION
    ;
    BEGIN
    FOR B IN VIAGG LOOP
    FOR A IN CONTROLLOVIAGGI LOOP
    IF(C_MATRI=C_VIAGGIOTHEN
    RAISE VIAGGIO_NOT_FOUND
    ;
    END IF;
    END LOOP CONTROLLOVIAGGI;
    END LOOP VIAGG;
    EXCEPTION
    WHEN VIAGGIO_NOT_FOUND THEN
    DBMS_OUTPUT
    .PUT_LINE('CLIENTE GIA PRESENTE');
    RAISE_APPLICATION_ERROR(-20000,'CLIENTE GIA VINCITORE');
    END P3



    qui vi allego la creazione delle 2 tabelle per chiarirvi piu le idee credo che il mio errore sia nei 2 cicli for innestati




    Codice PHP:

    CREATE TABLE CLIENTE
    (
    C_MATRICOLA VARCHAR2(20PRIMARY KEY,
    LAVORO VARCHAR2(20) DEFAULT 'DISOCCUPATO',
    ETA NUMBER NOT NULL,
    CC_F VARCHAR2(16NOT NULL,
    ID_RICH VARCHAR2(5NOT NULL,
    FOREIGN KEY (CC_FREFERENCES Persona(CF),
    FOREIGN KEY (ID_RICHREFERENCES RICHIEDENTE(ID_RICHIEDENTE));



    CREATE TABLE VIAGGIO(
    ID_VIAGGIO VARCHAR2(4PRIMARY KEY,
    LUOGO VARCHAR2(20NOT NULL,
    GIORNI NUMBER NOT NULL,
    D_PARTENZA VARCHAR2(10NOT NULL,
    COD_CLIENTE VARCHAR2(20),
    COD_AGENZIA VARCHAR2(10),
    FOREIGN KEY (COD_CLIENTEREFERENCES CLIENTE(C_MATRICOLA),
    FOREIGN KEY (COD_AGENZIAREFERENCES LUOGO_LAVORO(ID_LAVORO)); 

    vi prego aiutatemi sto semplicemente sclerando
    Potrei morire per una {Ferrari 599 GTB Fiorano F1}

  2. #2
    nessuno che mi puo aiutare ......
    Potrei morire per una {Ferrari 599 GTB Fiorano F1}

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Ma il problema qual è? Non lo hai detto... compili con un generico "errore" o Oracle ti segnala qualcosa di particolare?

    Comunque, tanto per cominciare , sei sicuro che quelle query diano un risultato e non siano errate? Perché non provi a farle semplicemente per vedere se danno errori, ancora prima di scriverle per la dichiarazione del cursore?

    Poi, quello che sicuramente non va è questo:

    codice:
    IF(C_MATRI=C_VIAGGIO) THEN
    non è sintatticamente sbagliato ma le due variabili confrontate cosa dovrebbero contenere? Non c'è niente dentro, le hai solo dichiarate nella sezione apposita ma non ci fai nulla poi.
    every day above ground is a good one

  4. #4
    capito ora lo modificato ma mi da errore su alcune righe puoi dargli 1 okkiata le ho commentate


    Codice PHP:

    CREATE 
    OR REPLACE PROCEDURE P3(ID_VIAGGIO VARCHAR2,LUOGO VARCHAR2,GIORNI NUMBER,D_PARTENZA VARHAR2,COD_CLIENTE VARCHAR2,COD_AGENZIA VARCHAR2)IS
    CURSOR CONTROLLOVIAGGI IS 
    (SELECT COUNT(CC_F),MIN(C_MATRICOLA),CC_F FROM CLIENTE GROUP BY CC_F HAVING COUNT(CC_F)>=2);
    CURSOR VIAGG IS (SELECT COD_CLIENTE FROM VIAGGIO WHERE COD_CLIENTE IS NOT NULL);

    C_MATRI CLIENTE.C_MATRICOLA%TYPE;
    C_VIAGGIO VIAGGIO.COD_CLIENTE%TYPE;
    VIAGGIO_NOT_FOUND EXCEPTION;
    BEGIN
        
    FOR C_V IN VIAGG LOOP
            C_VIAGGIO
    :=C_V;                    -- Riga con erroreespressione di tipo errato)
            FOR 
    C_C IN CONTROLLOVIAGGI LOOP
            C_MATRI
    :=C_C;                    -- Riga con erroreespressione di tipo errato)
            IF(
    C_MATRI=C_VIAGGIOTHEN
                RAISE VIAGGIO_NOT_FOUND
    ;
            
    END IF;
        
    END LOOP;
    END LOOP;

    EXCEPTION
    WHEN VIAGGIO_NOT_FOUND THEN
    DBMS_OUTPUT
    .PUT_LINE('CLIENTE GIA PRESENTE');
    RAISE_APPLICATION_ERROR(-20000,'CLIENTE GIA VINCITORE');
    END
    Potrei morire per una {Ferrari 599 GTB Fiorano F1}

  5. #5
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Ma non puoi fare quelle assegnazioni.

    C_VIAGGIO e C_MATRI sono variabili di un particolare tipo (come le hai dichiarate tu), mentre C_V e C_C sono tuple "estratte" dai cursori... e non puoi assegnare una tupla ad una variabile, è un po' come se in C volessi assegnare un array ad una sola variabile scalare.
    every day above ground is a good one

  6. #6
    mmm quindi a livello pratico come dovrei fare per inizializare quei c_viaggio e c_matr in modo corretto ?
    Potrei morire per una {Ferrari 599 GTB Fiorano F1}

  7. #7
    pero cosi dovrebbe andare teoricamente giusto


    Codice PHP:

    CREATE 
    OR REPLACE PROCEDURE P1(N_POLIZZA VARCHAR2,SOTTOSCRIZIONE VARCHAR2,TERMINE VARCHAR2,CLASSE NUMBER,RATA NUMBER)IS
    CURSOR CONTROLLOASSICUR1 IS SELECT COD_POLIZZA FROM RICHIESTA
    ;
    CURSOR CONTROLLOASSICUR2 IS SELECT N_POLIZZA FROM ASSICURAZIONE;
    RPOLIZZA RICHIESTA.COD_POLIZZA%TYPE;
    APOLIZZA ASSICURAZIONE.N_POLIZZA%TYPE;
    ASSICURAZIONE_NOT_FOUND EXCEPTION;
    BEGIN
    FOR C_P IN CONTROLLOASSICUR1 LOOP 
    rpolizza
    :=C_P.cod_polizza;                            -- Riga con erroreespressione di tipo errato)
        FOR 
    C_C_P IN CONTROLLOASSICUR2 LOOP
    apolizza
    :=C_C_P.n_polizza;                        -- Riga con erroreespressione di tipo errato)
            if 
    APOLIZZA=RPOLIZZA then
                RAISE ASSICURAZIONE_NOT_FOUND
    ;
            
    end if;
    END LOOP;
    END LOOP;
    EXCEPTION
    WHEN ASSICURAZIONE_NOT_FOUND THEN
    DBMS_OUTPUT
    .PUT_LINE('ASSICURAZIONE GIA PRESENTE');
    RAISE_APPLICATION_ERROR(-20000,'ASSICURAZIONE GIA REGISTRATA');
    END
    Potrei morire per una {Ferrari 599 GTB Fiorano F1}

  8. #8
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Non c'è bisogno di scrivere

    C_P.cod_polizza

    e

    C_C_P.n_polizza

    perché stando alle query come le hai definite ora, queste già restituiscono valori di attributi "cod_polizza" e "n_polizza", quindi nei cicli for di cursore le variabili C_P e C_C_P contengono esattamente tali valori (non sono più tuple come prima) e quindi non c'è alcun bisogno dello specificatore di campo...
    every day above ground is a good one

  9. #9
    capito =) ma ammettiamo che nelle query avessi avuto 2 valori richiamate tipo:
    select count(n_Polizza),n_polizza from assicurazione groub by n_polizza;

    e mi servisse fare un confronto sul valore di ogni caunt riferita alla polizza...?


    come si sarebbe dovuto sviluppare il for e sopratutto dell' if ?

    credo che quella del for sarebbe stata comunque coretta anche in questo caso come quella fatta sopra...
    ma l'if? come dovrei fare inizializare e caricare i valori del cursor che appartengono a count(n_polizza)

    non so se mi hai capito anche xche la mia sintassi fa schifo visto che mi son svegliato da 10 min XD
    Potrei morire per una {Ferrari 599 GTB Fiorano F1}

  10. #10
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Originariamente inviato da Alessio86
    capito =) ma ammettiamo che nelle query avessi avuto 2 valori richiamate tipo:
    select count(n_Polizza),n_polizza from assicurazione groub by n_polizza;

    e mi servisse fare un confronto sul valore di ogni count riferita alla polizza...?
    "ogni"? In quella query che hai scritto vedo una sola funzione di aggregazione "count"... e poi con cosa dovresti confrontare, precisamente, questo valore?

    Se non chiarisci bene questo concetto...
    every day above ground is a good one

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 © 2025 vBulletin Solutions, Inc. All rights reserved.