|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Member
Iscritto dal: Jun 2007
Messaggi: 292
|
[SQL] Problema jolly da risolvere
Mi sto trovando ad avere tanti problemi tutti molto simili, che si possono risolvere con la risoluzione di un esercizio che ho trovato:
Queste le tabelle: Dipartimento(nomeDipartimento; sede; direttore) Ricercatore(cf; nomeCognome; dipartimentoDiAfferenza) si costruisca una vista materializzata Afferenza, che tenga traccia del numero di aerenti di ciascun dipartimento, e due trigger che aggiornino il contenuto di tale vista a fronte di inserimenti e cancellazioni relativi alla tabella Ricercatori. Che si tratti di ricercatori e dipartimenti, città e anagrafiche o pelati e supermercati, poco cambia. Qualcuno saprebbe abbozzare una soluzione per la vista e i due trigger (possibilmente compatibilmente con pl/sql, o sql1999 o anche db2) in modo corretto? Poi per il resto me la vedo io, ma la struttura proprio non riesco a farla stare su... Grazie a chiunque saprà fornire una soluzione completa a questo quesito...
__________________
Pennellate di seo Ultima modifica di akd : 10-02-2009 alle 11:34. |
![]() |
![]() |
![]() |
#2 |
Member
Iscritto dal: Jun 2007
Messaggi: 292
|
Anybody? Neanche un'indicazione di massima...?
![]()
__________________
Pennellate di seo |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Ciao. Se parli di PL/SQL parli di Oracle, e un problema come questo si puo' risolvere elegantemente sotto Oracle senza coinvolgere PL/SQL o Trigger.
Codice:
CREATE MATERIALIZED VIEW LOG ON Ricercatore; CREATE MATERIALIZED VIEW vs_miavista BUILD IMMEDIATE REFRESH FAST ON COMMIT ENABLE QUERY REWRITE AS SELECT dipartimentoDiAfferenza, COUNT(*) cnt FROM Ricercatore GROUP BY dipartimentoDiAfferenza; BUILD IMMEDIATE = con i dati iniziali popolati immediatamente REFRESH FAST ON COMMIT = ogni volta che viene effettuato il COMMIT di una transazione che ha coinvolto in scrittura una delle tabelle della vista materializzata (qui solo Ricercatore) allora devono essere automaticamente aggiornate le righe e solo le righe corrispondenti nella vista materializzata ENABLE QUERY REWRITE = Quando una qualsiasi altra query si puo' risolvere andando a leggere i dati pre-cucinati della vista materializzata invece che sulla tabella originale, allora tale query verra' riscritta utilizzando la vista materializzata invece che la tabella originale, presumibilmente risparmiando tempo perche' si evita la sotto-query in questione. Per abilitare l'ultima clausola appieno occorre anche agire su un paio di parametri di sistema. Bello Oracle eh? Pensa che la versione Express e' gratuita anche se la si utilizza per fini commerciali, mentre MySql invece no.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. Ultima modifica di gugoXX : 11-02-2009 alle 09:04. |
![]() |
![]() |
![]() |
#4 |
Member
Iscritto dal: Jun 2007
Messaggi: 292
|
Ciao, e grazie tentissimo per la risposta!
Effettivamente è una vera e propria fig...a! ![]() Avevo anche trovato questo: http://www.databasejournal.com/featu...-in-Oracle.htm che è molto utile, e sulla vista materializzata ci siamo... Il problema è che io sono costretto a utilizzare i trigger per 2 motivi: 1) ufficialmente non dovrei conoscere costrutti come refresh e build immediate, e 2) quella più importante, mi è stato espressamente richiesto il (anzi, i) trigger... ![]()
__________________
Pennellate di seo Ultima modifica di akd : 11-02-2009 alle 09:45. |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 11:11.