Le problème ci-dessous s’inspire du problème sur Oracle du TP suivant
: http://www-bd.lip6.fr/wiki/site/enseignement/licence/2i009/documents-tme/tme-plsql
Nous travaillerons par la suite sur les trois tables suivantes qui permettent de décrire des employés, des projets, l’affectation des employés aux projets et les grilles de salaire pour différents profils de postes :
EMPLOYE(NumSS, NomE, PrenomE, VilleE,
DateNaiss)
PROJET(NumProj, NomProj, #iRespProj,, VilleP,
Budget)
EMBAUCHE(#NumSS,#NumProj, DateEmb,
Profil)
GRILLE_SAL(Profil, Salaire)
La clé primaire de chaque table est soulignée.
Rappels : Pour exécuter une procédure dans PL-SQL sur MySQL ou
MariaDB, utilisez la commande:
CALL nom_procedure(liste_paramètres)
create table Employe(
number(5) ,
NumSS varchar2(20) ,
NomE varchar2(20) ,
PrenomE varchar2(20) ,
VilleE date
DateNaiss
);
create table Projet(
Number(3),
NumProj varchar2(20),
NomProj number,
RespProj varchar2(20),
VilleP number
Budget
);
create table Grille_sal(
varchar2(20),
profil number(7,2)
salaire
);
create table Embauche(
number ,
NumSS number ,
NumProj date default sysdate,
DateEmb varchar2(20)
Profil
);
insert into Employe (NumSS, NomE, PrenomE, VilleE, DateNaiss)
values (
22334, 'Adam', 'Funk', 'Paris', '1-12-1982' ),
(45566, 'Rachid', 'Allaoui', 'Lyon', '13-4-1986' ),
(77889, 'Florent', 'Girac' , 'Marseille', '4-11-1990' ),
(90011, 'Mayla', 'Aoun', 'Lyon', '26-3-1987' ),
(22233, 'Christine', 'Lara', 'Paris', '9-8-1982' ),
(34445, 'Amel', 'Orlando', 'Lyon', '14-2-1976' ),
(55666, 'Mohsen', 'Charef', 'Paris', '28-5-1991' ),
(77788, 'Tim', 'Arabi', 'Marseille', '8-6-1984' ),
(89990, 'Fernando', 'Lopez', 'Lyon', '5-10-1993' ),
(11122, 'Alain','Tan Lee', 'Marseille', '21-3-1994' ),
(11123, 'Franck', 'Morel', 'Lille', '10-01-1945' ),
(11124, 'Albert', 'Maure', 'Paris', '10-01-1948' ),
(11125, 'Beatrice', 'Malloire', 'Paris', '10-01-1946' ),
(11126, 'Christian', 'Millan', 'Paris', '10-01-1947' ),
(
);
insert into Projet values (123, 'ADOOP', 22334, 'Paris', 120000);
insert into Projet values (757, 'SKALA', 45566, 'Lyon', 180000);
insert into Projet values (890, 'BAJA', 22334, 'Paris', 24000);
insert into grille_sal values ('Admin', 80000);
insert into grille_sal values ('Deve', 45000);
insert into grille_sal values ('Tech', 35000);
insert into Embauche values (77889, 123, '1-3-2014' ,'Deve');
insert into Embauche values (90011, 123, '1-5-2014' ,'Tech');
insert into Embauche values (22233, 757, '1-3-2014' ,'Deve');
STR_TO_DATE
(‘1-01-2012’,
‘%d-%m-%Y’), utiliser rechercher/remplacer (CTRL R ou CTRL H)
CREATE TABLE Employe (
INT(5) PRIMARY KEY,
NumSS VARCHAR(20),
NomE VARCHAR(20),
PrenomE VARCHAR(20),
VilleE DATE
DateNaiss
);
CREATE TABLE Projet (
INT(3) PRIMARY KEY,
NumProj VARCHAR(20),
NomProj INT,
RespProj VARCHAR(20),
VilleP DECIMAL(10,2),
Budget FOREIGN KEY (RespProj) REFERENCES Employe(NumSS)
);
CREATE TABLE Grille_sal (
VARCHAR(20) PRIMARY KEY,
profil DECIMAL(7,2)
salaire
);
CREATE TABLE Embauche (
INT,
NumSS INT,
NumProj DATE DEFAULT (CURRENT_DATE), -- curdate() , -- CURRENT_DATE,
DateEmb VARCHAR(20),
Profil PRIMARY KEY (NumSS, NumProj, DateEmb),
FOREIGN KEY (NumSS) REFERENCES Employe(NumSS),
FOREIGN KEY (NumProj) REFERENCES Projet(NumProj),
FOREIGN KEY (Profil) REFERENCES Grille_sal(profil)
);
INSERT INTO Employe (NumSS, NomE, PrenomE, VilleE, DateNaiss)
VALUES
22334, 'Adam', 'Funk', 'Paris', STR_TO_DATE('01-12-1982', '%d-%m-%Y')),
(45566, 'Rachid', 'Allaoui', 'Lyon', STR_TO_DATE('13-04-1986', '%d-%m-%Y')),
(77889, 'Florent', 'Girac', 'Marseille', STR_TO_DATE('04-11-1990', '%d-%m-%Y')),
(90011, 'Mayla', 'Aoun', 'Lyon', STR_TO_DATE('26-03-1987', '%d-%m-%Y')),
(22233, 'Christine', 'Lara', 'Paris', STR_TO_DATE('09-08-1982', '%d-%m-%Y')),
(34445, 'Amel', 'Orlando', 'Lyon', STR_TO_DATE('14-02-1976', '%d-%m-%Y')),
(55666, 'Mohsen', 'Charef', 'Paris', STR_TO_DATE('28-05-1991', '%d-%m-%Y')),
(77788, 'Tim', 'Arabi', 'Marseille', STR_TO_DATE('08-06-1984', '%d-%m-%Y')),
(89990, 'Fernando', 'Lopez', 'Lyon', STR_TO_DATE('05-10-1993', '%d-%m-%Y')),
(11122, 'Alain', 'Tan Lee', 'Marseille', STR_TO_DATE('21-03-1994', '%d-%m-%Y')),
(11123, 'Franck', 'Morel', 'Lille', STR_TO_DATE('10-01-1945', '%d-%m-%Y')),
(11124, 'Albert', 'Maure', 'Paris',, STR_TO_DATE('10-01-1948', '%d-%m-%Y')),
(11125, 'Beatrice', 'Malloire', 'Paris', STR_TO_DATE('10-01-1946', '%d-%m-%Y')),
(11126,'Christian', 'Millan', 'Paris', STR_TO_DATE('10-01-1947', '%d-%m-%Y')),
(
;
INSERT INTO Projet VALUES (123, 'ADOOP', 22334, 'Paris', 120000);
INSERT INTO Projet VALUES (757, 'SKALA', 45566, 'Lyon', 180000);
INSERT INTO Projet VALUES (890, 'BAJA', 22334, 'Paris', 24000);
INSERT INTO Grille_sal VALUES ('Admin', 80000);
INSERT INTO Grille_sal VALUES ('Deve', 45000);
INSERT INTO Grille_sal VALUES ('Tech', 35000);
INSERT INTO Embauche VALUES (77889, 123, STR_TO_DATE('01-03-2014', '%d-%m-%Y'), 'Deve');
INSERT INTO Embauche VALUES (90011, 123, STR_TO_DATE('01-05-2014', '%d-%m-%Y'), 'Tech');
INSERT INTO Embauche VALUES (22233, 757, STR_TO_DATE('01-03-2014', '%d-%m-%Y'), 'Deve');
La question 1 du TP sur oracle sera traitée à la question 4 (c’est la même chose mais c’est bien plus compliqué sur MySQL)
MariaDB [BDD_s2_tp]> CALL SupprimerEmployes70ansOuPlus();
+-----------------------------+
| Message |
+-----------------------------+
| 4 employé(s) supprimé(s). |
+-----------------------------+
1 row in set (0,004 sec)
...
MariaDB [BDD_s2_tp]> CALL SupprimerEmployes70ansOuPlus();
+---------------------------+
| Message |
+---------------------------+
| Aucun employé supprimé. |
+---------------------------+
L’instruction SELECT * FROM Employe;
permet de voir que
franck a disparu
MariaDB [BDD_s2_tp]> SELECT profil, salaire
-> FROM Grille_sal;
+--------+----------+
| profil | salaire |
+--------+----------+
| Admin | 80000.00 |
| Deve | 45000.00 |
| Tech | 35000.00 |
+--------+----------+
3 rows in set (0,001 sec)
MariaDB [BDD_s2_tp]> SHOW CREATE TABLE Embauche;
+----------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+----------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Embauche | CREATE TABLE `Embauche` (
`NumSS` int(11) NOT NULL,
`NumProj` int(11) NOT NULL,
`DateEmb` date NOT NULL DEFAULT curdate(),
`Profil` varchar(20) DEFAULT NULL,
PRIMARY KEY (`NumSS`,`NumProj`,`DateEmb`),
KEY `NumProj` (`NumProj`),
KEY `Profil` (`Profil`),
CONSTRAINT `Embauche_ibfk_1` FOREIGN KEY (`NumSS`) REFERENCES `Employe` (`NumSS`),
CONSTRAINT `Embauche_ibfk_2` FOREIGN KEY (`NumProj`) REFERENCES `Projet` (`NumProj`),
CONSTRAINT `Embauche_ibfk_3` FOREIGN KEY (`Profil`) REFERENCES `Grille_sal` (`profil`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci |
+----------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0,000 sec)
MariaDB [BDD_s2_tp]> CALL ModifierProfilsEtSalaire();
+-----------------------------------------------+
| Message |
+-----------------------------------------------+
| Les profils ont été modifiés avec succès. |
+-----------------------------------------------+
1 row in set (0,568 sec)
Query OK, 12 rows affected (0,568 sec)
MariaDB [BDD_s2_tp]> SELECT profil, salaire
-> FROM Grille_sal;
+--------+----------+
| profil | salaire |
+--------+----------+
| PAdmin | 80000.00 |
| PDeve | 45000.00 |
| PTech | 35000.00 |
+--------+----------+
3 rows in set (0,001 sec)
SELECT * FROM Embauche;
voir question 1 dans le tp sur oracle
Utiliser une IA générative (réaliser un prompt) pour modifier la procédure PL-SQL ci-dessus :
DECLARE
BOOLEAN;
trouve BEGIN
FOR r IN (SELECT numproj, nomproj, villep FROM Projet ORDER BY nomproj)
LOOP
'-----------------------------------');
dbms_output.put_line('Projet: '||r.nomproj||' dans la ville '||r.villep);
dbms_output.put_line('-----------------------------------');
dbms_output.put_line(:= FALSE;
trouve FOR r2 IN (SELECT nome, prenome FROM employe e, embauche b
WHERE e.numss=b.numss AND b.numproj=r.numproj )
LOOP
'Employé: '|| r2.nome||', '|| r2.prenome);
dbms_output.put_line(:= TRUE;
trouve END LOOP;
IF(trouve = FALSE) THEN
'Pas d''employé');
dbms_output.put_line(END IF;
END LOOP;
END;
le résultat de l’instruction
CALL AfficherProjetsEmployes();
dans un terminal connecté à
MySQL avec le jeu de test donné est :
MariaDB [BDD_s2_tp]> CALL AfficherProjetsEmployes2();
+--------------------------------------+
| Ligne |
+--------------------------------------+
| ----------------------------------- |
| Projet: ADOOP dans la ville Paris |
| ----------------------------------- |
| Nombre d'employés: 2 |
| Employé(s): Florent, Girac |
| Employé(s): Mayla, Aoun |
| ----------------------------------- |
| Projet: BAJA dans la ville Paris |
| ----------------------------------- |
| Nombre d'employés: 0 |
| *** personne affecté sur ce projet |
| ----------------------------------- |
| Projet: SKALA dans la ville Lyon |
| ----------------------------------- |
| Nombre d'employés: 1 |
| Employé(s): Christine, Lara |
+--------------------------------------+
16 rows in set (0,007 sec)
MariaDB [BDD_s2_tp]> SELECT profil, salaire
-> FROM Grille_sal;
+--------+----------+
| profil | salaire |
+--------+----------+
| PAdmin | 80000.00 |
| PDeve | 45000.00 |
| PTech | 35000.00 |
+--------+----------+
3 rows in set (0,001 sec)
MariaDB [BDD_s2_tp]> CALL AugmenterSalaires();
+-------------------------------------------------+
| Message |
+-------------------------------------------------+
| Les salaires ont été augmentés avec succès. |
+-------------------------------------------------+
1 row in set (0,010 sec)
Query OK, 3 rows affected (0,010 sec)
MariaDB [BDD_s2_tp]> SELECT profil, salaire
-> FROM Grille_sal;
+--------+----------+
| profil | salaire |
+--------+----------+
| PAdmin | 88000.00 |
| PDeve | 54000.00 |
| PTech | 45500.00 |
+--------+----------+
3 rows in set (0,001 sec)
MariaDB [BDD_s2_tp]>
SELECT profil, salaire FROM Grille_sal;
CALL AugmenterSalaires();
SELECT profil, salaire FROM Grille_sal;
CALL InsererNouvelEmploye(1234567, 'Alain', 'Paul');
SELECT * FROM Employe;
CALL InsererNouvelEmploye(22334, 'Adam', 'Funk');