Visualizzazione dei risultati da 1 a 2 su 2
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2014
    Messaggi
    48

    Alle prime armi con PL/SQL

    Salve a tutti,
    Mi sto esercitando con i trigger e mi sono imbattuto in questi errori, seguenti a questo trigger
    codice:
    create or replace trigger T_Ordine
    before insert on Ordine
    for each row
    
    DECLARE
    t_o excpetion;
    
    BEGIN
    select * 
    from Ordine join Rivenditore on Ordine.CF_Rivenditore = Rivenditore.CF 
    join Cliente on Cliente.CF_Rivenditore = Rivenditore.CF
    where Ordine.ID_Cliente = Cliente.ID;
    
    if :new.CF_Rivenditore <> Cliente.CF_Rivenditore then
    raise t_o;
    end if;
    
    EXCEPTION
    when t_o then
    raise_application_error(-20002,'Un rivenditore non puo ricevere ordini da un cliente non suo');
    end;
    /
    Gli errori invece sono:
    0/0 PL/SQL: Compilation unit analysis terminated
    2/5 PL/SQL: Item ignored
    2/5 PLS-00201: identifier 'EXCPETION' must be declared
    5/1 PLS-00428: an INTO clause is expected in this SELECT statement
    10/1 PL/SQL: Statement ignored
    10/34 PLS-00357: Table,View Or Sequence reference
    'CLIENTE.CF_RIVENDITORE' not allowed in this context

    15/6 PLS-00320: the declaration of the type of this expression is
    incomplete or malformed

    Qualcuno mi può spiegare anche orientativamente a cosa sono dovuti questi errori? GRAZIE!

  2. #2
    Utente di HTML.it
    Registrato dal
    Mar 2014
    Messaggi
    48
    Ho modificato il trigger in questo modo:

    codice:
    create or replace trigger T_Ordine
    after insert on Ordine
    for each row
    
    DECLARE
    conta number := 0;
    t_o exception;
    
    BEGIN
    select count(*) into conta
    from Ordine join Cliente on Ordine.ID_Cliente = Cliente.ID_Cliente 
    where Ordine.CF_Rivenditore <> Cliente.C_CF_Rivenditore;
    
    if conta > 0 then
    raise t_o;
    end if;
    
    EXCEPTION
    when t_o then
    raise_application_error(-20002,'Un rivenditore non puo ricevere ordini da un cliente non suo');
    end;
    /
    molti errori sono andati via, ora mi resta questo:

    ORA-04091: table Ordine is mutating, trigger/function may not see it.

    Ipotizzo che sia dovuto al fatto che io prima effettuo un inserimento nella tabella Ordine, poi successivamente effettuando il join con la tabella Cliente mi effettua una sorta di modifica nel database ma non capisco quale....

    Vi scrivo anche la struttura delle due tabelle:

    create table Cliente(
    ID_Cliente char(4) primary key,
    Telefono number(10),
    Via varchar2(20),
    N_Civico number(3),
    CAP number(5,0),
    Citta varchar2(20),
    C_CF_Rivenditore char(16),
    constraint FK14 foreign key(C_CF_Rivenditore) references Rivenditore(CF_Rivenditore)
    );


    create table Ordine(
    Prezzo number(5,2),
    Quantita number(2) check(Quantita > 4),
    Snack varchar2(20),
    ID_Ordine char(4) primary key,
    CF_Rivenditore char(16),
    ID_Cliente char(4),
    constraint FK15 foreign key(CF_Rivenditore) references Rivenditore(CF_Rivenditore),
    constraint FK1 foreign key(ID_Cliente) references Cliente(ID_Cliente)
    );


    Come sempre vi ringrazio per qualsiasi suggerimento e consiglio

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.