mardi 8 juin 2010

oracle : trigger , vue concrètes, vue matiérialisée (<=> snapshot)

Voici un exemple complet de création d'une vue concrète par un trigger, ou de la création d'une vue matérialisées (<=> appelée aussi snapshot).

Ce code est extrait du très bon cours (de M. Lalonde) suivant

Cet exemple contient un rappel sur les trigger, les shapshot, et la création d'une vue concrète via le trigger ...


DROP TABLE Skieur;

CREATE TABLE Skieur (
IdSki INTEGER NOT NULL,
Nom VARCHAR2(15) NOT NULL,
Prenom VARCHAR2(15) NOT NULL,
Categ VARCHAR2(10),
CHECK (Categ IN ('0-6', '7-8', '9-10', '11-12', '13-14', '15-et-plus')),
PRIMARY KEY( IdSki )
);


CREATE VIEW Vue_Skieur_11_12 AS
SELECT IdSki, Nom, Prenom FROM Skieur WHERE Categ = '11-12';



CREATE TABLE Concrete_Skieur_11_12 (
IdSki INTEGER NOT NULL,
Nom VARCHAR2(15) NOT NULL,
Prenom VARCHAR2(15) NOT NULL,
PRIMARY KEY ( IdSki ),
FOREIGN KEY (IdSki) REFERENCES Skieur (IdSki)
);


CREATE OR REPLACE TRIGGER Trig_Concrete_Skieur_11_12

AFTER INSERT OR UPDATE OR DELETE ON Skieur
FOR EACH ROW
BEGIN

IF INSERTING THEN
IF :new.Categ = '11-12' THEN
INSERT INTO Concrete_Skieur_11_12 VALUES (:new.IdSki, :new.Nom, :new.Prenom);
END IF;

END IF;

IF UPDATING THEN
IF :old.Categ = '11-12' THEN
IF :new.Categ = '11-12' THEN
UPDATE Concrete_Skieur_11_12
-- Il n'est pas necessaire de modifier IdSki car la contrainte referencielle empeche -- deja toute modification de cet attribut
SET Nom = :new.Nom, Prenom = :new.Prenom
WHERE IdSki = :new.IdSki;
ELSE
DELETE FROM Concrete_Skieur_11_12 WHERE IdSki = :new.IdSki;
END IF;
ELSE
IF :new.Categ = '11-12' THEN
INSERT INTO Concrete_Skieur_11_12 VALUES (:new.IdSki, :new.Nom, :new.Prenom);
END IF;
END IF;
END IF;

IF DELETING THEN
IF :old.Categ = '11-12' THEN
DELETE FROM Concrete_Skieur_11_12 WHERE :old.IdSki = IdSki;
END IF;
END IF;
END;
.
RUN Trig_Concrete_Skieur_11_12;


CREATE SNAPSHOT Snapshot_Skieur_11_12
REFRESH COMPLETE
AS (SELECT IdSki, Nom, Prenom
FROM Skieur
WHERE Categ = '11-12');

Aucun commentaire:

Enregistrer un commentaire