Area personale
Tag
Cerca in questo Blog
Menu
Chi puņ scrivere sul blog
« Oracle Tipi Dati Astratt... | Oracle Tipi Dati Astratt... » |
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. 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 as select BA.NOMEAutore.TITOLO, B.Editore from BIBLIOTECA_AUTORE BA inner join BIBLIOTECA B using (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_EDITORE set 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_UPDATE instead of UPDATE on AUTORE_EDITORE for each row begin if :old.Editore <> :new.Editore then update BIBLOTECA set Editore = :new.Editore where Titolo = :old.Titolo; end if; if :old.NomeAutore <> :new.NomeEditore then update BIBLOTECA_AUTORE set NomeAutore = :new.NomeEditore where 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. |
https://blog.libero.it/Evolution2001/trackback.php?msg=9168097
I blog che hanno inviato un Trackback a questo messaggio: