SQL> set long 1024
SQL> describe USER_VIEWS
SQL> select * from USER_VIEWS
Vous pouvez les créer à nouveau en reprenant les ordres de création de vues donnés dans le corrigé du TP .
Dans le modèle relationnel tables et vues sont des relations qui peuvent se manipuler sans faire de distinction à priori. C'est tout à fait vrai pour les manipulations de type SELECT. Ce ne l'est pas pour les INSERT, UPDATE, DELETE. Les deux exercices suivant vous permettront de le comprendre.
CREATE TABLE RBB AS SELECT * FROM BONS_BUVEURS;
WITH CHECK OPTION à la fin de
la commande. Recommencez l'insertion d'un autre petit buveur. Est
ce que ce buveur est maintenant visible ? expliquez ce que
fait la clause ajoutée.
WITH CHECK
OPTION. Insérer un nouveau buveur à travers chacune
de ces vues. Expliquez le comportement d'Oracle.
DECLARE
x NUMBER := 1;
BEGIN
WHILE x < 100 LOOP
DELETE FROM ACHATS WHERE nv=x;
x := x + 2;
END LOOP;
END;
/
Annuler l'effet de ce programme par la commande ROLLBACK;
Tester l'effet du programme suivant, puis annuler encore une fois son effet :
BEGIN
FOR i IN 1..100 LOOP
IF MOD(i,2) = 0 THEN -- i est pair
UPDATE ACHATS SET QTE=QTE*2 WHERE nv=i;
ELSE
UPDATE ACHATS SET QTE=QTE/2 WHERE nv=i;
END IF;
END LOOP;
END;
/
Remarque: vous pouvez utiliser votre éditer préféré pour
mémoriser le code de vos scripts dans des fichiers et les
lancer à l'aide de la commande START
nom_fichier.
CREATE TABLE TEMP (Vin NUMBER(3), description VARCHAR2(30),
commentaire VARCHAR2(30));
Tester le programme suivant, expliquer ce qu'il fait :
DECLARE
cursor V_CUR is select * from vins
where nv in (select nv from recoltes, producteurs
where region='Alsace' and producteurs.np=recoltes.np)
order by nv;
V_LIGNE VINS%ROWTYPE;
BEGIN
open V_CUR;
loop
fetch V_CUR into V_Ligne;
exit when V_CUR%NOTFOUND;
IF V_Ligne.mill in (1976, 1978, 1983) THEN
INSERT INTO TEMP
VALUES (V_Ligne.nv, V_Ligne.cru || '(' || to_char(V_Ligne.mill) || ')', 'Récolte exeptionelle !');
ELSE
INSERT INTO TEMP
VALUES (V_Ligne.nv, V_Ligne.cru || '(' || to_char(V_Ligne.mill) || ')', 'RAS !');
END IF;
end loop;
close V_CUR;
END;
/
DECLARE
cursor V_CUR is select * from vins
where nv in (select nv from recoltes, producteurs
where region='Alsace' and producteurs.np=recoltes.np)
order by nv;
BEGIN
for V_Ligne in V_CUR loop
IF V_Ligne.mill in (1976, 1978, 1983) THEN
INSERT INTO TEMP
VALUES (V_Ligne.nv, V_Ligne.cru || '(' || to_char(V_Ligne.mill) || ')', 'Récolte exeptionelle !');
ELSE
INSERT INTO TEMP
VALUES (V_Ligne.nv, V_Ligne.cru || '(' || to_char(V_Ligne.mill) || ')', 'RAS !');
END IF;
end loop;
END;
/
CREATE OR REPLACE PROCEDURE choix_experts AS
--DECLARE
cursor V_CUR is select * from vins
where nv in (select nv from recoltes, producteurs
where region='Alsace' and producteurs.np=recoltes.np)
order by nv;
BEGIN
for V_Ligne in V_CUR loop
IF V_Ligne.mill in (1976, 1978, 1983) THEN
INSERT INTO TEMP
VALUES (V_Ligne.nv, V_Ligne.cru || '(' || to_char(V_Ligne.mill) || ')', 'Récolte exeptionelle !');
ELSE
INSERT INTO TEMP
VALUES (V_Ligne.nv, V_Ligne.cru || '(' || to_char(V_Ligne.mill) || ')', 'RAS !');
END IF;
end loop;
END;
/
Appeler cette procédure à l'aide de la commande :
Tester la fonction suivante :EXECUTE choix_expertsOUBEGIN choix_experts; END; /
CREATE OR REPLACE FUNCTION recherche_vins (r PRODUCTEURS.REGION%TYPE, annee VINS.MILL%TYPE) RETURN number AS
--DECLARE
-- r PRODUCTEURS.REGION%TYPE;
-- annee VINS.MILL%TYPE;
cursor V_CUR is select * from vins
where nv in (select nv from recoltes, producteurs
where region=r and producteurs.np=recoltes.np)
order by nv;
cpt number:=0;
BEGIN
for V_Ligne in V_CUR loop
IF V_Ligne.mill = annee THEN
INSERT INTO TEMP
VALUES (V_Ligne.nv, V_Ligne.cru || '(' || to_char(V_Ligne.mill) || ')', 'Récolte exeptionelle !');
cpt:=cpt+1;
END IF;
end loop;
RETURN cpt;
END;
/
SET SERVEROUTPUT ON
EXECUTE dbms_output.enable(1000000);
DECLARE
x number;
BEGIN
x:=recherche_vins('Alsace',1983);
dbms_output.new_line;
dbms_output.put_line(x || ' vins selectionnes ');
END;
/
![]()