Oracle Lessons

Oracle Tipi Dati Astratti Lezione 5


 Manipolazione dei dati mediante Object View.I dati nella tabella CLIENTE possono essere aggiornati tramite la Object View CLIENTE_OV, oppure aggiornando direttamente la tabella CLIENTE nel modo tradizionale.Se si vuole utilizzare la Object View occorre far uso dei Constructor Method dei tipi istanziati specificando il loro nome nel comando insert: insert into CLIENTE_OV values (… , PERSONA_TY(‘..’, INDIRIZZO_TY(‘…’,’…’,’…’,…))); Dato che si possono utilizzare entrambi i metodi per inserire i valori nella Object View, è possibile standardizzare il modo in cui l’applicazione manipola i dati. Se le operazioni di inserimento si basano tutte su tipi di dato astratti, si potrà utilizzare lo stesso tipo di codice, indipendentemente che dal fatto che i tipi di dato astratti siano stati creati prima o dopo la tabella. Uso dei Trigger INSTEAD OF.Se viene create una Object View, è possibile utilizzare i trigger INSTEAD OF per indicare a Oracle come aggiornare le tabelle di base che fanno parte della vista. Questi trigger si applicano sia a Object Views, sia a viste relazionali convenzionali.Per esempio se una vista comporta un join di due tabelle, la possibilità di aggiornare i record nella vista è limitata. Tuttavia se si usa un trigger INSTEAD OF, è possibile indicare a Oracle come aggiornare , cancellare o inserire i record nelle tabelle nel caso in cui un utente cerchi di modificare i valori tramite una vista. Il codice contenuto nel trigger INSTEAD OF viene eseguito al posto del comando insert, update o delete. Vediamo il seguente esempio:Supponiamo di avere una vista che unisce tramite join la tabella BIBLIOTECA alla tabella BIBLIOTECA_AUTORE: create or replace view AUTORE_EDITORE asselect BA.NOMEAutore.TITOLO, B.Editorefrom BIBLIOTECA_AUTORE BA inner join BIBLIOTECA Busing (Titolo); E’ possibile selezionare dei valori da questa vista e manipolare i dati mediante la vista stessa con i trigger INSTEAD OF. Si considerino i seguenti record: select * from AUTORE_EDITORE where Nome_Autore = ‘PIPPO’; NOME_AUTORE EDITORE-------------------------- ----------------------------‘PIPPO’ ‘PLUTO’Se si cerca di aggiornare il valore del campo ‘Editore’ con la seguente update, Oracle restituisce un errore: update AUTORE_EDITOREset Editore = ‘Tizio’where Nome Autore = ‘PIPPO’; ora-01720: cannot modify a column wich maps to a non key-preserved table; Il problema è che Oracle non è in grado di stabilire quale editore di quale record aggiornare nella tabella BIBLIOTECA. Se associata alla view viene creato un trigger INSTEAD OF fatto così: create or replace trigger AUTORE_EDITORE_UPDATEinstead of UPDATE on AUTORE_EDITOREfor each row beginif :old.Editore <> :new.Editorethenupdate BIBLOTECAset Editore = :new.Editorewhere Titolo = :old.Titolo;end if;if :old.NomeAutore <> :new.NomeEditorethenupdate BIBLOTECA_AUTOREset NomeAutore = :new.NomeEditorewhere NomeAutore = :old.NomeAutore;end if;end; Nella testate del trigger si descrive il suo uso tramite la clausola instead of. Il trigger serve a supportare i comandi di update eseguiti sulla vista AUTORE_EDITORE. Si tratta di un trigger a livello di riga; ogni riga modificata viene elaborata come definito dal corpo.Il corpo del trigger specifica a Oracle come eseguire l’aggiornamento. Il primo controllo si concentra sul valore della colonna Editore:Se il vecchio valore è diverso da nuovo allora vengono aggiornati i record della tabella BIBLIOTECA. Stesso discorso per la tabella BIBLIOTECA_AUTORE nei confronti della colonna NomeAutore.Pertanto ogni aggiornamento della vista consente di aggiornare nessuna o entrambe le tabelle. Il trigger INSTEAD OF ideato per supportare le viste ad oggetto, rappresenta uno strumento potente per lo sviluppo di applicazioni.