PDA

View Full Version : [SQL] Problema jolly da risolvere


akd
10-02-2009, 10:08
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...

akd
10-02-2009, 19:31
Anybody? Neanche un'indicazione di massima...? :(

gugoXX
11-02-2009, 09:02
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.


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;


Dove stai dicendo di fare una vista materializzata (che e' quello che vuoi no?)
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.

akd
11-02-2009, 09:34
Ciao, e grazie tentissimo per la risposta!
Effettivamente è una vera e propria fig...a! :D
Avevo anche trovato questo: http://www.databasejournal.com/features/oracle/article.php/2192071/Materialized-Views-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... :(