You are on page 1of 6

TP6: Correction

Blocs anonymes:
Exercice 1:
DECLARE
v vol%ROWTYPE;
BEGIN
v.numvol := 'AF110';
v.heure_départ := to_date('21/11/2013 21:40', 'DD/MM/YYYY hh24:mi');
v.heure_arrivée := to_date('21/11/2013 23:10', 'DD/MM/YYYY hh24:mi');
v.ville_départ := 'Paris';
v.ville_arrivée := 'Dublin';
INSERT INTO vol VALUES v;
END;
Exercice 2:
DECLARE
CURSOR curseur1 IS SELECT salaire FROM pilote
WHERE (Age >= 30 AND Age <=40);
salairePilote Pilote.Salaire%TYPE;
sommeSalaires NUMBER(11,2) := 0;
moyenneSalaires NUMBER(11,2);
BEGIN
OPEN curseur1;
LOOP
FETCH curseur1 INTO salairePilote;
EXIT WHEN (curseur1%NOTFOUND OR curseur1%NOTFOUND IS NULL);
sommeSalaires := sommeSalaires + salairePilote;
END LOOP;
moyenneSalaires := sommeSalaires / curseur1%ROWCOUNT;
CLOSE curseur1;
DBMS_OUTPUT.PUT_LINE('Moyenne salaires (pilotes de 30 <E0> 40 ans) : ' ||
moyenneSalaires);
END;
Exercice 3:
ACCEPT cnom 'Nom de la compétition : ';
DECLARE
NOMC VARCHAR2(10) := &cnom;
CURSOR C(PNOM COMPETITION.NOM_COMP%TYPE)IS
SELECT NOM_PART, SUM(NOTE) AS TOTAL
FROM COMPETITION C, PARTICIPANT P, SCORE S
WHERE C.CODE_COMP = S.CODE_COMP AND S.NO_PART = P.NO_PART
AND C.NOM_COMP = PNOM
GROUP BY NOM_PART;
BEGIN
FOR I IN C(NOMC)
LOOP
DBMS_OUTPUT.PUT_LINE(I.NOM_PART || ' ' || I.TOTAL)
END LOOP
END
Fonctions et Procédures
Exercice 4:
create or replace PROCEDURE data (num in employees.employee_id%type) is
type fd is record(first_name employees.first_name%type ,salary employees.salary%type,commission
employees.commission_pct%type );
g fd;
begin
select first_name,salary,commission_pct into g.first_name,g.salary,g.commission from employees
where employee_id=num;
DBMS_OUTPUT.PUT_LINE(g.first_name||' '||g.salary||' '||g.commission);
end;
SET SERVEROUTPUT ON
begin
data(145);
end;
Exercice 5:
CREATE PROCEDURE tel_format(v_tel IN OUT varchar2) IS
BEGIN
v_tel := ‘(‘||substr(v_tel, 1, 3) || ‘)’||substr(v_tel, 4, 3)||’-‘||substr(v_tel, 7, 4);
ou substr(v_tel, 7);
END;
Exercice 6:
TYPE HumTemp IS RECORD(
HUM METEO.HUMIDITY%TYPE,
TEMP METEO.TEMPERATURE%TYPE
)
FUNCTION GET_TEMPERATURE (PVILLE IN METEO.NOM_VILLE%TYPE)
RETURN HumTemp
IS
VAL HUMTEMP;
BEGIN
VAL.HUM = 10000;
VAL.TEMP = 10000;
SELECT HUMIDITE, TEMPERATURE INTO VAL
FROM METEO
WHERE VILLE_NOM = PVILLE;
RETURN VAL;
END;
Exercice 7:
CREATE OR REPLACE FUNCTION NOMBRE_CLIENTS
( VILLE IN CLIENT.CL_VILLE%TYPE := 'DIJON',
MAG IN MAGAZINE.MAG_NOM%TYPE := 'VOGUE')
RETURN INT
IS
NB INTEGER;
BEGIN
SELECT COUNT(*) INTO NB
FROM CLIENT C JOIN ABONNEMENT A ON(C.CL_ID = A.CL_ID)
JOIN MAGAZINE M ON (M.MAG_ID = A.MAG_ID)
WHERE MAG_NOM = 'VOGUE' AND CL_VILLE = VILLE
AND START_DATE > TO_DATE('31/08/2010 23:59:59', 'DD/MM/YYYY HH24:MI:SS');
RETURN NB;
END;
Exercice 8:
CREATE OR REPLACE f_tax(v_valeur IN number) IS
BEGIN
RETURN (v_valeur * 0.15);
END;
Les déclencheurs
Exercice 9:
create table disque(
nom varchar(8),
capacite number(8),
vitesse number(8),
fabricant varchar(8));

create table PARTITION(


nomDisque varchar(8),
nomPartition varchar(8),
taille number(8));

insert into disque values ('LIM1',1000,1500,'DELL');


insert into disque values ('LIM2',2000,2500,'HP');

insert into partition values ('LIM3','DELL5',500);


insert into partition values ('LIM4','DELL6',500);

SET SERVEROUTPUT ON
create or replace trigger verifier
BEFORE
insert on partition
for each r
SET SERVEROUTPUT ON
create or replace trigger verifier
BEFORE
insert on partition
for each row
declare
par partition.taille%type;
cap disque.capacite%type;
begin
select sum(taille) into par from partition where nomDisque=:new.nomDisque;
select capacite into cap from disque where nom=:new.nomDisque;
if (par>cap) then
RAISE_APPLICATION_ERROR(-20100,'OK insertion valide');
else
RAISE_APPLICATION_ERROR(-20100,'Disque sature');
end if;
end;
Exercice 10:
CREATE OR REPLACE TRIGGER ctrlmiseajour
BEFORE INSERT OR DELETE OR UPDATE ON EMPLOYES
DECLARE MESSAGE EXCEPTION;
BEGIN
IF (TO_CHAR(SYSDATE,'DY')= 'SAM.' OR TO_CHAR(SYSDATE,'DY')= 'DIM.')
THEN RAISE_APPLICATION_ERROR(-20324,’on ne met
pas à jour la fin de semaine');
END;
Exercice 11:
CREATE OR REPLACE TRIGGER MTRIGGER
BEFORE UPDATE ON METEO
FOR EACH ROW
DECLARE
TMAX NUMBER;
NB NUMBER := 0;
BEGIN
SELECT MAX(Temperature) INTO TMAX FROM METEO ;
SELECT COUNT(*) INTO NB FROM METEO M
WHERE M.VILLE_NOM = :NEW.VILLE_NOM;
IF (:NEW.TEMPERATURE > TMAX) THEN
DBMS_OUTPUT.PUT_LINE(20001,'
Temperature MAX');
ELSIF NB = 0 THEN
UPDATE METEO SET TEMPERATURE =:NEW.TEMPERATURE
WHERE VILLE_NOM = :NEW.VILLE_NOM ;
RAISE_APPLICATION_ERROR(20001,
'La ville existe déjà');
END IF
END;
Exercice 12:

CREATE OR REPLACE TRIGGER VERIFIE_CODE_COMP


BEFORE INSERT OR UPDATE ON COMPETITION
FOR EACH ROW
WHEN (:NEW.CODE_COMP NOT LIKE 'CMP%')
BEGIN
RAISE_APPLICATION_ERROR(20001,'
COMP_CODE doit commencer par CMP');
END;
Exercice 13:
CREATE OR REPLACE TRIGGER AUDIT_CUSTOMER
AFTER INSERT ON CUSTOMER
FOR EACH ROW
DECLARE
NB INTEGER;
MNOM MAGAZINE.MAG_NOM%TYPE;
BEGIN
IF NOT EXISTS (SELECT 1 FROM TRACK_ABONNEMENTS T
WHERE T.MAG_NOM =:NEW.MAG_NOM) THEN
RAISE_APPLICATION_ERROR(20100,
'Le magazine n'existe pas !');
ELSE
UPDATE TRACK_ABONNEMENT SET NB_ABONN = NB + 1
WHERE MAG_NOM = :NEW.MAG_NOM ;
END IF
END;

Exercice 14:
CREATE OR REPLACE TRIGGER CTRLsalaire
BEFORE INSERT OR UPDATE OF salaire ON employes
FOR EACH ROW
DECLARE
minsal number;
maxsal number;
BEGIN
/* retrouver le salaire minimum et maximum dans la table employes
SELECT MIN(salaire), Max(salaire) INTO minsal, maxsal FROM Employes;
/* s'il y a un problème, on provoque une erreur */
IF (:new.salaire<minsal OR :new.salaire>maxsal)
THEN
raise_application_error (-20300,'Salaire incorrect');
END IF;
END;
Exercice 15:
CREATE TRIGGER ctrlOperation
AFTER
DELETE OR INSERT OR UPDATE
ON Emp FOR EACH ROW
BEGIN
IF INSERTING THEN
INSERT INTO table_ctrl VALUES ( USER, 'Insertion');
ELSIF DELETING THEN
INSERT INTO table_ctrl VALUES ( USER, 'Destruction');
ELSIF UPDATING THEN
INSERT INTO table_ctrl VALUES ( USER, 'Modification');
ELSIF UPDATING(salaire) THEN
INSERT INTO table_ctrl VALUES ( USER, 'Modification du salaire');
END IF;
END;

You might also like