• Non ci sono risultati.

Basi di dati Triggers

N/A
N/A
Protected

Academic year: 2021

Condividi "Basi di dati Triggers"

Copied!
3
0
0

Testo completo

(1)

Basi di dati Triggers

DB M G 1

Triggers

Si consideri il seguente schema relazionale relativo a una gara di corsa (le chiavi primarie sono sottolineate):

ARRIVO_ATLETI(CodAtleta, Tempo)

ARRIVO_SQUADRE(NomeSquadra, NumeroAtletiArrivati) CLASSIFICA(Posizione, CodAtleta, Tempo)

ATLETA(CodAtleta, NomeSquadra)

• Si scrivano i trigger necessari per aggiornare le tabelle ARRIVO_SQUADRE e CLASSIFICA, in caso di inserimento di un record nella tabella ARRIVO_ATLETI.

o Per l’aggiornamento della tabella ARRIVO_SQUADRE si consideri anche il caso in cui una squadra non sia ancora presente nella tabella.

o Per l’aggiornamento della tabella CLASSIFICA si consideri, che il campo Tempo possa assumere lo

stesso valore per due atleti diversi.

(2)

Basi di dati Triggers

DB M G 2

Bozza di soluzione

CREATE OR REPLACE TRIGGER AGGIORNA_CLASSIFICA AFTER INSERT ON ARRIVO_ATLETI

FOR EACH ROW DECLARE

PA NUMBER;

TA NUMBER;

parimerito BOOLEAN;

BEGIN

-- calcola la posizione per l’atleta

SELECT MAX(Posizione), MAX(

Tempo

) INTO PA, TA FROM CLASSIFICA

WHERE

Tempo

<= :NEW.

Tempo

;

IF (PA IS NULL) THEN

--- classifica vuota o atleta in prima posizione senza nessun altro atleta con lo stesso tempo PA:= 1;

Pareggio := FALSE;

ELSE

--- verificare se c'è un altro atleta con lo stesso tempo (condizione di parimerito) IF (TA < :NEW.

Tempo

) THEN

PA := PA +1;

parimerito := FALSE;

ELSE

parimerito:= TRUE;

END IF;

END IF;

INSERT INTO CLASSIFICA (Posizione,

CodAtleta

,

Tempo

) VALUES (PA, :NEW.

CodAtleta

, :NEW.

Tempo

);

IF (parimerito = FALSE) THEN

UPDATE CLASSIFICA SET Posizione = Posizione +1 WHERE

Tempo

> :NEW.

Tempo

;

END IF;

END;

(3)

Basi di dati Triggers

DB M G 3

CREATE OR REPLACE TRIGGER AGGIORNA_ARRIVO_SQUADRA AFTER INSERT ON ARRIVO_ATLETI

FOR EACH ROW DECLARE

squadra VARCHAR(10);

X NUMBER;

BEGIN

---leggi la squadra del nuovo atleta SELECT NomeSquadra INTO squadra FROM ATLETA

WHERE CodAtleta = :NEW. CodAtleta;

---controlla se il nuovo atleta è il primo atleta della sua squadra SELECT COUNT(*) INTO X

FROM ARRIVO_SQUADRE WHERE NomeSquadra = squadra;

IF (X=0) THEN

---il nuovo atleta è il primo atleta della sua squadra

INSERT INTO ARRIVO_SQUADRE (NomeSquadra, NumeroAtletiArrivati) VALUES (squadra,1);

ELSE

UPDATE ARRIVO_SQUADRE

SET NumeroAtletiArrivati = NumeroAtletiArrivati + 1 WHERE NomeSquadra = squadra;

END IF;

END;

Riferimenti

Documenti correlati

Risultato matr cognome nome ciclo anno relatore.

•  Realizzare basi di dati utilizzando modelli, metodi e sistemi per la definizione, progettazione e realizzazione di sistemi

•  schema logico: descrizione della base di dati nel modello logico (ad esempio, la struttura della tabella). •  schema interno

•  I riferimenti fra dati in relazioni diverse sono rappresentati per mezzo di valori dei.. domini che compaiono

Verdi Giove Milano Verdi Marte Milano Neri Saturno Milano Neri Venere Milano Progetto Sede → Dirigente. Dirigente →

La tabella SOMMARIO CATEGORIA riporta, per ogni categoria di evento e per ogni data, il numero complessivo di eventi previsti e il costo.. complessivo per la

-- Esiste uno studente eleggibile: seleziono la sua matricola SELECT Matricola INTO Matr.

Ogni nodo dell'albero, ad eccezione di un nodo speciale detto radice, ha un nodo padre e zero, uno o più nodi figli.. • Se un nodo non ha nessun nodo figlio è detto nodo foglia