EXERCICE 12
1) Créer un utilisateur Takou
2) Création, insertion et mise a jour des données, extraction des données avec
l’utilisateur précédemment crée.
Clients (N°client, nom, prenom, adresse, ville, pays, phone)
Commandes (N°commande, #N°client, #N°salaire, date_commande, taux,
etat_commande, date_envoi)
Lig_commandes (N°lig_commande, #N°commande, #ref_article,
qte_commande)
Salaries (N°salaire, nom_salarie, prenom_salarie, fonction, salaire, commission)
Categorie (code_categorie, libelle_categorie)
Articles (ref_article, #code_categorie, designation, qte_stock)
SOLUTION
CREATE USER Takou IDENTIFIED BY motdepasse;
GRANT CONNECT, RESOURCE TO Takou;
********Table Clients
CREATE TABLE Clients (
N_client NUMBER PRIMARY KEY,
nom VARCHAR2(50),
prenom VARCHAR2(50),
adresse VARCHAR2(100),
ville VARCHAR2(50),
pays VARCHAR2(50),
phone VARCHAR2(20)
);
************* Table Commandes
CREATE TABLE Commandes (
N_commande NUMBER PRIMARY KEY,
N_client NUMBER REFERENCES Clients(N_client),
N_salaire NUMBER,
date_commande DATE,
taux NUMBER,
etat_commande VARCHAR2(20),
date_envoi DATE
);
***********Table Lig_commandes
CREATE TABLE Lig_commandes (
N_lig_commande NUMBER PRIMARY KEY,
N_commande NUMBER REFERENCES Commandes(N_commande),
ref_article NUMBER,
qte_commande NUMBER
);
***********Table Salaries
CREATE TABLE Salaries (
N_salaire NUMBER PRIMARY KEY,
nom_salarie VARCHAR2(50),
prenom_salarie VARCHAR2(50),
fonction VARCHAR2(50),
salaire NUMBER,
commission NUMBER
);
***********Table Categorie
CREATE TABLE Categorie (
code_categorie NUMBER PRIMARY KEY,
libelle_categorie VARCHAR2(50)
);
**********Table Articles
CREATE TABLE Articles (
ref_article NUMBER PRIMARY KEY,
code_categorie NUMBER REFERENCES Categorie(code_categorie),
designation VARCHAR2(100),
qte_stock NUMBER
);
3. Insertion des données
*********** Insertion dans Clients
INSERT INTO Clients (N_client, nom, prenom, adresse, ville, pays, phone)
VALUES (1, 'Dupont', 'Jean', '123 Rue A', 'Paris', 'France', '0123456789');
INSERT INTO Clients (N_client, nom, prenom, adresse, ville, pays, phone)
VALUES (2, 'Martin', 'Sophie', '456 Rue B', 'Lyon', 'France', '0987654321');
INSERT INTO Clients (N_client, nom, prenom, adresse, ville, pays, phone)
VALUES (3, 'Durand', 'Paul', '789 Rue C', 'Marseille', 'France', '0147852369');
INSERT INTO Clients (N_client, nom, prenom, adresse, ville, pays, phone)
VALUES (4, 'Leroy', 'Alice', '321 Rue D', 'Toulouse', 'France', '0178965432');
INSERT INTO Clients (N_client, nom, prenom, adresse, ville, pays, phone)
VALUES (5, 'Moreau', 'Luc', '654 Rue E', 'Nice', 'France', '0182365478');
INSERT INTO Clients (N_client, nom, prenom, adresse, ville, pays, phone)
VALUES (6, 'Simon', 'Julie', '987 Rue F', 'Lille', 'France', '0198765432');
INSERT INTO Clients (N_client, nom, prenom, adresse, ville, pays, phone)
VALUES (7, 'Fournier', 'Marc', '159 Rue G', 'Nantes', 'France', '0137894562');
INSERT INTO Clients (N_client, nom, prenom, adresse, ville, pays, phone)
VALUES (8, 'Gauthier', 'Claire', '753 Rue H', 'Strasbourg', 'France',
'0165432789');
INSERT INTO Clients (N_client, nom, prenom, adresse, ville, pays, phone)
VALUES (9, 'Roux', 'Emma', '258 Rue I', 'Bordeaux', 'France', '0156789234');
INSERT INTO Clients (N_client, nom, prenom, adresse, ville, pays, phone)
VALUES (10, 'Blanc', 'Pierre', '369 Rue J', 'Lyon', 'France', '0123456780');
*********** Insertion dans Salaries
INSERT INTO Salaries (N_salaire, nom_salarie, prenom_salarie, fonction,
salaire, commission) VALUES (1, 'Bernard', 'Luc', 'Vendeur', 30000, 5) ;
INSERT INTO Salaries (N_salaire, nom_salarie, prenom_salarie, fonction,
salaire, commission) VALUES (2, 'Leroy', 'Anne', 'Manager', 50000, 10) ;
INSERT INTO Salaries (N_salaire, nom_salarie, prenom_salarie, fonction,
salaire, commission) VALUES (3, 'Martin', 'Julien', 'Directeur', 70000, 15) ;
INSERT INTO Salaries (N_salaire, nom_salarie, prenom_salarie, fonction,
salaire, commission) VALUES (4, 'Bernier', 'Sophie', 'Secrétaire', 25000, 3) ;
INSERT INTO Salaries (N_salaire, nom_salarie, prenom_salarie, fonction,
salaire, commission) VALUES (5, 'Lemoine', 'Paul', 'Technicien', 40000, 7) ;
INSERT INTO Salaries (N_salaire, nom_salarie, prenom_salarie, fonction,
salaire, commission) VALUES (6, 'Perrin', 'Marie', 'Assistant', 22000, 2) ;
INSERT INTO Salaries (N_salaire, nom_salarie, prenom_salarie, fonction,
salaire, commission) VALUES (7, 'Lefevre', 'Nico', 'Ingénieur', 60000, 12) ;
INSERT INTO Salaries (N_salaire, nom_salarie, prenom_salarie, fonction,
salaire, commission) VALUES (8, 'Faure', 'Alice', 'Comptable', 35000, 6) ;
INSERT INTO Salaries (N_salaire, nom_salarie, prenom_salarie, fonction,
salaire, commission) VALUES (9, 'Guerin', 'David', 'Analyste', 45000, 5) ;
INSERT INTO Salaries (N_salaire, nom_salarie, prenom_salarie, fonction,
salaire, commission) VALUES (10, 'Brun', 'Eva', 'Directeur', 80000, 20) ;
********** Insertion dans Categorie
INSERT INTO Categorie (code_categorie, libelle_categorie) VALUES (1,
'Electroménager') ;
INSERT INTO Categorie (code_categorie, libelle_categorie) VALUES (2,
'Informatique') ;
INSERT INTO Categorie (code_categorie, libelle_categorie) VALUES (3,
'Mobilier') ;
INSERT INTO Categorie (code_categorie, libelle_categorie) VALUES (4,
'Vêtements') ;
INSERT INTO Categorie (code_categorie, libelle_categorie) VALUES (5,
'Jouets') ;
INSERT INTO Categorie (code_categorie, libelle_categorie) VALUES (6,
'Livres') ;
INSERT INTO Categorie (code_categorie, libelle_categorie) VALUES (7,
'Alimentaire') ;
INSERT INTO Categorie (code_categorie, libelle_categorie) VALUES (8,
'Sport') ;
INSERT INTO Categorie (code_categorie, libelle_categorie) VALUES (9,
'Automobile') ;
INSERT INTO Categorie (code_categorie, libelle_categorie) VALUES (10,
'Beauté') ;
*********Insertion dans Articles
INSERT INTO Articles (ref_article, code_categorie, designation, qte_stock)
VALUES (1, 1, 'Réfrigérateur', 10) ;
INSERT INTO Articles (ref_article, code_categorie, designation, qte_stock)
VALUES (2, 2, 'Ordinateur', 5) ;
INSERT INTO Articles (ref_article, code_categorie, designation, qte_stock)
VALUES (3, 3, 'Table', 15) ;
INSERT INTO Articles (ref_article, code_categorie, designation, qte_stock)
VALUES (4, 4, 'Pantalon', 20) ;
INSERT INTO Articles (ref_article, code_categorie, designation, qte_stock)
VALUES (5, 5, 'Jouet en bois', 30) ;
INSERT INTO Articles (ref_article, code_categorie, designation, qte_stock)
VALUES (6, 6, 'Roman', 25) ;
INSERT INTO Articles (ref_article, code_categorie, designation, qte_stock)
VALUES (7, 7, 'Pâtes', 40) ;
INSERT INTO Articles (ref_article, code_categorie, designation, qte_stock)
VALUES (8, 8, 'Ballon de football', 12) ;
INSERT INTO Articles (ref_article, code_categorie, designation, qte_stock)
VALUES (9, 9, 'Voiture miniature', 8) ;
INSERT INTO Articles (ref_article, code_categorie, designation, qte_stock)
VALUES (10, 10, 'Crème hydratante', 18) ;
********Insérer dans commande
INSERT INTO Commandes (N_commande, N_client, N_salaire,
date_commande, taux, etat_commande, date_envoi) VALUES (1, 1, 1,
SYSDATE, 20, 'En cours', NULL);
INSERT INTO Commandes (N_commande, N_client, N_salaire,
date_commande, taux, etat_commande, date_envoi) VALUES (2, 2, 2,
SYSDATE, 15, 'Livré', SYSDATE);
INSERT INTO Commandes (N_commande, N_client, N_salaire,
date_commande, taux, etat_commande, date_envoi) VALUES (3, 3, 1,
SYSDATE, 10, 'Annulé', NULL);
INSERT INTO Commandes (N_commande, N_client, N_salaire,
date_commande, taux, etat_commande, date_envoi) VALUES (4, 4, 3,
SYSDATE, 25, 'En cours', NULL);
INSERT INTO Commandes (N_commande, N_client, N_salaire,
date_commande, taux, etat_commande, date_envoi) VALUES (5, 5, 4,
SYSDATE, 30, 'Livré', SYSDATE);
INSERT INTO Commandes (N_commande, N_client, N_salaire,
date_commande, taux, etat_commande, date_envoi) VALUES (6, 6, 5,
SYSDATE, 20, 'En attente', NULL);
INSERT INTO Commandes (N_commande, N_client, N_salaire,
date_commande, taux, etat_commande, date_envoi) VALUES (7, 7, 6,
SYSDATE, 18, 'Livré', SYSDATE);
INSERT INTO Commandes (N_commande, N_client, N_salaire,
date_commande, taux, etat_commande, date_envoi) VALUES (8, 8, 7,
SYSDATE, 22, 'En cours', NULL);
INSERT INTO Commandes (N_commande, N_client, N_salaire,
date_commande, taux, etat_commande, date_envoi) VALUES (9, 9, 8,
SYSDATE, 19, 'Annulé', NULL);
INSERT INTO Commandes (N_commande, N_client, N_salaire,
date_commande, taux, etat_commande, date_envoi) VALUES (10, 10, 9,
SYSDATE, 17, 'Livré', SYSDATE);
3. Insertion des données dans Lig_commandes
************ Insertion dans Lig_commandes
INSERT INTO Lig_commandes (N_lig_commande, N_commande,
ref_arcticle, qte_commande) VALUES (1, 1, 1, 2) ;
INSERT INTO Lig_commandes (N_lig_commande, N_commande,
ref_arcticle, qte_commande) VALUES (2, 2, 2, 1) ;
INSERT INTO Lig_commandes (N_lig_commande, N_commande,
ref_arcticle, qte_commande) VALUES (3, 3, 3, 4) ;
INSERT INTO Lig_commandes (N_lig_commande, N_commande,
ref_arcticle, qte_commande) VALUES (4, 4, 4, 5) ;
INSERT INTO Lig_commandes (N_lig_commande, N_commande,
ref_arcticle, qte_commande) VALUES (5, 5, 5, 3) ;
INSERT INTO Lig_commandes (N_lig_commande, N_commande,
ref_arcticle, qte_commande) VALUES (6, 6, 6, 2) ;
INSERT INTO Lig_commandes (N_lig_commande, N_commande,
ref_arcticle, qte_commande) VALUES (7, 7, 7, 1) ;
INSERT INTO Lig_commandes (N_lig_commande, N_commande,
ref_arcticle, qte_commande) VALUES (8, 8, 8, 6) ;
INSERT INTO Lig_commandes (N_lig_commande, N_commande,
ref_arcticle, qte_commande) VALUES (9, 9, 9, 4) ;
INSERT INTO Lig_commandes (N_lig_commande, N_commande,
ref_arcticle, qte_commande) VALUES (10, 10, 10, 5);
MISE A JOUR
Mise à jour des données
Voici quelques exemples de mises à jour :
******** Mettre à jour l'état de la commande 1
UPDATE Commandes SET etat_commande = 'Livré' WHERE N_commande
= 1;
***** Mettre à jour le taux de la commande 5
UPDATE Commandes SET taux = 35 WHERE N_commande = 5;
******** Mettre à jour la quantité commandée dans Lig_commandes pour la
commande 2
UPDATE Lig_commandes SET qte_commande = 3 WHERE
N_lig_commande = 2;
4. Extraction des données
Pour extraire des données, on peut utiliser des requêtes SELECT :
SET SERVEROUTPUT ON ;
****** Afficher tous les clients
BEGIN
FOR rec IN (SELECT * FROM Clients) LOOP
DBMS_OUTPUT.PUT_LINE (rec.N_client || ' - ' || [Link] || ' ' ||
[Link]);
END LOOP;
END ;
*******Afficher toutes les commandes
BEGIN
FOR rec IN (SELECT * FROM Commandes) LOOP
DBMS_OUTPUT.PUT_LINE (rec.N_commande || ' - Client : ' ||
rec.N_client || ' - Date : ' || rec.date_commande) ;
END LOOP;
END ;
****** Afficher les détails des commandes avec les clients
BEGIN
FOR rec IN (SELECT [Link], [Link], co.date_commande,
co.etat_commande
FROM Commandes co
JOIN Clients c ON co.N_client = c.N_client) LOOP
DBMS_OUTPUT.PUT_LINE ('Client : ' || [Link] || ' ' || [Link] || ' -
Date de commande : ' || rec.date_commande || ' - État: ' || rec.etat_commande);
END LOOP;
END;
EXERCICE 2 : PLSQL
a) Afficher les nombres par PAS de 10
BEGIN
FOR i IN 0 .. 100 LOOP
DBMS_OUTPUT.PUT_LINE(i * 10);
END LOOP;
END;
b) Afficher les nombres compris entre 10 et 20
BEGIN
FOR i IN 10 .. 20 LOOP
DBMS_OUTPUT.PUT_LINE(i);
END LOOP;
END;
2. Afficher les nombres premiers compris entre 2 et 50
DECLARE
is_prime BOOLEAN;
BEGIN
FOR num IN 2 .. 50 LOOP
is_prime := TRUE;
FOR i IN 2 .. TRUNC(SQRT(num)) LOOP
IF num MOD i = 0 THEN
is_prime := FALSE;
EXIT; -- Sortir de la boucle interne
END IF;
END LOOP;
IF is_prime THEN
DBMS_OUTPUT.PUT_LINE(num);
END IF;
END LOOP;
END;
3. Afficher les tables de multiplication de 2 à 6
BEGIN
FOR i IN 2 .. 6 LOOP
DBMS_OUTPUT.PUT_LINE('Table de ' || i || ':');
FOR j IN 1 .. 10 LOOP
DBMS_OUTPUT.PUT_LINE(i || ' * ' || j || ' = ' || (i * j));
END LOOP;
DBMS_OUTPUT.PUT_LINE(''); -- Ligne vide pour séparer les tables
END LOOP;
END;
4. Procédure qui affiche le MINIMUM entre deux nombres
CREATE OR REPLACE PROCEDURE min_value(a IN NUMBER, b IN
NUMBER) IS
BEGIN
IF a < b THEN
DBMS_OUTPUT.PUT_LINE('Minimum: ' || a);
ELSE
DBMS_OUTPUT.PUT_LINE('Minimum: ' || b);
END IF;
END;
5. Fonction qui affiche le MAXIMUM entre deux nombres
CREATE OR REPLACE FUNCTION max_value(a IN NUMBER, b IN
NUMBER) RETURN NUMBER IS
BEGIN
RETURN CASE
WHEN a > b THEN a
ELSE b
END;
END;
6. Fonction itérative qui calcule la FACTORIELLE d’un nombre
--CREATE OR REPLACE FUNCTION factorial_iterative(n IN
NUMBER) RETURN NUMBER IS
result NUMBER := 1;
BEGIN
FOR i IN 1 .. n LOOP
result := result * i;
END LOOP;
RETURN result;
END;
7. Fonction récursive qui calcule la FACTORIELLE d’un nombre
CREATE OR REPLACE FUNCTION factorial_recursive(n IN NUMBER)
RETURN NUMBER IS
BEGIN
IF n = 0 THEN
RETURN 1;
ELSE
RETURN n * factorial_recursive(n - 1);
END IF;
CREATE OR REPLACE FUNCTION fibonacci_iterative(n IN NUMBER)
RETURN NUMBER IS
a NUMBER := 0; -- U0
b NUMBER := 1; -- U1
result NUMBER;
BEGIN
IF n = 0 THEN
RETURN a;
ELSIF n = 1 THEN
RETURN b;
ELSE
FOR i IN 2 .. n LOOP
result := a + b; -- Un = Un-1 + Un-2
a := b; -- Mettre à jour U0
b := result; -- Mettre à jour U1
END LOOP;
RETURN result;
END IF;
END;
9. Fonction récursive qui calcule la suite de Fibonacci
CREATE OR REPLACE FUNCTION fibonacci_recursive(n IN NUMBER)
RETURN NUMBER IS
BEGIN
IF n = 0 THEN
RETURN 0; -- U0
ELSIF n = 1 THEN
RETURN 1; -- U1
ELSE
RETURN fibonacci_recursive(n - 1) + fibonacci_recursive(n - 2); -- Un =
Un-1 + Un-2
END IF;
END;
Utilisation des fonctions
Pour utiliser ces fonctions et afficher les résultats, vous pouvez exécuter des
requêtes comme suit :
SET SERVEROUTPUT ON;
DECLARE
result NUMBER;
BEGIN
-- Exemple d'utilisation de la fonction itérative
result := fibonacci_iterative(10);
DBMS_OUTPUT.PUT_LINE('Fibonacci (itératif) pour n=10: ' || result);
-- Exemple d'utilisation de la fonction récursive
result := fibonacci_recursive(10);
DBMS_OUTPUT.PUT_LINE('Fibonacci (récursif) pour n=10: ' || result);
END;