Vous êtes sur la page 1sur 16

/*TP2-IFT2004-ÉQUIPE41

TIDO FOKOU FANY INGRIDE 536931949


ABDOUL RAOUF AYOUBA WISSINA 111251061
SALIM BELHADJ 536892482*/

89.45/100
drop table TP2_ENTREPRISE cascade constraints;
drop table TP2_PROJET cascade constraints;
drop table TP2_UTILISATEUR_PROJET cascade constraints;
drop table TP2_PROFIL_ACCESSIBILITE cascade constraints;
drop table TP2_PROFIL_ACCESSIBILITE_IMAGE cascade constraints;
drop table TP2_PROFIL_ACCESSIBILITE_IMAGE_COORDONNEE cascade constraints;
drop table TP2_PROFIL_ACCESSIBILITE_PLAN cascade constraints;
drop table TP2_PROFIL_ACCESSIBILITE_PLAN_COORDONNEE cascade constraints;
drop table TP2_SONDAGE cascade constraints;
drop table TP2_UTILISATEUR cascade constraints;
drop table TP2_TYPE_QUESTION cascade constraints;
drop table TP2_QUESTION cascade constraints;
drop table TP2_CHOIX_REPONSE cascade constraints;
drop table TP2_REPONSE_UTILISATEUR cascade constraints;
drop table TP2_QUESTION_ARCHIVE cascade constraints;
drop table TP2_CHOIX_REPONSE_ARCHIVE cascade constraints;
drop table TP2_SONDAGE_ARCHIVE cascade constraints;
drop sequence TP2_UTILISATEUR_SEQ;
drop sequence TP2_SONDAGE_SEQ;
drop sequence TP2_QUESTION_SEQ;
drop sequence TP2_CHOIX_REPONSE_SEQ;

create sequence TP2_UTILISATEUR_SEQ


start with 1000
increment by 5;

create sequence TP2_SONDAGE_SEQ


start with 5000
increment by 100;

create sequence TP2_QUESTION_SEQ


start with 1
increment by 1;

create sequence TP2_CHOIX_REPONSE_SEQ


start with 10000
increment by 1;

/*2c fonction qui génére un mot de passe*/


create or replace function TP2_FCT_GENERER_MOT_DE_PASSE(P_I_NBRE_MOT in
number)
return varchar2 is
TP2_E_EXCEPTION_TROP_DE_MOT exception;
V_MOT_DE_PASSE varchar2(16):='';
V_LONG_MOT number(2):=0;
V_CHOIX_MOT varchar2(69):=
'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!?&$/|#';
begin
if P_I_NBRE_MOT <= 12 then
V_LONG_MOT :=12;
elsif P_I_NBRE_MOT > 12 and P_I_NBRE_MOT <= 16 then
V_LONG_MOT := P_I_NBRE_MOT;
else
raise TP2_E_EXCEPTION_TROP_DE_MOT;
end if;
V_MOT_DE_PASSE :='';
While (V_LONG_MOT >0)
loop
V_MOT_DE_PASSE := V_MOT_DE_PASSE || SUBSTR(V_CHOIX_MOT,
round(dbms_random.value(1, 69)),1) ;
V_LONG_MOT:= V_LONG_MOT-1;
end loop;
return V_MOT_DE_PASSE;
exception
when TP2_E_EXCEPTION_TROP_DE_MOT then
dbms_output.put_line('impossible de générer un mot de passe de plus
de 16 caractères');
end TP2_FCT_GENERER_MOT_DE_PASSE;
/

create table TP2_UTILISATEUR(NO_UTILISATEUR number(4) not null,


COURRIEL_UTI varchar2(40) not null,
MOT_DE_PASSE_UTI varchar2(16) not null,
PRENOM_UTI varchar2(20) null,
NOM_UTI varchar2(20) not null,
TYPE_UTI varchar2(20) not null,
constraint PK_TP2_UTILISATEUR primary key (NO_UTILISATEUR),
constraint AK_TP2_UTILISATEUR unique (COURRIEL_UTI));

create table TP2_ENTREPRISE (NO_ENTREPRISE number(5) generated by default


as identity
start with 11111 increment by 1,
NOM_ENT varchar2(40) not null,
NOM_FICHIER_LOGO_ENT varchar2(200) null,
ADRESSE_ENT varchar2(40) not null,
CODE_POSTAL_ENT char(7) not null,
VILLE_ENT varchar2(40) not null,
COURRIEL_ENT varchar2(40) not null,
NO_ENTREPRISE_DIRIGEANTE number(5) null,
constraint PK_TP2_ENTREPRISE primary key (NO_ENTREPRISE),
constraint FK_TP2_ENTREPRISE foreign key (NO_ENTREPRISE_DIRIGEANTE)
references TP2_ENTREPRISE(NO_ENTREPRISE));

create table TP2_PROJET (CODE_PROJET char(4) not null,


DATE_PRO date,
NOM_PRO varchar2(40),
NO_ENTREPRISE number(5) not null,
constraint PK_TP2_PROJET primary key (CODE_PROJET),
constraint FK_TP2_PROJET foreign key (NO_ENTREPRISE)
references TP2_ENTREPRISE(NO_ENTREPRISE));

create table TP2_UTILISATEUR_PROJET(NO_UTILISATEUR number(4) not null,


CODE_PROJET char(4) not null,
constraint PK_TP2_UTILISATEUR_PROJET primary key
(NO_UTILISATEUR,CODE_PROJET),
constraint FK1_TP2_UTILISATEUR_PROJET foreign key (NO_UTILISATEUR)
references TP2_UTILISATEUR(NO_UTILISATEUR),
constraint FK2_TP2_UTILISATEUR_PROJET foreign key (CODE_PROJET)
references TP2_PROJET(CODE_PROJET));

create table TP2_PROFIL_ACCESSIBILITE(NO_PROFIL number(3) generated by


default as identity
start with 11 increment by 1,
THEME_PROF varchar2(40) not null,
TEXTE_PROF varchar2(100) not null,
CODE_PROJET char(4) null,
constraint PK_TP2_PROFIL_ACCESSIBILITE primary key (NO_PROFIL),
constraint FK_TP2_PROFIL_ACCESSIBILITE foreign key (CODE_PROJET)
references TP2_PROJET(CODE_PROJET));

create table TP2_PROFIL_ACCESSIBILITE_IMAGE(NO_IMAGE number(3) generated


by default as identity
start with 111 increment by 1,
NO_PROFIL number(3) not null,
HAUTEUR_IMA number(6,2) not null,
LARGEUR_IMA number(6,2) not null,
constraint PK_TP2_PROFIL_ACCESSIBILITE_IMAGE primary key (NO_IMAGE),
constraint FK_TP2_PROFIL_ACCESSIBILITE_IMAGE foreign key (NO_PROFIL)
references TP2_PROFIL_ACCESSIBILITE(NO_PROFIL));

create table TP2_PROFIL_ACCESSIBILITE_IMAGE_COORDONNEE(NO_IMAGE number(3)


not null,
NOM_I_COO varchar2(40) not null,
DESC_CO varchar2(40) not null,
POSITION_X_COO number(6,2) not null,
POSITION_Y_COO number(6,2) not null,
constraint PK_TP2_PROFIL_ACCESSIBILITE_IMAGE_COORDONNEE primary key
(NO_IMAGE, NOM_I_COO),
constraint FK_TP2_PROFIL_ACCESSIBILITE_IMAGE_COORDONNEE foreign key
(NO_IMAGE)
references TP2_PROFIL_ACCESSIBILITE_IMAGE(NO_IMAGE));
create table TP2_PROFIL_ACCESSIBILITE_PLAN(NO_PLAN number(3) generated by
default as identity
start with 444 increment by 1,
NO_PROFIL number(3) not null,
HAUTEUR_PLA number(6,2) not null,
LARGEUR_PLA number(6,2) not null,
constraint PK_TP2_PROFIL_ACCESSIBILITE_PLAN primary key (NO_PLAN),
constraint FK_TP2_PROFIL_ACCESSIBILITE_PLAN foreign key (NO_PROFIL)
references TP2_PROFIL_ACCESSIBILITE(NO_PROFIL));

create table TP2_PROFIL_ACCESSIBILITE_PLAN_COORDONNEE(NO_P_COO number(4)


generated by default as identity
start with 1111 increment by 2,
NO_PLAN number(3) not null,
LONGITUDE_COO number(9,6) not null,
LATITUDE_COO number(8,6) not null,
constraint PK_TP2_PROFIL_ACCESSIBILITE_PLAN_COORDONNEE primary key
(NO_P_COO),
constraint FK_TP2_PROFIL_ACCESSIBILITE_PLAN_COORDONNEE foreign key
(NO_PLAN)
references TP2_PROFIL_ACCESSIBILITE_PLAN(NO_PLAN));

create table TP2_SONDAGE(NO_SONDAGE number(4) not null,


DATE_CREATION_SON date,
DATE_DEBUT_SON date,
DATE_FIN_SON date,
TITRE_SON varchar2(100) not null,
CODE_PROJET char(4) not null,
constraint PK_TP2_SONDAGE primary key (NO_SONDAGE),
constraint AK_TP2_SONDAGE unique (TITRE_SON),
constraint FK_TP2_SONDAGE foreign key (CODE_PROJET)
references TP2_PROJET (CODE_PROJET));

create table TP2_TYPE_QUESTION(CODE_TYPE_QUESTION char(4) not null,


DESC_TYPE_QUE varchar2(40) not null,
constraint PK_TP2_TYPE_QUESTION primary key(CODE_TYPE_QUESTION));

create table TP2_QUESTION(ID_QUESTION number(3) not null,


ORDRE_QUESTION number(2) not null,
CODE_TYPE_QUESTION char(4) not null,
TEXTE_QUE varchar2(200) not null,
NO_SONDAGE number(4) not null,
constraint PK_TP2_QUESTION primary key (ID_QUESTION),
constraint FK1_TP2_QUESTION foreign key (CODE_TYPE_QUESTION)
references TP2_TYPE_QUESTION(CODE_TYPE_QUESTION),
constraint FK2_TP2_QUESTION foreign key (NO_SONDAGE)
references TP2_SONDAGE(NO_SONDAGE));

create table TP2_CHOIX_REPONSE(ID_CHOIX_REPONSE number(5) not null,


ORDRE_REPONSE number(2) not null,
TEXTE_CHO varchar2(200) null,
ID_QUESTION number(3) not null,
constraint PK_TP2_CHOIX_REPONSE primary key (ID_CHOIX_REPONSE),
constraint FK_TP2_CHOIX_REPONSE foreign key (ID_QUESTION)
references TP2_QUESTION(ID_QUESTION));

create table TP2_REPONSE_UTILISATEUR(NO_UTILISATEUR number(4) not null,


ID_CHOIX_REPONSE number(5) not null,
TEXTE_REP varchar2(200) null,
constraint PK_TP2_REPONSE_UTILISATEUR primary key (NO_UTILISATEUR,
ID_CHOIX_REPONSE));

create or replace view TP2_VUE_ADMINISTRATEUR (COURRIEL_ADM,


MOT_DE_PASSE, NOM_ADM, PRENOM_ADM) as
select COURRIEL_UTI as COURRIEL_ADM , MOT_DE_PASSE_UTI as
MOT_DE_PASSE, NOM_UTI as NOM_ADM, PRENOM_UTI as PRENOM_ADM
from TP2_UTILISATEUR
where TYPE_UTI = 'administrateur';

/*insertion table utilisateur*/


insert into TP2_UTILISATEUR(NO_UTILISATEUR, COURRIEL_UTI,
MOT_DE_PASSE_UTI, PRENOM_UTI, NOM_UTI, TYPE_UTI)
values(TP2_UTILISATEUR_SEQ.nextval,
'ingride@ulaval.ca',TP2_FCT_GENERER_MOT_DE_PASSE(7),'fany','FOKOU','admin
istrateur');
insert into TP2_UTILISATEUR(NO_UTILISATEUR, COURRIEL_UTI,
MOT_DE_PASSE_UTI, PRENOM_UTI, NOM_UTI, TYPE_UTI)
values(TP2_UTILISATEUR_SEQ.nextval,
'ecole@gmail.com',TP2_FCT_GENERER_MOT_DE_PASSE(16),'serena','TALIA','resp
onsable');

/*insertion table entreprise*/


insert into TP2_ENTREPRISE(NOM_ENT, NOM_FICHIER_LOGO_ENT,
ADRESSE_ENT, CODE_POSTAL_ENT, VILLE_ENT,COURRIEL_ENT)
values('FABILOINTERcentre', 'C/document/entreprise', '75 rue
Brideau', 'G1C 2N1', 'Québec','fany@ulaval.ca');
insert into TP2_ENTREPRISE(NOM_ENT, NOM_FICHIER_LOGO_ENT,
ADRESSE_ENT, CODE_POSTAL_ENT,
VILLE_ENT,COURRIEL_ENT,NO_ENTREPRISE_DIRIGEANTE)
values('Mobili-T', 'C/docs/entreprise', '34 rue colombiere', 'G2L
2V1', 'Montréal','deplacement@gmail.com', 11111);

/*insertion table projet*/


insert into TP2_PROJET (CODE_PROJET, DATE_PRO, NOM_PRO,
NO_ENTREPRISE)
values('A111', to_date('2023-02-01','RRRR-MM-DD'), 'construction
abribus', 11112);
insert into TP2_PROJET (CODE_PROJET, DATE_PRO, NOM_PRO,
NO_ENTREPRISE)
values('A123', to_date('2022-10-01','RRRR-MM-DD'), 'aménagement
réseau cyclable', 11111);

/*insertion table utilisateur-projet*/


insert into TP2_UTILISATEUR_PROJET(NO_UTILISATEUR, CODE_PROJET)
values(1000, 'A111');
insert into TP2_UTILISATEUR_PROJET(NO_UTILISATEUR, CODE_PROJET)
values(1005, 'A123');

/*insertion table profil d'accessibilité*/


insert into TP2_PROFIL_ACCESSIBILITE(THEME_PROF, TEXTE_PROF,
CODE_PROJET)
values('transports actifs', 'ajout au réseau cyclable sur avenue
Chanoine-Scott', 'A123');
insert into TP2_PROFIL_ACCESSIBILITE(THEME_PROF, TEXTE_PROF,
CODE_PROJET)
values('transports collectifs', 'installation d''un abribus à
l''arrêt 1989', 'A111');

/*insertion table profil d'accessibilité image*/


insert into TP2_PROFIL_ACCESSIBILITE_IMAGE(NO_PROFIL, HAUTEUR_IMA,
LARGEUR_IMA)
values(11, 18,30);
insert into TP2_PROFIL_ACCESSIBILITE_IMAGE(NO_PROFIL, HAUTEUR_IMA,
LARGEUR_IMA)
values(12, 18,30);

/*insertion table profil d'accessibilité image coordonnée*/


insert into TP2_PROFIL_ACCESSIBILITE_IMAGE_COORDONNEE(NO_IMAGE,
NOM_I_COO, DESC_CO, POSITION_X_COO, POSITION_Y_COO)
values(111, 'arrêt 1989', 'Des Q-Bourgeois/Wolfe',1000, 2);
insert into TP2_PROFIL_ACCESSIBILITE_IMAGE_COORDONNEE(NO_IMAGE,
NOM_I_COO, DESC_CO, POSITION_X_COO, POSITION_Y_COO)
values(112, 'Réseau cyclable', 'piste cyclable chemin Q-
Bourgeois',200, 20);

/*insertion table profil d'accessibilité plan*/


insert into TP2_PROFIL_ACCESSIBILITE_PLAN(NO_PROFIL, HAUTEUR_PLA,
LARGEUR_PLA)
values(11, 1800, 3000);
insert into TP2_PROFIL_ACCESSIBILITE_PLAN(NO_PROFIL, HAUTEUR_PLA,
LARGEUR_PLA)
values(12, 1800, 3000);

/*insertion table profil d'accessibilité plan coordonnée*/


insert into TP2_PROFIL_ACCESSIBILITE_PLAN_COORDONNEE(NO_PLAN,
LONGITUDE_COO, LATITUDE_COO)
values(444, -71.155415, 46.888724);
insert into TP2_PROFIL_ACCESSIBILITE_PLAN_COORDONNEE(NO_PLAN,
LONGITUDE_COO, LATITUDE_COO)
values(445, 180, 43.888624);

/*insertion table sondage*/


insert into TP2_SONDAGE(NO_SONDAGE, DATE_CREATION_SON,
DATE_DEBUT_SON, DATE_FIN_SON, TITRE_SON, CODE_PROJET)
values(TP2_SONDAGE_SEQ.nextval, to_date('2022-10-01','RRRR-MM-DD'),
to_date('2022-11-01','RRRR-MM-DD'), to_date('2022-11-30','RRRR-MM-DD'),
'incitatifs aux transports actifs', 'A123');
insert into TP2_SONDAGE(NO_SONDAGE, DATE_CREATION_SON,
DATE_DEBUT_SON, DATE_FIN_SON, TITRE_SON, CODE_PROJET)
values(TP2_SONDAGE_SEQ.nextval, to_date('2023-02-01','RRRR-MM-DD'),
to_date('2023-03-01','RRRR-MM-DD'), to_date('2023-04-01','RRRR-MM-DD'),
'incitatifs aux transports collectifs', 'A111');

/*insertion table type de question*/


insert into TP2_TYPE_QUESTION(CODE_TYPE_QUESTION, DESC_TYPE_QUE)
values('Q001', 'À développement');
insert into TP2_TYPE_QUESTION(CODE_TYPE_QUESTION, DESC_TYPE_QUE)
values('Q002', 'À choix multiples');

/*insertion table question*/


insert into TP2_QUESTION (ID_QUESTION, ORDRE_QUESTION,
CODE_TYPE_QUESTION, TEXTE_QUE, NO_SONDAGE)
values(TP2_QUESTION_SEQ.nextval,1,'Q001', 'Quel est votre code postal
au format A9A 9A9?',5000);
insert into TP2_QUESTION (ID_QUESTION, ORDRE_QUESTION,
CODE_TYPE_QUESTION, TEXTE_QUE, NO_SONDAGE)
values(TP2_QUESTION_SEQ.nextval,2,'Q002', 'Quel est votre mode de
transport en hiver ?',5100);

/*insertion table choix de réponse*/


insert into TP2_CHOIX_REPONSE(ID_CHOIX_REPONSE, ORDRE_REPONSE,
TEXTE_CHO, ID_QUESTION)
values(TP2_CHOIX_REPONSE_SEQ.nextval, 2,'Covoiturage comme
passager',2);
insert into TP2_CHOIX_REPONSE(ID_CHOIX_REPONSE, ORDRE_REPONSE,
ID_QUESTION)
values(TP2_CHOIX_REPONSE_SEQ.nextval, 1,1);

/*insertion table réponse utilisateur*/


insert into TP2_REPONSE_UTILISATEUR(NO_UTILISATEUR, ID_CHOIX_REPONSE,
TEXTE_REP)
values(1000, 10000,'Covoiturage comme passager');
insert into TP2_REPONSE_UTILISATEUR(NO_UTILISATEUR, ID_CHOIX_REPONSE,
TEXTE_REP)
values(1005, 10001,'G1L 1R3');

/*1c*/
insert into TP2_PROFIL_ACCESSIBILITE_IMAGE(NO_PROFIL, HAUTEUR_IMA,
LARGEUR_IMA)
select NO_PROFIL, HAUTEUR_PLA, LARGEUR_PLA
from TP2_PROFIL_ACCESSIBILITE_PLAN
where NO_PROFIL = 12;

/*1e*/
update TP2_TYPE_QUESTION
set DESC_TYPE_QUE = 'Vrai ou Faux'
where CODE_TYPE_QUESTION = (select CODE_TYPE_QUESTION
from TP2_QUESTION
where ORDRE_QUESTION = 3 and
NO_SONDAGE = (select NO_SONDAGE
from TP2_SONDAGE

where TITRE_SON = 'En route vers l''an 3000'));

/*1f*/
select NOM_ENT, CODE_POSTAL_ENT
from TP2_ENTREPRISE
where NOM_ENT like '%centre%';

select* from TP2_VUE_ADMINISTRATEUR;

/*1g*/
select TEXTE_QUE, ORDRE_QUESTION
from TP2_QUESTION
where NO_SONDAGE in(select NO_SONDAGE
from TP2_SONDAGE
where DATE_CREATION_SON between
to_date('2023-09-01','RRRR-MM-DD') and to_date('2023-09-30','RRRR-MM-
DD'))
order by NO_SONDAGE asc, ORDRE_QUESTION asc;

/*1d*/
delete from TP2_REPONSE_UTILISATEUR RU
where exists ( select *
from TP2_REPONSE_UTILISATEUR RU
inner join TP2_CHOIX_REPONSE CR on
RU.ID_CHOIX_REPONSE = CR.ID_CHOIX_REPONSE
inner join TP2_QUESTION Q on CR.ID_QUESTION =
Q.ID_QUESTION
inner join TP2_SONDAGE S on Q.NO_SONDAGE =
S.NO_SONDAGE
where S.DATE_FIN_SON < sysdate - interval '6'
month);

delete from TP2_UTILISATEUR_PROJET UP


where exists( select *
from TP2_UTILISATEUR_PROJET UP
inner join TP2_SONDAGE S on UP.CODE_PROJET =
S.CODE_PROJET
where S.DATE_FIN_SON < sysdate - interval '6' month);
/*1h)i*/
select distinct TEXTE_REP
from TP2_REPONSE_UTILISATEUR
where ID_CHOIX_REPONSE in (select ID_CHOIX_REPONSE
from TP2_QUESTION Q,
TP2_CHOIX_REPONSE CR
where Q.ID_QUESTION = CR.ID_QUESTION
and
CODE_TYPE_QUESTION = (select
CODE_TYPE_QUESTION
from
TP2_TYPE_QUESTION
where
DESC_TYPE_QUE = 'À développement'));

/*1h)ii*/
select distinct TEXTE_REP
from TP2_REPONSE_UTILISATEUR RU join TP2_CHOIX_REPONSE CR
on RU.ID_CHOIX_REPONSE = CR.ID_CHOIX_REPONSE
join TP2_QUESTION Q on CR.ID_QUESTION = Q.ID_QUESTION
join TP2_TYPE_QUESTION TQ on Q.CODE_TYPE_QUESTION =
TQ.CODE_TYPE_QUESTION
where DESC_TYPE_QUE = 'À développement';

/*1h)iii*/
select distinct TEXTE_REP
from TP2_REPONSE_UTILISATEUR RU
where exists (select *
from TP2_CHOIX_REPONSE CR
where RU.ID_CHOIX_REPONSE = CR.ID_CHOIX_REPONSE
and
ID_QUESTION in (select ID_QUESTION
from TP2_QUESTION Q,
TP2_TYPE_QUESTION TQ
where Q.CODE_TYPE_QUESTION =
TQ.CODE_TYPE_QUESTION and
DESC_TYPE_QUE = 'À
développement'));

/*1i*/
select U.PRENOM_UTI ||' '|| U.NOM_UTI as NOM_UTILISATEUR, S.TITRE_SON,
count(RU.ID_CHOIX_REPONSE)
from TP2_UTILISATEUR U join TP2_REPONSE_UTILISATEUR RU on
U.NO_UTILISATEUR = RU.NO_UTILISATEUR
join TP2_CHOIX_REPONSE CR on RU.ID_CHOIX_REPONSE =
CR.ID_CHOIX_REPONSE
join TP2_QUESTION Q on CR.ID_QUESTION = Q.ID_QUESTION
join TP2_SONDAGE S on Q.NO_SONDAGE = S.NO_SONDAGE
group by U.NO_UTILISATEUR,U.PRENOM_UTI, U.NOM_UTI , S.TITRE_SON
order by count(RU.ID_CHOIX_REPONSE) desc;

/*1j)i*/
select NOM_ENT
from TP2_ENTREPRISE
where NO_ENTREPRISE not in (select NO_ENTREPRISE
from TP2_PROJET
group by NO_ENTREPRISE
having count(CODE_PROJET)=2);

/*1j)ii*/
select NOM_ENT
from TP2_ENTREPRISE minus
select NOM_ENT
from TP2_ENTREPRISE
where NO_ENTREPRISE in (select NO_ENTREPRISE
from TP2_PROJET
group by NO_ENTREPRISE
having count(CODE_PROJET)=2);

/*1j)iii*/
select NOM_ENT
from TP2_ENTREPRISE E
where not exists(select*
from TP2_PROJET P
where E.NO_ENTREPRISE = P.NO_ENTREPRISE
having count(CODE_PROJET)=2);

/*1k*/
select NOM_ENT
from TP2_ENTREPRISE
where NO_ENTREPRISE not in (select NO_ENTREPRISE
from TP2_PROJET
where DATE_PRO between to_date (sysdate-
365,'RRRR-MM-DD') and to_date (sysdate,'RRRR-MM-DD'))
order by NOM_ENT asc;

/*1l)i*/
select COURRIEL_UTI
from TP2_UTILISATEUR
intersect
select COURRIEL_ENT
from TP2_ENTREPRISE
where COURRIEL_ENT like '%.ca';

/*1l)ii*/
select COURRIEL_UTI
from TP2_UTILISATEUR U
where exists (select COURRIEL_ENT
from TP2_ENTREPRISE E
where E.COURRIEL_ENT = U.COURRIEL_UTI and
COURRIEL_ENT like '%.ca');

/*1l)iii*/
select COURRIEL_UTI
from TP2_UTILISATEUR
where COURRIEL_UTI in (select COURRIEL_ENT
from TP2_ENTREPRISE
where COURRIEL_ENT like '%.ca');

/*1m)i*/
create or replace view TP2_VUE_HIERACHIE_ENTREPRISE as
select substr(lpad (' ', LEVEL*2,'')||NOM_ENT, 1, 30) as ARBRE ,
CODE_POSTAL_ENT, VILLE_ENT,
substr(sys_connect_by_path (COURRIEL_ENT, '/'),1, 40) as CHEMIN,
level as NIVEAU
from TP2_ENTREPRISE
connect by prior NO_ENTREPRISE = NO_ENTREPRISE_DIRIGEANTE
start with NO_ENTREPRISE_DIRIGEANTE is null
with check option;

/*1m)ii*/
select * from TP2_VUE_HIERACHIE_ENTREPRISE;

/*1m)iii
non, il n'est pas possible de faire cette requête.
L'ajout d'enregistrement nécessite généralement d'interagir directement
avec la table plutôt qu'avec la vue,
et les vues hiérarchique peuvent introduire des complications lors de
l'insertion d'enregistrement.
Donc, il est recommandé d'utiliser d'autres méthodes pour ajouter des
données, telles que l'insertion directe dans la table*/

/*1n)i) étant donné que MOBILI-T n'a pas besoin d'identifier


l'utilisateur il est possible
d'effacer cette colonne car on n'utilise que le NO_UTILISATEUR pour avoir
des informations utiles*/

alter table TP2_UTILISATEUR


drop column NOM_UTI;

/*1n)ii il pourrait arrivé que pour un code de question on veuille


changer et ne faire que le choix de oui
ou non comme la question du sondage à savoir si le répondant posséde un
permis*/

update TP2_TYPE_QUESTION
set DESC_TYPE_QUE = 'OUI ou NON'
where CODE_TYPE_QUESTION = 'Q002';
/*1n)iii on pourrait avoir le cas où une image deviendrait un plan de
profil d'accessibilité 15 dans ce cas on devra
juste copier les données du tuples correspondant*/
insert into TP2_PROFIL_ACCESSIBILITE_IMAGE
select * from TP2_PROFIL_ACCESSIBILITE_PLAN
where NO_PLAN = 15;

/*1n)iv on pourrait rajouter la colonne de numéro de téléphone


d'entreprise dans la table entreprise car il peut
etre un moyen plus rapide de partager les informations*/
alter table TP2_ENTREPRISE
add TEL_ENT char(13) null;

/*2a*/
create or replace trigger TP2_TRG_AUI_TP2_QUESTION
before after update or insert on TP2_QUESTION
for each row

declare
V_NB_QUESTION number(6);
begin
select count(ID_QUESTION) into V_NB_QUESTION
from TP2_QUESTION
where ORDRE_QUESTION = :new.ORDRE_QUESTION
and ID_QUESTION <> :new.ID_QUESTION;
if (V_NB_QUESTION > 0) then
raise_application_error(-20000,'traitement impossible car ordre
déjà existant');

end if;
end TP2_TRG_AUI_TP2_QUESTION;
/

/*2b*/
create table TP2_SONDAGE_ARCHIVE(NO_SONDAGE number(4) not null,
DATE_CREATION_SON date ,
DATE_DEBUT_SON date,
DATE_FIN_SON date,
TITRE_SON varchar2(100) not null,
CODE_PROJET char(4) not null,
constraint PK_TP2_SONDAGE_ARCHIVE primary key (NO_SONDAGE),
constraint AK_TP2_SONDAGE_ARCHIVE unique (TITRE_SON),
constraint FK_TP2_SONDAGE_ARCHIVE foreign key (CODE_PROJET)
references TP2_PROJET (CODE_PROJET));

create table TP2_QUESTION_ARCHIVE(ID_QUESTION number(3) not null,


ORDRE_QUESTION number(2) not null,
CODE_TYPE_QUESTION char(4) not null,
TEXTE_QUE varchar2(200) not null,
NO_SONDAGE number(4) not null,
constraint PK_TP2_QUESTION_ARCHIVE primary key (ID_QUESTION),
constraint FK1_TP2_QUESTION_ARCHIVE foreign key (CODE_TYPE_QUESTION)
references TP2_TYPE_QUESTION(CODE_TYPE_QUESTION),
constraint FK2_TP2_QUESTION_ARCHIVE foreign key (NO_SONDAGE)
references TP2_SONDAGE_ARCHIVE(NO_SONDAGE));

create table TP2_CHOIX_REPONSE_ARCHIVE(ID_CHOIX_REPONSE number(5) not


null,
ORDRE_REPONSE number(2) not null,
TEXTE_CHO varchar2(200) null,
ID_QUESTION number(3) not null,
constraint PK_TP2_CHOIX_REPONSE_ARCHIVE primary key
(ID_CHOIX_REPONSE),
constraint FK_TP2_CHOIX_REPONSE_ARCHIVE foreign key (ID_QUESTION)
references TP2_QUESTION_ARCHIVE(ID_QUESTION));

create or replace procedure TP2_SP_ARCHIVER_SONDAGE (P_I_DATE_ARCHIVE in


date) is
TP2_E_EXCEPTION_ARCHIVAGE exception;

begin
if(P_I_DATE_ARCHIVE <= to_date(sysdate -1095,'RRRR-MM-DD')) then
insert into TP2_SONDAGE_ARCHIVE
select *
from TP2_SONDAGE
where DATE_FIN_SON <= P_I_DATE_ARCHIVE;

insert into TP2_QUESTION_ARCHIVE


select *
from TP2_QUESTION
where NO_SONDAGE in (select NO_SONDAGE
from TP2_SONDAGE_ARCHIVE );

insert into TP2_CHOIX_REPONSE_ARCHIVE


select *
from TP2_CHOIX_REPONSE
where ID_QUESTION in (select ID_QUESTION
from TP2_QUESTION_ARCHIVE);

delete from TP2_CHOIX_REPONSE


where ID_CHOIX_REPONSE in (select ID_CHOIX_REPONSE
from TP2_CHOIX_REPONSE_ARCHIVE);

delete from TP2_QUESTION


where ID_QUESTION in (select ID_QUESTION
from TP2_QUESTION_ARCHIVE);

delete from TP2_SONDAGE


where NO_SONDAGE in (select NO_SONDAGE
from TP2_SONDAGE_ARCHIVE);
else
raise TP2_E_EXCEPTION_ARCHIVAGE;

end if;

exception
when TP2_E_EXCEPTION_ARCHIVAGE then
dbms_output.put_line('date non correspondante archivage
impossible');
end TP2_SP_ARCHIVER_SONDAGE;
/

/*2d il permet de faire en sorte que l'on ne puisse pas poser une même
question pour un même numéro de sondage*/
create or replace trigger TP2_TRG_AUI_TP2_QUESTION_POSEE
before update or insert on TP2_QUESTION
for each row

declare
V_MEME_QUESTION number(6);
begin
select count(TEXTE_QUE) into V_MEME_QUESTION
from TP2_QUESTION
where TEXTE_QUE = :new.TEXTE_QUE
and NO_SONDAGE = :new.NO_SONDAGE;
if (V_MEME_QUESTION > 0) then
raise_application_error(-20050,'impossible vous ne pouvez pas
insérer une même question pour un même sondage');

end if;
end TP2_TRG_AUI_TP2_QUESTION_POSEE;
/

/*3a)i&ii*/
create index IDX_NOM_PROJET on TP2_PROJET(NOM_PRO);
/* Cet index va ameliorer la performance sur la recherche d'un projet car
on pourrait juste se rappeler du nom plutot que du CODE*/

create index IDX_NOM_ENTREPRISE on TP2_ENTREPRISE(NOM_ENT);


/*Un index sur le nom d'entreprise ameliorera les recherches basées sur
les entreprises */

create index IDX_DATE_CREATION_SONDAGE on TP2_SONDAGE(DATE_CREATION_SON);


/* Si l'administrateur recherche des projets en fonction de leur date de
creation alors il pourra juste utiliser
la date de création du sondage pour la recherche. */

/*3a)ii)2) étant donné que MOBILI-T n'a pas besoin de conserver le nom
des utilisateurs on n'a pas besoin de
mettre des index sur le nom et prénom de l'utilisateur*/

/*3a)iii)1
situation1: la recherche des projets des entreprises:Mobili_T pourrait
fréquemment rechercher les projets associés aux entreprises ainsi
on pourrait créer un index sur le NO_ENTREPRISE dans la table
TP2_PROJET*/
create index IDX_NO_ENTREPRISE_PROJET on TP2_PROJET(NO_ENTREPRISE);

/*situation2: on pourrait mettre un index sur THEME_PROFIL dans la table


TP2_PROFIL_ACCESSIBILITE pour faciliter la
recherche juste en utilisant le thème du profil*/
create index IDX_PROFIL_THEME on TP2_PROFIL_ACCESSIBILITE(THEME_PROF);

/*situation3:la recherche des employes qui ait repondu a un sondage


particulier*/
create index IDX_NO_SONDAGE on TP2_REPONSE_UTILISATEUR(NO_SONDAGE);

/*3b)i*/
/* Nous avons dénormalisé la table TP2_QUESTION en utilisant la méthode
7.2 de dénormalisation afin d'améliorer les recherches
dans la table TP2_QUESTION*/

/*3b)ii*/
/*creation d'une colonne afin de dénormaliser la table TP2_QUESTION*/
alter table TP2_QUESTION
add DESC_TYPE_QUE varchar2(40) null;

/*3b)iii*/
/*creation des triggers à fin de toujours respecter l'intégrité dans les
tables*/
create or replace trigger TP2_TRG_BU_QUESTION
before insert or update on TP2_QUESTION
for each row

declare
V_DESC_TYPE_QUE varchar2(40);

begin
select DESC_TYPE_QUE into V_DESC_TYPE_QUE
from TP2_TYPE_QUESTION
where CODE_TYPE_QUESTION = :new.CODE_TYPE_QUESTION;

:new.DESC_TYPE_QUE := V_DESC_TYPE_QUE;

end TP2_TRG_BU_QUESTION;
/

create or replace trigger TP2_TRG_BU_TYPE_QUESTION


before update on TP2_TYPE_QUESTION
for each row
declare
begin
SP_DESACTIVER_TRIGGER ('TP2_TRG_BU_QUESTION');
update TP2_QUESTION
set DESC_TYPE_QUE = :new.DESC_TYPE_QUE
where CODE_TYPE_QUESTION = :new.CODE_TYPE_QUESTION;

SP_ACTIVER_TRIGGER ('TP2_TRG_BU_QUESTION');
end TP2_TRG_BU_TYPE_QUESTION;
/

/*creation des procédures de désactivation et d'activation de trigger */

create or replace procedure SP_DESACTIVER_TRIGGER (P_I_TRIGGER in


varchar2) is
pragma AUTONOMOUS_TRANSACTION;
begin
execute immediate 'alter trigger ' || P_I_TRIGGER || ' disable';
end SP_DESACTIVER_TRIGGER;
/

create or replace procedure SP_ACTIVER_TRIGGER (P_I_TRIGGER in varchar2)


is
pragma AUTONOMOUS_TRANSACTION;
begin
execute immediate 'alter trigger ' || P_I_TRIGGER || ' enable';
end SP_ACTIVER_TRIGGER;
/

/*copie des données de la table TP2_TYPE_QUESTION à la table


TP2_QUESTION*/
update TP2_QUESTION Q
set Q.DESC_TYPE_QUE = (select TQ.DESC_TYPE_QUE
from TP2_TYPE_QUESTION TQ
where Q.CODE_TYPE_QUESTION =
TQ.CODE_TYPE_QUESTION);

Vous aimerez peut-être aussi