Pascal LAFOURCADE 4 years ago
parent c84077f7fb
commit c30fbe4a82

@ -0,0 +1,376 @@
\documentclass[a4paper,11pt]{article}
\usepackage[utf8x]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[french]{babel}
\usepackage[a4paper,hmargin=20mm,vmargin=30mm]{geometry}%\usepackage{fullpage}
\usepackage{url}
\usepackage{comment}
\usepackage{fancyhdr}% fancy header
\usepackage{fancyvrb}
\fancypagestyle{monstyle}{
%\fancyhead{}
\renewcommand{\headrulewidth}{1pt}
%% %\renewcommand{\footrulewidth}{0.4pt}
% \fancyhead[LE]{\slshape \thepage/ \pageref{LastPage}}
%% \fancyhead[RO]{\slshape \thepage/ \pageref{LastPage}}
%\fancyhf{}
%\fancyhead[LE]{\slshape LE}
%\fancyhead[CE]{\slshape CE}
%\fancyhead[RE]{\slshape RE}
\fancyhead[LO]{\bfseries 2018-2019 BD PLS/SQL\rightmark}
%\fancyhead[CO]{\slshape APF}
\fancyhead[RO]{\bfseries ~\leftmark }
%% %\fancyfoot{}
% \fancyfoot[LE,RO]{}
\fancyfoot[CO,CE]{}%\slshape\thepage/\pageref{LastPage}}
%% %\fancyfoot[LO,RE]{\small\slshape \ddmmyyyydate version du \today}
}
% \pagestyle{fancy}
\usepackage{amsmath}
\usepackage{amsthm}
\theoremstyle{definition}
\newtheorem{exercice}{Exercice}
\pagestyle{monstyle}
\usepackage{amsmath}
\usepackage{amsthm}
\newcommand{\code}[1]{\texttt{#1}}
\begin{document}
\begin{center}
TP1 : Location de v\'ehicules
\end{center}
Contexte : L'objectif est de gérer les locations dune agence de
locations de véhicules. Les tables utilisées sont les suivantes :
\begin{description}
\item[Tclient2019]:
\begin{itemize}
\item Numéro client
\item Nom
\item Ville
\item Code postal
\end{itemize}
\item[Tcategorie2019]:
\begin{itemize}
\item Numéro categorie
\item Libellé
\end{itemize}
\item[Tremplacement2019]:
\begin{itemize}
\item Numéro catégorie
\item Numéro catégorie équivalente
\end{itemize}
\item[Tvehicule2019]:
\begin{itemize}
\item Numéro véhicule
\item Immatriculation
\item Modèle
\item Couleur
\item Dernier kilométrage
\end{itemize}
\item[Tlocation2019]:
\begin{itemize}
\item Numéro client
\item Numéro véhicule
\item Date début location
\item Date retour prévue
\item Kilométrage départ
\end{itemize}
\item[Tlocatretour2019]:
\begin{itemize}
\item Numéro client
\item Numéro véhicule
\item Date début location
\item Date retour prévue
\item Kilométrage départ
\item Date retour effectif
\item Kilométrage fin
\end{itemize}
\end{description}
Vous trouverez sur lENT le script de création et de remplissage des
tables (des occurrences pourront être ajoutées si nécessaire)
\code{locationvehic2019.sql} Vos procédures SQL devront avoir la structure
suivante :
\begin{SaveVerbatim}{VerbEnv}
drop table tligne ;
create table Tligne (ligne varchar2(200)) ;
Déclaration des variables hôtes
Saisie des paramètres
Bloc PL/SQL
Select * from Tligne ;
\end{SaveVerbatim}
{\centering \fbox{\BUseVerbatim{VerbEnv}}\par}
\begin{exercice}[Sans utiliser la clause exception]
A partir dun numéro de véhicule saisi au clavier, afficher limmatriculation et le modèle correspondant ainsi que le nom du client si cest un véhicule en cours de location.
{\bf Cas derreur :} « n° de véhicule inconnu ».
\end{exercice}
\begin{verbatim}
-- Test VE001
-- aa-2000-za est l immatriculation du vehicule VE001 de modele clio 3 loue par Dup
-- Test VE005
-- ff-6000-za est l immatriculation du vehicule VE005 de modele Picasso
-- Test VE008
-- VE008 vehicule inconnu
DROP TABLE tligne;
CREATE TABLE tligne (ligne varchar2(100));
set echo off; set verify off; set feed off;
variable vnumvehicule char(5)
variable toto char(5)
prompt Entrer le numero du vehicule :
accept vnumvehicule
declare
dimmatriculation char(10);
dmodele varchar2(30);
dmessage varchar2(100);
dnom VARCHAR2(80);
begin
dmessage := '&vnumvehicule'||' vehicule inconnu';
select immat, modele into dimmatriculation, dmodele
from Tvehicule2017
where noveh='&vnumvehicule';
dmessage := dimmatriculation||' est l immatriculation du vehicule'||'&vnumvehicule'|
|' de modele '||dmodele;
select nom into dnom
from Tclient2017, Tlocation2017
where Tlocation2017.noveh='&vnumvehicule' and Tlocation2017.noclient=Tclient2017.noclient;
Insert into tligne values (dmessage||' loue par '||dnom);
exception
when no_data_found then
insert into tligne values (dmessage);
end;
.
/
select * from tligne;
set echo on; set verify on; set feed on;
\end{verbatim}
\begin{exercice}[Avec la clause exception]
Afficher le numéro du véhicule loué par un client dont le numéro sera saisi.
{\bf Cas derreur :}
\begin{itemize}
\item « aucune location pour ce client »
\item « plusieurs locations en cours pour ce client » (cf un prochain
TP pour traiter ce problème)
\end{itemize}
\end{exercice}
\begin{verbatim}
-- Test C001, C002, C003 :
-- plusieurs locations pour C001
-- vehicule VE003 est loue par C002
-- aucune location pour C003
DROP TABLE tligne;
CREATE TABLE tligne (ligne varchar2(100));
set echo off; set verify off; set feed off;
variable vnoclient char(4)
prompt Entrer le numero du client :
accept vnoclient
declare
dnovehicule char(5);
BEGIN
select noveh into dnovehicule
from Tlocation2017
where noclient='&vnoclient';
Insert into tligne values ('vehicule '||dnovehicule||' est loue par '||'&vnoclient');
exception
when no_data_found then
insert into tligne values ('aucune location pour '||'&vnoclient');
when too_many_rows then
insert into tligne values ('plusieurs locations pour '||'&vnoclient');
end;
.
/
select * from tligne;
set echo on; set verify on; set feed on;
\end{verbatim}
\begin{exercice}[Mise à jour : enregistrement dun retour de location]
Il est demander d'enregistrer le retour dun véhicule. Donner la
procédure PL/SQL permettant lenregistrement du retour, pour une date
de retour donnée et pour un véhicule dont on saisira le numéro. On
saisira également le kilométrage de fin de location. Informations à
saisir par l'utilisateur sont : numéro du véhicule, date de retour,
kilométrage de fin.
Les messages suivants sont à prévoir :
\begin{itemize}
\item numéro véhicule inconnu
\item ce véhicule nest pas en cours de location
\item la date de retour doit être postérieure à la date de début de
location
\item le kilométrage de fin doit être supérieur au kilométrage de
début
\item le retour a bien été enregistré et le kilométrage du véhicule a été
mis à jour
\end{itemize}
\end{exercice}
\begin{verbatim}
-- TEST
-- VE009
-- numero de vehicule inconnu
-- VE004
-- Vehicule pas en cours de location
-- VE003
-- '03-JAN-2007'
-- 370000
-- PB date de retour inf date debut
-- VE003
-- '03-JAN-2018'
-- 37
-- PB Km de retour inf KM debut
-- VE004
-- '03-JAN-2018'
-- 4000000
-- ORA-00001 : pb de clef non respectee
-- ORA-02290 : check constraint Viole les contraintes d'integrite du modele.
insert into Tlocation2017 values ('C002','VE004',to_date('29-01-2016','DD-MM-YYYY'),to_date('10-02-2017','DD-MM-YYYY'),5000);
DROP TABLE tligne;
CREATE TABLE tligne (ligne varchar2(100));
set echo off; set verify off; set feed off;
variable vnovehicule char(5);
variable vdateretour date;
variable vkmfin number;
prompt Entrer le numero du vehicule :
accept vnovehicule
prompt Entrer la date de retour :
accept vdateretour
prompt Entrer le kilometrage de fin :
accept vkmfin
declare
dnovehicule char(5);
ddatedebut date;
dkmdeb number(6);
dnoclient char(4);
dmessage varchar2(100);
begin
dmessage:='numero de vehicule inconnu';
select noveh into dnovehicule
from Tvehicule2017
where noveh='&vnovehicule';
dmessage:='Vehicule pas en cours de location';
select noclient into dnoclient
from Tlocation2017
where noveh='&vnovehicule';
select datedeb, kmdeb, noclient into ddatedebut, dkmdeb, dnoclient
from Tlocation2017
where noveh='&vnovehicule';
if (ddatedebut >= &vdateretour)
then Insert into tligne values ('PB date de retour inf date debut');
else
if (dkmdeb >= &vkmfin)
then Insert into tligne values ('PB Km de retour inf KM debut');
else
Insert into Tlocatretour2017 values (dnoclient,'&vnovehicule',ddatedebut,dkmdeb,&vkmfin,to_date(&vdateretour,'DD-MM-YYYY'));
-- Insert into Tlocatretour2017 values (dnoclient,'&vnovehicule',ddatedebut,dkmdeb,&vkmfin,to_date('15-12-2019','DD-MM-YYYY'));
Insert into tligne values ('Retour bien effectue ');
end if;
end if;
exception
when no_data_found
then insert into tligne values (dmessage);
end;
.
/
select * from tligne;
set echo on; set verify on; set feed on;
\end{verbatim}
\paragraph{Premi\`ere s\'eance :} Connexion : \verb+sqlplus <user>/<password>@KIROV+
Lors de votre première connexion modifier votre mot de passe avec la
commande : \verb+PASSWORD;+
Ce qui est équivalent à :
\verb+ALTER USER dupond IDENTIFIED BY password;+
Pour lancer un fichier \verb+.sql+ en sqlplus, il suffit de taper :
\verb+@toto.sql;+
Pour quitter sqlplus, il suffit de taper : \verb+quit;+
Lancer \verb+sqlplus+ avec cette commande \verb+rlwrap sqlplus+ vous
permet d'avoir l'historique.
\end{document}

@ -0,0 +1,192 @@
\documentclass[a4paper,11pt]{article}
\usepackage[utf8x]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[french]{babel}
\usepackage[a4paper,hmargin=20mm,vmargin=30mm]{geometry}%\usepackage{fullpage}
\usepackage{url}
\usepackage{comment}
\usepackage{fancyhdr}% fancy header
\usepackage{fancyvrb}
\fancypagestyle{monstyle}{
%\fancyhead{}
\renewcommand{\headrulewidth}{1pt}
%% %\renewcommand{\footrulewidth}{0.4pt}
% \fancyhead[LE]{\slshape \thepage/ \pageref{LastPage}}
%% \fancyhead[RO]{\slshape \thepage/ \pageref{LastPage}}
%\fancyhf{}
%\fancyhead[LE]{\slshape LE}
%\fancyhead[CE]{\slshape CE}
%\fancyhead[RE]{\slshape RE}
\fancyhead[LO]{\bfseries 2018-2019 BD PLS/SQL\rightmark}
%\fancyhead[CO]{\slshape APF}
\fancyhead[RO]{\bfseries ~\leftmark }
%% %\fancyfoot{}
% \fancyfoot[LE,RO]{}
\fancyfoot[CO,CE]{}%\slshape\thepage/\pageref{LastPage}}
%% %\fancyfoot[LO,RE]{\small\slshape \ddmmyyyydate version du \today}
}
% \pagestyle{fancy}
\usepackage{amsmath}
\usepackage{amsthm}
\theoremstyle{definition}
\newtheorem{exercice}{Exercice}
\pagestyle{monstyle}
\usepackage{amsmath}
\usepackage{amsthm}
\newcommand{\code}[1]{\texttt{#1}}
\begin{document}
\begin{center}
TP1 : Location de v\'ehicules
\end{center}
Contexte : L'objectif est de gérer les locations dune agence de
locations de véhicules. Les tables utilisées sont les suivantes :
\begin{description}
\item[Tclient2019]:
\begin{itemize}
\item Numéro client
\item Nom
\item Ville
\item Code postal
\end{itemize}
\item[Tcategorie2019]:
\begin{itemize}
\item Numéro categorie
\item Libellé
\end{itemize}
\item[Tremplacement2019]:
\begin{itemize}
\item Numéro catégorie
\item Numéro catégorie équivalente
\end{itemize}
\item[Tvehicule2019]:
\begin{itemize}
\item Numéro véhicule
\item Immatriculation
\item Modèle
\item Couleur
\item Dernier kilométrage
\end{itemize}
\item[Tlocation2019]:
\begin{itemize}
\item Numéro client
\item Numéro véhicule
\item Date début location
\item Date retour prévue
\item Kilométrage départ
\end{itemize}
\item[Tlocatretour2019]:
\begin{itemize}
\item Numéro client
\item Numéro véhicule
\item Date début location
\item Date retour prévue
\item Kilométrage départ
\item Date retour effectif
\item Kilométrage fin
\end{itemize}
\end{description}
Vous trouverez sur le site suivant \url{http://sancy.univ-bpclermont.fr/~lafourcade/BDP3/} et sur lENT le script de création
et de remplissage des tables (des occurrences pourront être ajoutées
si nécessaire) \code{locationvehic2019.sql} Vos procédures SQL devront
avoir la structure suivante :
\begin{SaveVerbatim}{VerbEnv}
drop table tligne ;
create table Tligne (ligne varchar2(200)) ;
Déclaration des variables hôtes
Saisie des paramètres
Bloc PL/SQL
Select * from Tligne ;
\end{SaveVerbatim}
{\centering \fbox{\BUseVerbatim{VerbEnv}}\par}
\begin{exercice}[Sans utiliser la clause exception]
A partir dun numéro de véhicule saisi au clavier, afficher limmatriculation et le modèle correspondant ainsi que le nom du client si cest un véhicule en cours de location.
{\bf Cas derreur :} « n° de véhicule inconnu ».
\end{exercice}
\begin{exercice}[Avec la clause exception]
Afficher le numéro du véhicule loué par un client dont le numéro sera saisi.
{\bf Cas derreur :}
\begin{itemize}
\item « aucune location pour ce client »
\item « plusieurs locations en cours pour ce client » (cf un prochain
TP pour traiter ce problème)
\end{itemize}
\end{exercice}
\begin{exercice}[Mise à jour : enregistrement dun retour de location]
Il est demander d'enregistrer le retour dun véhicule. Donner la
procédure PL/SQL permettant lenregistrement du retour, pour une date
de retour donnée et pour un véhicule dont le numéro sera saisi ainsi
que le kilométrage de fin de location. Informations à saisir par
l'utilisateur sont : numéro du véhicule, date de retour, kilométrage
de fin.
Les messages suivants sont à prévoir :
\begin{itemize}
\item numéro véhicule inconnu,
\item ce véhicule nest pas en cours de location,
\item la date de retour doit être postérieure à la date de début de
location,
\item le kilométrage de fin doit être supérieur au kilométrage de
début,
\item le retour a bien été enregistré et le kilométrage du véhicule a été
mis à jour.
\end{itemize}
\end{exercice}
\paragraph{Premi\`ere s\'eance :} Connexion : \verb+sqlplus <user>/<password>@KIROV+
Lors de votre première connexion modifier votre mot de passe avec la
commande : \verb+PASSWORD;+
Ce qui est équivalent à :
\verb+ALTER USER dupond IDENTIFIED BY password;+
Pour lancer un fichier \verb+.sql+ en sqlplus, il suffit de taper :
\verb+@toto.sql;+
Pour quitter sqlplus, il suffit de taper : \verb+quit;+
Lancer \verb+sqlplus+ avec cette commande \verb+rlwrap sqlplus+ vous
permet d'avoir l'historique.
\end{document}

@ -0,0 +1,308 @@
\documentclass[a4paper,11pt]{article}
\usepackage[utf8x]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[french]{babel}
\usepackage[a4paper,hmargin=20mm,vmargin=30mm]{geometry}%\usepackage{fullpage}
\usepackage{url}
\usepackage{comment}
\usepackage{fancyhdr}% fancy header
\usepackage{fancyvrb}
\fancypagestyle{monstyle}{
%\fancyhead{}
\renewcommand{\headrulewidth}{1pt}
%% %\renewcommand{\footrulewidth}{0.4pt}
% \fancyhead[LE]{\slshape \thepage/ \pageref{LastPage}}
%% \fancyhead[RO]{\slshape \thepage/ \pageref{LastPage}}
%\fancyhf{}
%\fancyhead[LE]{\slshape LE}
%\fancyhead[CE]{\slshape CE}
%\fancyhead[RE]{\slshape RE}
\fancyhead[LO]{\bfseries 2018-2019 BD PLS/SQL\rightmark}
%\fancyhead[CO]{\slshape APF}
\fancyhead[RO]{\bfseries ~\leftmark }
%% %\fancyfoot{}
% \fancyfoot[LE,RO]{}
\fancyfoot[CO,CE]{}%\slshape\thepage/\pageref{LastPage}}
%% %\fancyfoot[LO,RE]{\small\slshape \ddmmyyyydate version du \today}
}
% \pagestyle{fancy}
\usepackage{amsmath}
\usepackage{amsthm}
\theoremstyle{definition}
\newtheorem{exercice}{Exercice}
\pagestyle{monstyle}
\usepackage{amsmath}
\usepackage{amsthm}
\newcommand{\code}[1]{\texttt{#1}}
\begin{document}
\begin{center}
TP2
\end{center}
\begin{SaveVerbatim}{VerbEnv}
Catégorie : numéro libellé
Num. véhic. Immat. Couleur Modèle
XXXXX XX-9999-XX X...X X...X
XXXXX XX-9999-XX X...X X...X
XXXXX XX-9999-XX X...X X...X
\end{SaveVerbatim}
\begin{exercice} Afficher la liste des véhicules libres dune catégorie dont on saisit le numéro.
Laffichage se fera sous la forme :
\begin{center}
\fbox{\BUseVerbatim{VerbEnv}}
\end{center}
{\bf Cas derreur :}
\begin{itemize}
\item « catégorie inconnue »
\item « Pas de véhicules libres dans cette catégorie »
\end{itemize}
\end{exercice}
\begin{verbatim}
ORA-01001: verifier que le curseur est ouver
-- TEST
-- CAT3
-- VE005 ff-6000-za noire Picasso
-- CAT2
-- Pas de vehicule libre dans cette categorie
-- CAT7
-- Pas de vehicule libre dans cette categorie
DROP TABLE tligne;
CREATE TABLE tligne (ligne varchar2(300));
set echo off; set verify off; set feed off;
variable vcategorie char(4);
prompt Entrer le numero de la categorie :
accept vnocategorie
declare
dimmatriculation Tvehicule2017.immat%TYPE;
dnoveh Tvehicule2017.noveh%TYPE;
dcouleur Tvehicule2017.couleur%TYPE;
dmodele Tvehicule2017.modele%TYPE;
dcat number;
cursor r is select noveh, immat, couleur, modele from Tvehicule2017
where nocat='&vnocategorie' and noveh not in (select noveh from Tlocation2017)
order by noveh;
begin
select noveh, immat, couleur, modele into dnoveh, dimmatriculation, dcouleur, dmodele
from Tvehicule2017
where nocat='&vnocategorie' and noveh not in (select noveh from Tlocation2017)
order by noveh;
select count(nocat) into dcat from Tcategorie2017 where nocat='&vnocategorie';
if dcat = 0 then insert into tligne values ('categorie inconnu');
end if;
open r;
fetch r into dnoveh, dimmatriculation, dcouleur, dmodele;
while r%found
loop
insert into tligne values ( dnoveh ||' '||dimmatriculation||'
'||dcouleur||' '||dmodele);
fetch r into dnoveh, dimmatriculation, dcouleur, dmodele;
end loop;
close r;
exception
when no_data_found then
insert into tligne values ('Pas de vehicule libre dans cette categorie');
end;
.
/
select * from tligne;
set echo on; set verify on; set feed on;
\end{verbatim}
\begin{exercice}
Afficher la liste des locations en cours dun client dont le numéro
est saisi par l'utilisateur. La liste sera triée par catégorie puis
par numéro de véhicule. En fin de liste il faut afficher le nombre de
locations en cours du client.
\begin{SaveVerbatim}{exo2}
Propriétaire : numéro nom
Catégorie num vehic. Date début Modèle
XXXX XX-9999-XX 99-99-9999 X...X
XXXX XX-9999-XX 99-99-9999 X...X
XXXX XX-9999-XX 99-99-9999 X...X
Nombre de locations en cours : 99
\end{SaveVerbatim}
\begin{center}
\fbox{\BUseVerbatim{exo2}}
\end{center}
Remarque : le n° saisi doit correspondre à un n° existant dans
la base (ce cas derreur n'est pas trait\'e dans cette question).
{\bf Cas derreur :}
\begin{itemize}
\item « aucune location pour ce client »
\item « plusieurs locations en cours pour ce client » (cf un prochain
TP pour traiter ce problème)
\end{itemize}
\end{exercice}
\begin{verbatim}
-- TEST C001
-- VE001 VE001 30-JAN-17 clio 3
-- VE002 VE002 28-JAN-17 308
-- Nombre de locations en cours pour le client C001 est de 2
DROP TABLE tligne;
CREATE TABLE tligne (ligne varchar2(200));
set echo off; set verify off; set feed off;
variable vclient char(4);
prompt Entrer le numero du client:
accept vnoclient
declare
dnocat Tvehicule2017.nocat%TYPE;
dnoveh Tlocation2017.noveh%TYPE;
ddatedeb Tlocation2017.datedeb%TYPE;
dmodele Tvehicule2017.modele%TYPE;
dnombreloc number;
cursor r is
select nocat, Tlocation2017.noveh, datedeb, modele
from Tlocation2017, Tvehicule2017
where noclient='&vnoclient' and Tlocation2017.noveh= Tvehicule2017.noveh
order by nocat, noveh;
begin
open r;
fetch r into dnocat, dnoveh, ddatedeb, dmodele;
while r%found
loop
insert into tligne values (dnoveh||' '||dnoveh||' '||ddatedeb||' '||dmodele);
fetch r into dnocat, dnoveh, ddatedeb, dmodele;
end loop;
close r;
select count(noclient) into dnombreloc
from Tlocation2017
where noclient='&vnoclient';
insert into tligne values ('Nombre de locations en cours pour le client '||'&noclient'|
|' est de '||dnombreloc);
exception
when no_data_found then
insert into tligne values ('Pas de vehicule libre');
end;
.
/
select * from tligne;
set echo on; set verify on; set feed on;
\end{verbatim}
\begin{exercice}Afficher le nombre de véhicules par catégorie.
\begin{SaveVerbatim}{exo3}
Nombre de véhicules par catégorie
Catégorie nb de véhicules
XXXX 99
XXXX 99
\end{SaveVerbatim}
\begin{center}
\fbox{\BUseVerbatim{exo3}}
\end{center}
\end{exercice}
\begin{verbatim}
DROP TABLE tligne;
CREATE TABLE tligne (ligne varchar2(300));
set echo off; set verify off; set feed off;
declare
dnocat Tvehicule2017.nocat%TYPE;
dnbveh number;
cursor r is
select nocat, count(nocat)
from Tvehicule2017
group by nocat
order by nocat;
begin
open r;
fetch r into dnocat, dnbveh;
while r%found
loop
insert into tligne values (dnocat ||' '||dnbveh);
fetch r into dnocat, dnbveh;
end loop;
close r;
end;
.
/
select * from tligne;
set echo on; set verify on; set feed on;
\end{verbatim}
\end{document}

@ -0,0 +1,151 @@
\documentclass[a4paper,11pt]{article}
\usepackage[utf8x]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[french]{babel}
\usepackage[a4paper,hmargin=20mm,vmargin=30mm]{geometry}%\usepackage{fullpage}
\usepackage{url}
\usepackage{comment}
\usepackage{fancyhdr}% fancy header
\usepackage{fancyvrb}
\fancypagestyle{monstyle}{
%\fancyhead{}
\renewcommand{\headrulewidth}{1pt}
%% %\renewcommand{\footrulewidth}{0.4pt}
% \fancyhead[LE]{\slshape \thepage/ \pageref{LastPage}}
%% \fancyhead[RO]{\slshape \thepage/ \pageref{LastPage}}
%\fancyhf{}
%\fancyhead[LE]{\slshape LE}
%\fancyhead[CE]{\slshape CE}
%\fancyhead[RE]{\slshape RE}
\fancyhead[LO]{\bfseries 2018-2019 BD PLS/SQL\rightmark}
%\fancyhead[CO]{\slshape APF}
\fancyhead[RO]{\bfseries ~\leftmark }
%% %\fancyfoot{}
% \fancyfoot[LE,RO]{}
\fancyfoot[CO,CE]{}%\slshape\thepage/\pageref{LastPage}}
%% %\fancyfoot[LO,RE]{\small\slshape \ddmmyyyydate version du \today}
}
% \pagestyle{fancy}
\usepackage{amsmath}
\usepackage{amsthm}
\theoremstyle{definition}
\newtheorem{exercice}{Exercice}
\pagestyle{monstyle}
\usepackage{amsmath}
\usepackage{amsthm}
\newcommand{\code}[1]{\texttt{#1}}
\begin{document}
\begin{center}
TP2
\end{center}
\begin{SaveVerbatim}{VerbEnv}
Catégorie : numéro libellé
Num. véhic. Immat. Couleur Modèle
XXXXX XX-9999-XX X...X X...X
XXXXX XX-9999-XX X...X X...X
XXXXX XX-9999-XX X...X X...X
\end{SaveVerbatim}
\begin{exercice} Afficher la liste des véhicules libres dune
catégorie dont le numéro est saisi. Laffichage se fera sous la
forme :
\begin{center}
\fbox{\BUseVerbatim{VerbEnv}}
\end{center}
{\bf Cas derreur :}
\begin{itemize}
\item « catégorie inconnue »,
\item « pas de véhicules libres dans cette catégorie ».
\end{itemize}
\end{exercice}
\begin{exercice}
Afficher la liste des locations en cours dun client dont le numéro
est saisi par l'utilisateur. La liste sera triée par catégorie puis
par numéro de véhicule. En fin de liste il faut afficher le nombre de
locations en cours du client.
\begin{SaveVerbatim}{exo2}
Client : numéro nom
Catégorie num vehic. Date début Modèle
XXXX XX-9999-XX 99-99-9999 X...X
XXXX XX-9999-XX 99-99-9999 X...X
XXXX XX-9999-XX 99-99-9999 X...X
Nombre de locations en cours : 99
\end{SaveVerbatim}
\begin{center}
\fbox{\BUseVerbatim{exo2}}
\end{center}
Remarque : le n° saisi doit correspondre à un n° existant dans
la base (ce cas derreur n'est pas trait\'e dans cette question).
{\bf Cas derreur :}
\begin{itemize}
\item « aucune location pour ce client »
%\item « plusieurs locations en cours pour ce client » (cf un prochain
% TP pour traiter ce problème)
\end{itemize}
\end{exercice}
\begin{exercice}Afficher le nombre de véhicules par catégorie.
\begin{SaveVerbatim}{exo3}
Nombre de véhicules par catégorie
Catégorie nb de véhicules
XXXX 99
XXXX 99
\end{SaveVerbatim}
\begin{center}
\fbox{\BUseVerbatim{exo3}}
\end{center}
\end{exercice}
\end{document}

@ -0,0 +1,359 @@
\documentclass[a4paper,11pt]{article}
\usepackage[utf8x]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[french]{babel}
\usepackage[a4paper,hmargin=20mm,vmargin=30mm]{geometry}%\usepackage{fullpage}
\usepackage{url}
\usepackage{comment}
\usepackage{fancyhdr}% fancy header
\usepackage{fancyvrb}
\fancypagestyle{monstyle}{
%\fancyhead{}
\renewcommand{\headrulewidth}{1pt}
%% %\renewcommand{\footrulewidth}{0.4pt}
% \fancyhead[LE]{\slshape \thepage/ \pageref{LastPage}}
%% \fancyhead[RO]{\slshape \thepage/ \pageref{LastPage}}
%\fancyhf{}
%\fancyhead[LE]{\slshape LE}
%\fancyhead[CE]{\slshape CE}
%\fancyhead[RE]{\slshape RE}
\fancyhead[LO]{\bfseries 2018-2019 BD PLS/SQL\rightmark}
%\fancyhead[CO]{\slshape APF}
\fancyhead[RO]{\bfseries ~\leftmark }
%% %\fancyfoot{}
% \fancyfoot[LE,RO]{}
\fancyfoot[CO,CE]{}%\slshape\thepage/\pageref{LastPage}}
%% %\fancyfoot[LO,RE]{\small\slshape \ddmmyyyydate version du \today}
}
% \pagestyle{fancy}
\usepackage{amsmath}
\usepackage{amsthm}
\theoremstyle{definition}
\newtheorem{exercice}{Exercice}
\pagestyle{monstyle}
\usepackage{amsmath}
\usepackage{amsthm}
\newcommand{\code}[1]{\texttt{#1}}
\begin{document}
\begin{center}
TP3
\end{center}
\begin{exercice}[Suppression dun client]
Information à saisir : n° client
Pr\'evoir les messages suivants :
\begin{itemize}
\item client inconnu
\item des locations sont en cours : suppression impossible suivi de la liste des locations en cours
\item n 'locations retournées ont été supprimées
\item le client a bien été supprimé
\end{itemize}
\end{exercice}
\begin{verbatim}
-- ORA-01422 : selct renvoit trop de choses
-- Test
-- C004
-- client inconnu
-- C001
-- 2 locations sont en cours : suppression impossible
-- VE001
-- VE002
-- C003
-- BUG
start locationvehic2017;
DROP TABLE tligne;
CREATE TABLE tligne (ligne varchar2(300));
set echo off; set verify off; set feed off;
variable vnoclient char(4);
prompt Entrer le numero du client :
accept vnoclient
declare
dmessage varchar2(200);
dnoveh Tlocation2017.noveh%TYPE;
dnoclientloc Tclient2017.noclient%TYPE;
dnbnoclient number;
dnblocation number;
dnblocationout number;
CURSOR r IS
select noveh
from Tlocation2017
where noclient='&vnoclient';
CURSOR loc IS
select noclient
from Tlocatretour2017
where noclient='&vnoclient'
FOR UPDATE;
begin
dmessage:='client inconnu';
select count(noclient) into dnbnoclient
from Tclient2017
where noclient='&vnoclient';
if dnbnoclient = 0 then insert into tligne values (dmessage);
else
select count(noclient) into dnblocation from Tlocation2017 where noclient='&vnoclient';
if dnblocation > 0 then
dmessage:=dnblocation||' locations sont en cours : suppression impossible';
insert into tligne values (dmessage);
open r;
fetch r into dnoveh;
while r%found
loop
insert into tligne values(dnoveh);
COMMIT;
fetch r into dnoveh;
end loop;
close r;
else
select count(noclient) into dnblocationout from Tlocatretour2017 where noclient='&vnoclient';
dmessage:=dnblocationout||' location retourns vont etre supprimees';
insert into tligne values (dmessage);
if dnblocationout=1 then
open loc;
fetch loc into dnoclientloc;
DELETE FROM Tlocatretour2017 WHERE CURRENT OF loc;
COMMIT;
close loc;
end if;
DELETE FROM Tclient2017 WHERE noclient='&vnoclient';
dmessage:='le client a bien ete supprime';
insert into tligne values (dmessage);
end if;
end if;
end;
.
/
select * from tligne;
set echo on; set verify on; set feed on;
\end{verbatim}
\begin{exercice}
Afficher la liste des véhicules libres de même catégorie ou de
catégorie équivalente que le véhicule n° XXXXX (n° saisi).
\begin{SaveVerbatim}{exo2}
Numéro véhicule : numéro catégorie
Catégorie libellé cat. num vehic. kms
XXXX X...X XX-9999-XX 9999
XXXX X...X XX-9999-XX 9999
XXXX X...X XX-9999-XX 9999
XXXX X...X XX-9999-XX 9999
\end{SaveVerbatim}
\begin{center}
\fbox{\BUseVerbatim{exo2}}
\end{center}
{\bf Cas derreur :}
\begin{itemize}
\item N° véhicule inconnu
\item Aucun véhicule libre de catégorie équivalente
\end{itemize}
\end{exercice}
\begin{verbatim}
start locationvehic2017;
commit;
set echo off; set verify off; set feed off;
variable vnoclient char(4);
prompt Entrer le numero du client :
accept vnoclient
declare
dno varchar(4);
dkmdeb number;
CURSOR loc IS
select noclient
from Tlocatretour2017
where noclient='&vnoclient'
FOR UPDATE of kmdeb;
begin
open loc;
fetch loc into dno;
while loc%found
loop
UPDATE Tlocatretour2017 SET kmdeb=7 WHERE CURRENT OF loc ;
fetch loc into dno;
end loop;
COMMIT;
close loc;
end;
.
/
select * from TLocatretour2017;
set echo on; set verify on; set feed on;
\end{verbatim}
\begin{exercice}Afficher la liste des locations retournées du mois :
\begin{SaveVerbatim}{exo3}
Locations retournées du mois
Catégorie : cat libellé
N° véhicule : XXXXX
N° client Date début Nb de jours Nb de kms
... ... ... ...
... ... ... ...
Total véhicule : xx jours
99999 kms
N° véhicule : XXXXX
N° client Date début Nb de jours Nb de kms
... ... ... ...
... ... ... ...
Total véhicule : xx jours
99999 kms
Catégorie : cat libellé
N° véhicule : XXXXX
N° client Date début Nb de jours Nb de kms
... ... ... ...
... ... ... ...
Total véhicule : xx jours
99999 kms
N° véhicule : XXXXX
N° client Date début Nb de jours Nb de kms
... ... ... ...
... ... ... ...
Total véhicule : xx jours
99999 kms
\end{SaveVerbatim}
\begin{center}
\begin{small}
\fbox{\BUseVerbatim{exo3}}
\end{small}
\end{center}
\end{exercice}
\begin{verbatim}
DROP TABLE tligne;
CREATE TABLE tligne (ligne varchar2(300));
set echo off; set verify off; set feed off;
declare
dmessage varchar2(300);
dnoclient varchar(4);
dnoveh char(5);
dkm number;
ddatedeb date;
dmois date;
dnbjours number;
dnbkms number;
dtotalkms number;
dtotaljours number:=0;
dcurrentnoveh char(5);
-- between ROUND(to_date(sysdate),'MONTH') and TRUNC(to_date(sysdate,'DD-MON-YY'),'MONTH')
CURSOR r IS
select noveh, noclient, datedeb, (dateretour - datedeb), (kmfin-kmdeb) into dnoveh, dnoclient, ddatedeb, dnbjours, dnbkms
from Tlocatretour2017
order by noveh;
begin
dmessage:='Aucune voiture louee';
open r;
fetch r into dnoveh, dnoclient, ddatedeb, dnbjours, dnbkms;
dcurrentnoveh:=' ';
dtotalkms:=dnbkms;
dtotaljours:=dnbjours;
while r%found
loop
if (dcurrentnoveh = dnoveh) then
insert into tligne values (dnoclient||' '||ddatedeb||' '||dnbjours||' '||dnbkms);
dtotalkms:=dtotalkms+dnbkms;
dtotaljours:=dtotaljours+dnbjours;
else
if dcurrentnoveh<>' ' then
insert into tligne values ('total jour: '||dtotaljours);
insert into tligne values ('total km: '||dtotalkms);
end if;
insert into tligne values (dnoveh);
insert into tligne values (dnoclient||' '||ddatedeb||' '||dnbjours||' '||dnbkms);
dtotalkms:=dnbkms;
dtotaljours:=dnbjours;
end if;
dcurrentnoveh:=dnoveh;
fetch r into dnoveh, dnoclient, ddatedeb, dnbjours, dnbkms;
end loop;
insert into tligne values ('total jour: '||dtotaljours);
insert into tligne values ('total km: '||dtotalkms);
close r;
exception
when no_data_found then insert into tligne values (dmessage);
end;
.
/
select * from tligne;
set echo on; set verify on; set feed on;
\end{verbatim}
\end{document}

@ -0,0 +1,153 @@
\documentclass[a4paper,11pt]{article}
\usepackage[utf8x]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[french]{babel}
\usepackage[a4paper,hmargin=20mm,vmargin=30mm]{geometry}%\usepackage{fullpage}
\usepackage{url}
\usepackage{comment}
\usepackage{fancyhdr}% fancy header
\usepackage{fancyvrb}
\fancypagestyle{monstyle}{
%\fancyhead{}
\renewcommand{\headrulewidth}{1pt}
%% %\renewcommand{\footrulewidth}{0.4pt}
% \fancyhead[LE]{\slshape \thepage/ \pageref{LastPage}}
%% \fancyhead[RO]{\slshape \thepage/ \pageref{LastPage}}
%\fancyhf{}
%\fancyhead[LE]{\slshape LE}
%\fancyhead[CE]{\slshape CE}
%\fancyhead[RE]{\slshape RE}
\fancyhead[LO]{\bfseries 2018-2019 BD PLS/SQL\rightmark}
%\fancyhead[CO]{\slshape APF}
\fancyhead[RO]{\bfseries ~\leftmark }
%% %\fancyfoot{}
% \fancyfoot[LE,RO]{}
\fancyfoot[CO,CE]{}%\slshape\thepage/\pageref{LastPage}}
%% %\fancyfoot[LO,RE]{\small\slshape \ddmmyyyydate version du \today}
}
% \pagestyle{fancy}
\usepackage{amsmath}
\usepackage{amsthm}
\theoremstyle{definition}
\newtheorem{exercice}{Exercice}
\pagestyle{monstyle}
\usepackage{amsmath}
\usepackage{amsthm}
\newcommand{\code}[1]{\texttt{#1}}
\begin{document}
\begin{center}
TP3
\end{center}
\begin{exercice}[Suppression dun client]
Information à saisir : n° client
Pr\'evoir les messages suivants :
\begin{itemize}
\item client inconnu,
\item des locations sont en cours : suppression impossible suivi de la liste des locations en cours,
\item n 'locations retournées ont été supprimées,
\item le client a bien été supprimé.
\end{itemize}
\end{exercice}
\begin{exercice}
Afficher la liste des véhicules libres de même catégorie ou de
catégorie équivalente que le véhicule n° XXXXX (n° saisi).
\begin{SaveVerbatim}{exo2}
Numéro véhicule : numéro catégorie
Catégorie libellé cat. num vehic. kms
XXXX X...X XX-9999-XX 9999
XXXX X...X XX-9999-XX 9999
XXXX X...X XX-9999-XX 9999
XXXX X...X XX-9999-XX 9999
\end{SaveVerbatim}
\begin{center}
\fbox{\BUseVerbatim{exo2}}
\end{center}
{\bf Cas derreur :}
\begin{itemize}
\item N° véhicule inconnu
\item Aucun véhicule libre de catégorie équivalente
\end{itemize}
\end{exercice}
\begin{exercice}Afficher la liste des locations retournées du mois :
\begin{SaveVerbatim}{exo3}
Locations retournées du mois
Catégorie : cat libellé
N° véhicule : XXXXX
N° client Date début Nb de jours Nb de kms
... ... ... ...
... ... ... ...
Total véhicule : xx jours
99999 kms
N° véhicule : XXXXX
N° client Date début Nb de jours Nb de kms
... ... ... ...
... ... ... ...
Total véhicule : xx jours
99999 kms
Catégorie : cat libellé
N° véhicule : XXXXX
N° client Date début Nb de jours Nb de kms
... ... ... ...
... ... ... ...
Total véhicule : xx jours
99999 kms
N° véhicule : XXXXX
N° client Date début Nb de jours Nb de kms
... ... ... ...
... ... ... ...
Total véhicule : xx jours
99999 kms
\end{SaveVerbatim}
\begin{center}
\begin{small}
\fbox{\BUseVerbatim{exo3}}
\end{small}
\end{center}
\end{exercice}
\end{document}

@ -0,0 +1,172 @@
\documentclass[a4paper,11pt]{article}
\usepackage[utf8x]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[french]{babel}
\usepackage[a4paper,hmargin=20mm,vmargin=30mm]{geometry}%\usepackage{fullpage}
\usepackage{url}
\usepackage{comment}
\usepackage{fancyhdr}% fancy header
\usepackage{times}
\usepackage{fancyvrb}
\fancypagestyle{monstyle}{
%\fancyhead{}
\renewcommand{\headrulewidth}{1pt}
%% %\renewcommand{\footrulewidth}{0.4pt}
% \fancyhead[LE]{\slshape \thepage/ \pageref{LastPage}}
%% \fancyhead[RO]{\slshape \thepage/ \pageref{LastPage}}
%\fancyhf{}
%\fancyhead[LE]{\slshape LE}
%\fancyhead[CE]{\slshape CE}
%\fancyhead[RE]{\slshape RE}
\fancyhead[LO]{\bfseries 2018-2019 BD PLS/SQL\rightmark}
%\fancyhead[CO]{\slshape APF}
\fancyhead[RO]{\bfseries ~\leftmark }
%% %\fancyfoot{}
% \fancyfoot[LE,RO]{}
\fancyfoot[CO,CE]{}%\slshape\thepage/\pageref{LastPage}}
%% %\fancyfoot[LO,RE]{\small\slshape \ddmmyyyydate version du \today}
}
% \pagestyle{fancy}
\usepackage{amsmath}
\usepackage{amsthm}
\theoremstyle{definition}
\newtheorem{exercice}{Exercice}
\pagestyle{monstyle}
\usepackage{amsmath}
\usepackage{amsthm}
\newcommand{\code}[1]{\texttt{#1}}
\newcommand{\proc}{Pro$^{*}$C}
\begin{document}
\begin{center}
TP 4
\end{center}
\paragraph{Objectifs du TP :} mettre en œuvre le langage \proc{} pour gérer la connexion et la déconnexion à une base de données, créer une table, insérer des valeurs et lire des valeurs dans une table
\paragraph{Attention :} Vous allez travailler sous Unix afin daccéder
aux commandes permettant de compiler vos programmes \proc{}. Si
nécessaire, vous avez accès à SQLplus en utilisant la commande : \code{sqlplus login@kirov}
Assurez-vous lorsque vous êtes sous SQLplus que vous validez bien vos
requêtes si vous souhaitez ne pas avoir de problèmes en \proc{} (en
utilisant \code{COMMIT WORK}).
\paragraph{Programmation en \proc{} :} Réalisez vos programmes \proc{}
en utilisant votre éditeur de texte préféré, et veillez à enregistrer
les fichiers avec lextension \code{.pc}. Pour précompiler, compiler
et linker votre programme, il faut utiliser la commande suivante :
\noindent \code{make -f /etc/oracle/proc.mk build EXE=FichierSansExtension OBJS=Fichier.o}
Cette commande va vous générer le fichier \code{.c}, le fichier \code{.o} et
lexécutable. Tous les fichiers auront le même nom. Choisissez-le donc
bien pour vous assurer quil représente bien ce que fait le programme
concerné.
\paragraph{Compte rendu :} Pour chaque question, donner le code du
programme, létat de la base (pour les tables concernées) avant et
après exécution du programme si une mise à jour a été effectuée et si
possible une copie de lécran au cours de lexécution.
%% \begin{SaveVerbatim}{VerbEnv}
%% Catégorie : numéro libellé
%% Num. véhic. Immat. Couleur Modèle
%% XXXXX XX-9999-XX X...X X...X
%% XXXXX XX-9999-XX X...X X...X
%% XXXXX XX-9999-XX X...X X...X
%% \end{SaveVerbatim}
\begin{exercice}
En reprenant les fonctions connexion et deconnexion vues en cours,
développez un programme \proc{} (\code{Q1.pc}) qui se connecte à la
base de données en demandant votre login et votre mot de passe puis se
déconnecte. Les messages suivants seront affichés en plus de ceux déjà
indiqués dans le cours:
\begin{enumerate}
\item Appel de la fonction connexion.
\item Appel de la fonction deconnexion.
\end{enumerate}
%% \begin{center}
%% \fbox{\BUseVerbatim{VerbEnv}}
%% \end{center}
\end{exercice}
\begin{exercice} \'Ecrire le programme \proc{} (\code{Q2.pc}) qui
reprend le programme écrit en Q1 et le complète pour créer la table
\code{tessai1 (id, num, unCar , chaine, uneDate)} où les colonnes
sont :
\begin{itemize}
\item \code{id} : chaine de 3 caractères,
\item \code{num} : numérique,
\item \code{unCar} : un seul caractère,
\item \code{chaine} : une chaine de caractères de longueur variable
dau plus 10 car,
\item \code{uneDate} : une date
\end{itemize}
Vous devez intégrer les contraintes suivantes: \code{id} est clé
primaire, \code{num} est une valeur comprise entre 100 et 199
(bornes comprises), \code{unCar} est soit \code{A}, soit
\code{B}, soit \code{C} chaine commence obligatoirement par \code{E}
\code{uneDate} est une date dont lannée est 2019.
Vérifiez sous sqlPlus, que la table est bien créée par \code{describe
tessai1}
\end{exercice}
\begin{exercice}
Ecrire le programme \proc{} (\code{Q3.pc}) qui reprend le programme
écrit dans l'exercice 1 et le complète pour insérer des valeurs dans
la table \code{tessai}.
\begin{itemize}
\item Par exemple, insérer : \code{T01, 100, C , Essai ,
01/03/2019} Vérifiez sous sqlPlus, que la table contient bien les
informations insérées.
\item Faire de nouvelles insertions en testant les différentes
contraintes. Vérifiez sous sqlPlus, les insertions ou les non
insertions !
\end{itemize}
\end{exercice}
\begin{exercice}
Ecrire le programme \proc{} (\code{Q4.pc}) qui reprend le programme
écrit dans l'exercice 1 et le complète pour lire une ligne de la table
\code{tessai}, par exemple lire la ligne dont \code{id=T01'} et
affiche les valeurs lues \code{(num, unCar, chaine et uneDate)}.
\end{exercice}
\end{document}

@ -0,0 +1,116 @@
\documentclass[a4paper,11pt]{article}
\usepackage[utf8x]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[french]{babel}
\usepackage[a4paper,hmargin=20mm,vmargin=30mm]{geometry}%\usepackage{fullpage}
\usepackage{url}
\usepackage{comment}
\usepackage{fancyhdr}% fancy header
%\usepackage{times}
\usepackage{fancyvrb}
\fancypagestyle{monstyle}{
%\fancyhead{}
\renewcommand{\headrulewidth}{1pt}
%% %\renewcommand{\footrulewidth}{0.4pt}
% \fancyhead[LE]{\slshape \thepage/ \pageref{LastPage}}
%% \fancyhead[RO]{\slshape \thepage/ \pageref{LastPage}}
%\fancyhf{}
%\fancyhead[LE]{\slshape LE}
%\fancyhead[CE]{\slshape CE}
%\fancyhead[RE]{\slshape RE}
\fancyhead[LO]{\bfseries 2018-2019 BD PLS/SQL\rightmark}
%\fancyhead[CO]{\slshape APF}
\fancyhead[RO]{\bfseries ~\leftmark }
%% %\fancyfoot{}
% \fancyfoot[LE,RO]{}
\fancyfoot[CO,CE]{}%\slshape\thepage/\pageref{LastPage}}
%% %\fancyfoot[LO,RE]{\small\slshape \ddmmyyyydate version du \today}
}
% \pagestyle{fancy}
\usepackage{amsmath}
\usepackage{amsthm}
\theoremstyle{definition}
\newtheorem{exercice}{Exercice}
\pagestyle{monstyle}
\usepackage{amsmath}
\usepackage{amsthm}
\newcommand{\code}[1]{\texttt{#1}}
\newcommand{\proc}{Pro$^{*}$C}
\begin{document}
\begin{center}
TP 5
\end{center}
\paragraph{Objectifs du TP :} : mettre en œuvre le langage \proc{} pour
gérer linsertion, la modification et la suppression de valeurs dans
une table.
\paragraph{Compte rendu :} Pour chaque question, donner le code du
programme, létat de la base (pour les tables concernées) avant et
après exécution du programme si une mise à jour a été effectuée et si
possible une copie de lécran au cours de lexécution.
%% \begin{SaveVerbatim}{VerbEnv}
%% Catégorie : numéro libellé
%% Num. véhic. Immat. Couleur Modèle
%% XXXXX XX-9999-XX X...X X...X
%% XXXXX XX-9999-XX X...X X...X
%% XXXXX XX-9999-XX X...X X...X
%% \end{SaveVerbatim}
\begin{exercice}
\'Ecrire le programme \proc{} (\code{saisieClient.pc}) permettant de
faire la saisie dun client dans la table
\code{Tclient2019}. Vérifiez sous sqlplus que linsertion est
correcte.
%% \begin{center}
%% \fbox{\BUseVerbatim{VerbEnv}}
%% \end{center}
\end{exercice}
\begin{exercice} Modifiez le programme précédent pour
développer un nouveau programme : \code{modifClient.pc} qui permet
de modifier des informations enregistrées sur un client. Vérifiez
sous sqlplus que la ou les modifications souhaitées sont faites.
\end{exercice}
\begin{exercice}
Modifiez le programme précédent pour développer un nouveau programme
: \code{supprClient.pc} qui permet la suppression dun client
existant en informant lutilisateur que la suppression provoquera la
suppression de X locations en cours (sil en existe) et Y locations
retournées (sil en existe). Faites en sorte de tester les
différents cas, vous pouvez pour cela faire des insertions ou des
modifications sous sqlplus directement (noubliez pas de faire
commit work !).
\end{exercice}
\end{document}

@ -0,0 +1,788 @@
/*
* Pro*C
* TP6 - Exercice 1
*
* Auteur : Damien NGUYEN
* Groupe : 3
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
EXEC SQL INCLUDE SQLCA.H;
EXEC SQL INCLUDE SQLDA.H;
EXEC SQL INCLUDE ORACA.H;
#define CLEAR system("clear")
/********** Constantes **********/
#define SQL_COMMIT 1
#define STOP 1
#define CONTINUE 0
#define SQL_ROLLBACK 0
#define SQL_SUCCESS 0
#define NOT_FOUND 1403
/********** Liste des fonctions **********/
void connexion(void);
void erreur_sql(int arret);
void deconnexion(int validation);
void enregistrer(void);
void modifier(void);
void supprimer(void);
void toutAfficher(void);
void afficherLocataires(void);
void afficherEnCours(void);
void enregistrerBidon(void);
void modifierTousLesNumerosDepartement(void);
void afficherCertainNombreDImmeubles(void);
void mettreFinLocationNULL(void);
void selectSansINTO(void);
void afficherPaquetsDeCinq (void);
/*
* Fonction de connexion à Oracle.
*
* Les identifiants sont rentrés en dur pour ne pas avoir à les retaper
* à la main à chaque test, mais dans l'idéal, on demande à l'utilisateur
* de les rentrer et on concatène les identifiants à uid.arr.
*/
void connexion(void) {
VARCHAR uid[50];
char identifiants[30] = "danguyen1/danguyen1@kirov";
printf("Connexion avec les identifiants suivants : %s .\n", identifiants);
strcpy(uid.arr, identifiants);
uid.len = strlen(uid.arr);
EXEC SQL CONNECT :uid;
if (sqlca.sqlcode == SQL_SUCCESS) {
printf("Connexion réussie avec succès !\n\n");
}
else {
printf("Connexion échouée !\n\n");
exit(EXIT_FAILURE);
}
}
/*
* Fonction qui affiche les code et message d'erreur SQL.
*
* Paramètres :
* arret STOP(1) pour quitter, n'importe quoi pour continuer
*/
void erreur_sql(int arret) {
printf("Code d'erreur : %d.\n", sqlca.sqlcode);
printf("Message erreur : %.*s.\n", sqlca.sqlerrm.sqlerrml, sqlca.sqlerrm.sqlerrmc);
if (arret == STOP) {
deconnexion(SQL_ROLLBACK);
exit(EXIT_FAILURE);
}
}
/*
* Fonction de déconnexion.
*
* Paramètres :
* validation SQL_COMMIT(1) pour COMMIT, n'importe quoi pour ROLLBACK
*/
void deconnexion(int validation) {
if (validation == SQL_COMMIT) {
EXEC SQL COMMIT WORK RELEASE;
}
else {
EXEC SQL ROLLBACK WORK RELEASE;
}
printf("Déconnexion réussie, travail %s.\n", validation == SQL_COMMIT ? "enregistré" : "annulé");
}
/*
* Fonction d'enregistrement d'un nouvel immeuble.
*/
void enregistrer(void) {
char deptimm[3], noimm[5];
VARCHAR adrimm[81];
printf("Saisir le numéro d'immeuble : ");
scanf("%s%*c", noimm);
printf("Saisir la nouvelle adresse de l'immeuble : ");
fgets(adrimm.arr, sizeof (adrimm.arr), stdin);
if (adrimm.arr[strlen(adrimm.arr) - 1] == '\n') {
adrimm.arr[strlen(adrimm.arr) - 1] = '\0';
}
adrimm.len = strlen(adrimm.arr);
printf("Saisir le nouveau numéro de département : ");
scanf("%s%*c", deptimm);
EXEC SQL
INSERT INTO TIMM2018
VALUES(:noimm, :adrimm, :deptimm);
if (sqlca.sqlcode < SQL_SUCCESS) {
erreur_sql(STOP);
}
EXEC SQL COMMIT;
if (sqlca.sqlcode < SQL_SUCCESS) {
erreur_sql(STOP);
}
printf("Enregistré avec succès.\n");
}
/*
* Fonction de modification d'un immeuble existant.
* Techniquement, il est uniquement possible de changer l'adresse
* et le département.
*/
void modifier(void) {
char deptimm[3], noimm[5];
VARCHAR adrimm[80];
printf("Saisir le numéro d'immeuble : ");
scanf("%s%*c", noimm);
printf("Saisir la nouvelle adresse de l'immeuble : ");
fgets(adrimm.arr, sizeof (adrimm.arr), stdin);
if (adrimm.arr[strlen(adrimm.arr) - 1] == '\n') {
adrimm.arr[strlen(adrimm.arr) - 1] = '\0';
}
adrimm.len = strlen(adrimm.arr);
printf("Saisir le nouveau numéro de département : ");
scanf("%s%*c", deptimm);
EXEC SQL
UPDATE TIMM2018
SET ADRIMM = :adrimm, DEPTIMM = :deptimm
WHERE NOIMM = :noimm;
if (sqlca.sqlcode < SQL_SUCCESS) {
erreur_sql(STOP);
}
EXEC SQL COMMIT;
if (sqlca.sqlcode < SQL_SUCCESS) {
erreur_sql(STOP);
}
printf("Modifié avec succès.\n");
}
/*
* Fonction de suppression d'un immeuble existant.
* On supprime toutes les clés étrangères des autres tables avant.
*/
void supprimer(void) {
char noimm[5];
printf("Saisir le numéro d'immeuble : ");
scanf("%s%*c", noimm);
EXEC SQL
DELETE FROM TLOCATION2018
WHERE REFLOG IN (
SELECT REFLOG
FROM TLOGT2018
WHERE NOIMM = :noimm
);
if (sqlca.sqlcode < SQL_SUCCESS) {
erreur_sql(STOP);
}
EXEC SQL
DELETE FROM TLOGT2018
WHERE NOIMM = :noimm;
if (sqlca.sqlcode < SQL_SUCCESS) {
erreur_sql(STOP);
}
EXEC SQL
DELETE FROM TIMM2018
WHERE NOIMM = :noimm;
if (sqlca.sqlcode < SQL_SUCCESS) {
erreur_sql(STOP);
}
EXEC SQL COMMIT;
if (sqlca.sqlcode < SQL_SUCCESS) {
erreur_sql(STOP);
}
printf("Supprimé avec succès.\n");
}
/*
* Fonction qui affiche tous les logemens gérés par l'agence.
*/
void toutAfficher(void) {
char deptimm[5], reflog[5];
int cpt = 1, superf;
float loyer;
VARCHAR adrimm[81];
EXEC SQL
DECLARE clog CURSOR FOR
SELECT DEPTIMM, ADRIMM, REFLOG, SUPERF, LOYER
FROM TIMM2018 i, TLOGT2018 l
WHERE i.NOIMM = l.NOIMM
ORDER BY DEPTIMM, ADRIMM ASC;
if (sqlca.sqlcode < SQL_SUCCESS) {
erreur_sql(STOP);
}
EXEC SQL
OPEN clog;
if (sqlca.sqlcode < SQL_SUCCESS) {
erreur_sql(STOP);
}
EXEC SQL
FETCH clog INTO :deptimm, :adrimm, :reflog, :superf, :loyer;
if (sqlca.sqlcode < SQL_SUCCESS) {
erreur_sql(STOP);
}
if (sqlca.sqlcode == NOT_FOUND) {
printf("Aucun logement trouvé !\n");
}
while (sqlca.sqlcode != NOT_FOUND) {
printf("----- Logement %d -----\n", cpt);
printf("Département : %s\n", deptimm);
printf("Adresse : %.*s\n", adrimm.len, adrimm.arr);
printf("Référence logement : %s\n", reflog);
printf("Superficie : %d\n", superf);
printf("Loyer : %.2f euros/mois\n\n", loyer);
EXEC SQL
FETCH clog INTO :deptimm, :adrimm, :reflog, :superf, :loyer;
if (sqlca.sqlcode < SQL_SUCCESS) {
erreur_sql(STOP);
}
++cpt;
}
EXEC SQL CLOSE clog;
if (sqlca.sqlcode < SQL_SUCCESS) {
erreur_sql(STOP);
}
}
/*
* Fonction qui affiche les clients louant ou ayant loué un logement saisi.
*/
void afficherLocataires(void) {
char reflog[5], nocli[20][7], finloc[20][11];
int i;
short indicateur[20];
VARCHAR nomcli[20][21];
printf("Saisir le numéro de logement voulu : ");
scanf("%s%*c", reflog);
EXEC SQL
SELECT NOCLI, NOMCLI, FINLOC
INTO :nocli, :nomcli, :finloc:indicateur
FROM TLOCATION2018 l, TCLIENT2018 c
WHERE REFLOG = :reflog
AND l.NOLOC = c.NOCLI;
if (sqlca.sqlcode < SQL_SUCCESS) {
erreur_sql(STOP);
}
if (sqlca.sqlerrd[2] > 0) {
for (i = 0; i < sqlca.sqlerrd[2]; ++i) {
printf("Logement %s:\t%.*s(%s)\t=>\t%s\n", reflog, nomcli[i].len, nomcli[i].arr, nocli[i], indicateur[i] == -1 ? "occupé" : "libre");
}
}
else {
printf("Aucun locataire ou ancien locataire.\n");
}
}
/*
* Focntion qui affiche les logements en cours.
*/
void afficherEnCours(void) {
char deptimm[3], noprop[7], noloc[7];
int cpt = 1;
VARCHAR adrimm[81], nomprop[21], nomloc[21];
EXEC SQL
DECLARE cloc CURSOR FOR
SELECT ADRIMM, DEPTIMM, NOPROP, NOLOC
FROM TIMM2018 i, TLOGT2018 l
WHERE NOLOC IS NOT NULL
AND i.NOIMM = l.NOIMM;
if (sqlca.sqlcode < SQL_SUCCESS) {
erreur_sql(STOP);
}
EXEC SQL
OPEN cloc;
EXEC SQL FETCH cloc INTO :adrimm, :deptimm, :noprop, :noloc;
if (sqlca.sqlcode < SQL_SUCCESS) {
erreur_sql(STOP);
}
if (sqlca.sqlcode == NOT_FOUND) {
printf("Aucun logement trouvé !\n");
}
while (sqlca.sqlcode != NOT_FOUND) {
EXEC SQL
SELECT NOMCLI
INTO :nomprop
FROM TCLIENT2018
WHERE NOCLI = :noprop;
EXEC SQL
SELECT NOMCLI
INTO :nomloc
FROM TCLIENT2018
WHERE NOCLI = :noloc;
printf("----- Logement %d -----\n", cpt);
printf("Propriétaire : %.*s\n", nomprop.len, nomprop.arr);
printf("Locataire : %.*s\n", nomprop.len, nomprop.arr);
printf("Adresse : %.*s (%s)\n", adrimm.len, adrimm.arr, deptimm);
EXEC SQL FETCH cloc INTO :adrimm, :deptimm, :noprop, :noloc;
if (sqlca.sqlcode < SQL_SUCCESS) {
erreur_sql(STOP);
}
++cpt;
}
EXEC SQL CLOSE cloc;
if (sqlca.sqlcode < SQL_SUCCESS) {
erreur_sql(STOP);
}
}
/*
* Fonction qui enregistre plein de lignes bidons.
*/
void enregistrerBidon(void) {
char buffer[5], deptimm[3], noimm[5];
int i;
VARCHAR adrimm[81];
strcpy(adrimm.arr, "Adresse bidon");
adrimm.len = strlen(adrimm.arr);
strcpy(deptimm, "12");
for (i = 4; i < 50; ++i) {
if (i < 10) {
strcpy(noimm, "I00");
}
else {
strcpy(noimm, "I0");
}
/* Stocke l'entier dans buffer pour pouvoir le concaténer à noimm. */
snprintf(buffer, sizeof buffer, "%d", i);
strcat(noimm, buffer);
EXEC SQL
INSERT INTO TIMM2018
VALUES(:noimm, :adrimm, :deptimm);
if (sqlca.sqlcode < SQL_SUCCESS) {
erreur_sql(STOP);
}
EXEC SQL COMMIT;
if (sqlca.sqlcode < SQL_SUCCESS) {
erreur_sql(STOP);
}
printf("I00%d nregistré avec succès.\n", i);
}
}
/*
* Fonction qui modifie la totalité des numéros département à 01.
*/
void modifierTousLesNumerosDepartement(void) {
EXEC SQL BEGIN DECLARE SECTION;
int nbMax;
EXEC SQL END DECLARE SECTION;
nbMax = 9;
EXEC SQL
FOR :nbMax
UPDATE TIMM2018
SET deptimm = '01';
if (sqlca.sqlcode < SQL_SUCCESS) {
erreur_sql(STOP);
}
printf("%d lignes ont été mises à jour.\n", nbMax);
}
/*
* Fonction qui affiche un certain nombre de lignes avec un curseur.
*/
void afficherCertainNombreDImmeubles(void) {
int i;
EXEC SQL BEGIN DECLARE SECTION;
int nbLignes;
char noimm[10][5], deptimm[10][3];
VARCHAR adrimm[10][81];
EXEC SQL END DECLARE SECTION;
printf("Combien de lignes voulez-vous afficher (1-9) ? ");
scanf("%d%*c", &nbLignes);
EXEC SQL
DECLARE cursor_imm CURSOR FOR
SELECT noimm, adrimm, deptimm
FROM TIMM2018
ORDER BY NOIMM ASC;
if (sqlca.sqlcode < SQL_SUCCESS) {
erreur_sql(STOP);
}
EXEC SQL OPEN cursor_imm;
if (sqlca.sqlcode < SQL_SUCCESS) {
erreur_sql(STOP);
}
EXEC SQL FOR :nbLignes
FETCH cursor_imm INTO :noimm, :adrimm, :deptimm;
if (sqlca.sqlcode < SQL_SUCCESS) {
erreur_sql(STOP);
}
printf("Liste des %d premiers immeubles:\n", nbLignes);
for (i = 0; i < nbLignes; ++i) {
printf("\t%s : %.*s (%s)\n", noimm[i], adrimm[i].len, adrimm[i].arr, deptimm[i]);
}
EXEC SQL CLOSE cursor_imm;
if (sqlca.sqlcode < SQL_SUCCESS) {
erreur_sql(STOP);
}
}
/*
* Fonction qui met la fin de location à NULL pour une location
* saisie.
*/
void mettreFinLocationNULL(void) {
int i;
char reflog[5], finloc[11];
short indicateur, newIndicateur = -1;
printf("Saisir la référence logement : ");
scanf("%s%*c", reflog);
EXEC SQL
UPDATE TLOCATION2018
SET finloc = :finloc INDICATOR :newIndicateur // mot clé INDICATOR pas obligatoire
WHERE reflog = :reflog;
if (sqlca.sqlcode < SQL_SUCCESS) {
erreur_sql(STOP);
}
EXEC SQL COMMIT;
if (sqlca.sqlcode < SQL_SUCCESS) {
erreur_sql(STOP);
}
printf("La ligne a été modifiée.\n");
}
/*
* Fonction qui permet de voir que SELECT sans INTO compile, n'affiche
* rien, et donc ne sert pas à grand chose.
*/
void selectSansINTO(void) {
EXEC SQL
SELECT COUNT(*) FROM TLOCATION2018;
if (sqlca.sqlcode < SQL_SUCCESS) {
erreur_sql(STOP);
}
printf("Succès !\n");
}
/*
* Affiche les immeubles par paquets de 5 à chaque fois qu'on appuie sur
* entrée.
*/
void afficherPaquetsDeCinq (void) {
int i;
EXEC SQL BEGIN DECLARE SECTION;
int nbLignes = 50;
char noimm[50][5], deptimm[50][3];
VARCHAR adrimm[50][81];
EXEC SQL END DECLARE SECTION;
EXEC SQL
DECLARE c_imm CURSOR FOR
SELECT noimm, adrimm, deptimm
FROM TIMM2018
ORDER BY NOIMM ASC;
if (sqlca.sqlcode < SQL_SUCCESS) {
erreur_sql(STOP);
}
EXEC SQL OPEN c_imm;
if (sqlca.sqlcode < SQL_SUCCESS) {
erreur_sql(STOP);
}
nbLignes = 50;
EXEC SQL FOR :nbLignes
FETCH c_imm INTO :noimm, :adrimm, :deptimm;
if (sqlca.sqlcode < SQL_SUCCESS) {
erreur_sql(STOP);
}
for (i = 1; i < nbLignes; ++i) {
printf("\t%s : %.*s (%s)\n", noimm[i], adrimm[i].len, adrimm[i].arr, deptimm[i]);
if ((i % 5) == 0) {
printf("\nEntrée pour les 5 prochains.\n");
scanf("%*c");
}
}
EXEC SQL CLOSE c_imm;
if (sqlca.sqlcode < SQL_SUCCESS) {
erreur_sql(STOP);
}
}
/*
* Affiche un menu avec différents choix possibles.
*
* Retourne :
* le choix qui va être utilisé dans le switch du main
*/
int menu(void) {
int choix;
printf("Vous voulez :\n");
printf("\t1 - saisir un nouvel immeuble ?\n");
printf("\t2 - modifier un immeuble existant ?\n");
printf("\t3 - supprimer un immeuble existant ?\n");
printf("\t4 - afficher tous les logements ?\n");
printf("\t5 - affichier les disponibilités selon le logement\n");
printf("\t6 - afficher les logements en cours de location\n");
printf("\t7 - enregistrer des immeubles bidons\n");
printf("\t8 - mettre tous les numéros département à une valeur donnée\n");
printf("\t9 - afficher un certain nombre d'immeubles avec un curseur\n");
printf("\t10 - mettre une fin de location à NULL\n");
printf("\t11 - tester le SELECT sans INTO qui n'affiche rien\n");
printf("\t12 - afficher les immeubles par paquets de 5\n");
printf("Choix : ");
scanf("%d%*c", &choix);
return choix;
}
/*
* Fonction principale.
*
* Paramètres :
* argc Le nombre d'arguments
* argv Le tableau d'arguments
*
* Retourne :
* le code de retour défini dans stdlib.h
* (EXIT_SUCCESS = 0)
*/
int main(int argc, char const *argv[]) {
int choix, validation;
CLEAR;
connexion();
choix = menu();
do {
switch (choix) {
case 1:
enregistrer();
break;
case 2:
modifier();
break;
case 3:
supprimer();
break;
case 4:
toutAfficher();
break;
case 5:
afficherLocataires();
break;
case 6:
afficherEnCours();
break;
case 7:
enregistrerBidon();
break;
case 8:
modifierTousLesNumerosDepartement();
break;
case 9:
afficherCertainNombreDImmeubles();
break;
case 10:
mettreFinLocationNULL();
break;
case 11:
selectSansINTO();
break;
case 12:
afficherPaquetsDeCinq();
break;
default:
printf("Le choix est incorrect, recommencez : ");
scanf("%d%*c", &choix);
CLEAR;
break;
}
} while (choix < 1 || choix > 12);
printf("Enregistrer le travail ? (1 = oui, * = non)\n");
scanf("%d%*c", &validation);
deconnexion(validation);
return EXIT_SUCCESS;
}
/****************************************************************************************************
Cas où on affiche tout
****************************************************************************************************
danguyen1@iutclinfa1910:~/S2/Database/pr4$ ./ex4
Connexion avec les identifiants suivants : danguyen1/danguyen1@kirov .
Connexion réussie avec succès !
Vous voulez :
1 - saisir un nouvel immeuble ?
2 - modifier un immeuble existant ?
3 - supprimer un immeuble existant ?
4 - afficher tous les logements ?
5 - affichier les disponibilités selon le logement
6 - afficher les logements en cours de location
Choix : 4
----- Logement 1 -----
Département : 03
Adresse : Bd de Courtais Montlucon
Référence logement : L003
Superficie : 60
Loyer : 320.00 euros/mois
----- Logement 2 -----
Département : 63
Adresse : Bd Lafayette Clermont Fd
Référence logement : L002
Superficie : 60
Loyer : 400.00 euros/mois
----- Logement 3 -----
Département : 63
Adresse : Bd Lafayette Clermont Fd
Référence logement : L005
Superficie : 90
Loyer : 470.00 euros/mois
----- Logement 4 -----
Département : 63
Adresse : Bd Lafayette Clermont Fd
Référence logement : L004
Superficie : 100
Loyer : 700.00 euros/mois
----- Logement 5 -----
Département : 63
Adresse : Bd Lafayette Clermont Fd
Référence logement : L001
Superficie : 90
Loyer : 450.00 euros/mois
Enregistrer le travail ? (1 = oui, * = non)
2
Déconnexion réussie, travail annulé.
****************************************************************************************************/
/****************************************************************************************************
Cas où on affiche les disponibilités selon le logement saisi
****************************************************************************************************
danguyen1@iutclinfa1910:~/S2/Database/pr4$ ./ex4
Connexion avec les identifiants suivants : danguyen1/danguyen1@kirov .
Connexion réussie avec succès !
Vous voulez :
1 - saisir un nouvel immeuble ?
2 - modifier un immeuble existant ?
3 - supprimer un immeuble existant ?
4 - afficher tous les logements ?
5 - affichier les disponibilités selon le logement
6 - afficher les logements en cours de location
Choix : 5
Saisir le numéro de logement voulu : L002
Logement L002: Martin(CL0002) => libre
Logement L002: Durand(CL0004) => libre
Logement L002: Martin(CL0002) => libre
Logement L002: Martin(CL0002) => occupé
Enregistrer le travail ? (1 = oui, * = non)
2
Déconnexion réussie, travail annulé.
****************************************************************************************************/
/****************************************************************************************************
Cas où on affiche les disponibilités selon le logement saisi et où il n'y a pas de locataire
****************************************************************************************************
danguyen1@iutclinfa1910:~/S2/Database/pr4$ ./ex4
Connexion avec les identifiants suivants : danguyen1/danguyen1@kirov .
Connexion réussie avec succès !
Vous voulez :
1 - saisir un nouvel immeuble ?
2 - modifier un immeuble existant ?
3 - supprimer un immeuble existant ?
4 - afficher tous les logements ?
5 - affichier les disponibilités selon le logement
6 - afficher les logements en cours de location
Choix : 5
Saisir le numéro de logement voulu : L001
Aucun locataire ou ancien locataire.
Enregistrer le travail ? (1 = oui, * = non)
2
Déconnexion réussie, travail annulé.
****************************************************************************************************/
/****************************************************************************************************
Cas où on affiche l'ensemble des locations en cours
****************************************************************************************************
danguyen1@iutclinfa1910:~/S2/Database/pr4$ ./ex4
Connexion avec les identifiants suivants : danguyen1/danguyen1@kirov .
Connexion réussie avec succès !
Vous voulez :
1 - saisir un nouvel immeuble ?
2 - modifier un immeuble existant ?
3 - supprimer un immeuble existant ?
4 - afficher tous les logements ?
5 - affichier les disponibilités selon le logement
6 - afficher les logements en cours de location
Choix : 6
----- Logement 1 -----
Propriétaire : Dupond
Locataire : Dupond
Adresse : Bd Lafayette Clermont Fd (63)
----- Logement 2 -----
Propriétaire : Thibaut
Locataire : Thibaut
Adresse : Bd de Courtais Montlucon (03)
----- Logement 3 -----
Propriétaire : Thibaut
Locataire : Thibaut
Adresse : Bd Lafayette Clermont Fd (63)
Enregistrer le travail ? (1 = oui, * = non)
2
Déconnexion réussie, travail annulé.
****************************************************************************************************/

@ -0,0 +1,116 @@
\documentclass[a4paper,11pt]{article}
\usepackage[utf8x]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[french]{babel}
\usepackage[a4paper,hmargin=20mm,vmargin=30mm]{geometry}%\usepackage{fullpage}
\usepackage{url}
\usepackage{comment}
\usepackage{fancyhdr}% fancy header
%\usepackage{times}
\usepackage{fancyvrb}
\fancypagestyle{monstyle}{
%\fancyhead{}
\renewcommand{\headrulewidth}{1pt}
%% %\renewcommand{\footrulewidth}{0.4pt}
% \fancyhead[LE]{\slshape \thepage/ \pageref{LastPage}}
%% \fancyhead[RO]{\slshape \thepage/ \pageref{LastPage}}
%\fancyhf{}
%\fancyhead[LE]{\slshape LE}
%\fancyhead[CE]{\slshape CE}
%\fancyhead[RE]{\slshape RE}
\fancyhead[LO]{\bfseries 2018-2019 BD \proc{}\rightmark}
%\fancyhead[CO]{\slshape APF}
\fancyhead[RO]{\bfseries ~\leftmark }
%% %\fancyfoot{}
% \fancyfoot[LE,RO]{}
\fancyfoot[CO,CE]{}%\slshape\thepage/\pageref{LastPage}}
%% %\fancyfoot[LO,RE]{\small\slshape \ddmmyyyydate version du \today}
}
% \pagestyle{fancy}
\usepackage{amsmath}
\usepackage{amsthm}
\theoremstyle{definition}
\newtheorem{exercice}{Exercice}
\pagestyle{monstyle}
\usepackage{amsmath}
\usepackage{amsthm}
\newcommand{\code}[1]{\texttt{#1}}
\newcommand{\proc}{Pro$^{*}$C}
\begin{document}
\begin{center}
TP 6
\end{center}
\paragraph{Objectifs du TP :} mettre en œuvre le langage PRO*C, utilisation de curseur, de tableau de données.
\paragraph{Compte rendu :} Pour chaque question, donner le code du
programme, létat de la base (pour les tables concernées) avant et
après exécution du programme si une mise à jour a été effectuée et si
possible une copie de lécran au cours de lexécution.
%% \begin{SaveVerbatim}{VerbEnv}
%% Catégorie : numéro libellé
%% Num. véhic. Immat. Couleur Modèle
%% XXXXX XX-9999-XX X...X X...X
%% XXXXX XX-9999-XX X...X X...X
%% XXXXX XX-9999-XX X...X X...X
%% \end{SaveVerbatim}
\begin{exercice}
\begin{enumerate}
\item Récupérez le code réalisé lors du TP5, et séparez le en
plusieurs fonctions.
\item Réalisez un menu permettant dappeler ces fonctions.
\end{enumerate}
%% \begin{center}
%% \fbox{\BUseVerbatim{VerbEnv}}
%% \end{center}
\end{exercice}
\begin{exercice}
\begin{enumerate}
\item Ajoutez au menu une fonction qui permet dafficher lensemble
des clients gérés par lagence. Utilisez un curseur.
\item Ajoutez au menu une fonction qui permet dafficher lensemble
des locations retournées (immatriculation du véhicule, date de début
de location, date de retour) pour un client dont le n° aura été
préalablement saisi. Nutilisez pas de curseur mais un tableau
indicé. Sachant que le nombre de locations faites par un client
nexcède pas 50.
\item Ajoutez au menu une fonction qui permet dafficher lensemble
des clients ayant une location en cours. Indiquez le véhicule
concerné (immatriculation, modèle, couleur, kilométrage), sa
catégorie (libellé) ainsi que les informations concernant sa période
de location (date de début de location, date de retour prévue).
\end{enumerate}
\end{exercice}
\end{document}

@ -0,0 +1,79 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define size_t long
EXEC SQL INCLUDE SQLCA.H;
EXEC SQL INCLUDE SQLDA.H;
EXEC SQL INCLUDE ORACA.H;
void connexion()
{ VARCHAR uid[50];
char login[20];
char passwd[20];
printf("\n");
strcpy(uid.arr,"mfservaj");
strcat(uid.arr,"/");
strcat(uid.arr,"marif004");
strcat(uid.arr,"@kirov");
uid.len=strlen(uid.arr);
EXEC SQL CONNECT :uid;
if (sqlca.sqlcode==0)
printf(" Connexion réussie avec succès.\n\n");
else
{
printf ("Problème à la connexion.\n\n");
exit(1);
}
}
void deconnexion(int validation)
{
if (validation == 1)
{
EXEC SQL COMMIT WORK RELEASE;
}
else
{
EXEC SQL ROLLBACK WORK RELEASE;
}
printf("\nDéconnexion sans problème.\n");
}
void sql_error(char *msg)
{
char err_msg[128];
long buf_len, msg_len;
EXEC SQL WHENEVER SQLERROR CONTINUE;
printf("%s\n", msg);
buf_len = sizeof (err_msg);
sqlglm(err_msg, &buf_len, &msg_len);
if (msg_len > buf_len)
msg_len = buf_len;
printf("%.*s\n", msg_len, err_msg);
deconnexion(0);
exit(1);
}
void traitErreur(char *msg)
{
EXEC SQL WHENEVER SQLERROR CONTINUE;
printf("%s\n", msg);
deconnexion(0);
exit(1);
}
int main(int argc, char** argv)
{
EXEC SQL WHENEVER SQLERROR DO sql_error("Oracle error\n");
printf("\n Appel de la fonction connexion");
connexion();
printf("\n Appel de la fonction deconnexion");
deconnexion(1);
return(0);
}

@ -0,0 +1,90 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define size_t long
EXEC SQL INCLUDE SQLCA.H;
EXEC SQL INCLUDE SQLDA.H;
EXEC SQL INCLUDE ORACA.H;
void connexion()
{ VARCHAR uid[50];
char login[20];
char passwd[20];
printf("\n");
strcpy(uid.arr,"mfservaj");
strcat(uid.arr,"/");
strcat(uid.arr,"marif004");
strcat(uid.arr,"@kirov");
uid.len=strlen(uid.arr);
EXEC SQL CONNECT :uid;
if (sqlca.sqlcode==0)
printf(" Connexion réussie avec succès.\n\n");
else
{
printf ("Problème à la connexion.\n\n");
exit(1);
}
}
void deconnexion(int validation)
{
if (validation == 1)
{
EXEC SQL COMMIT WORK RELEASE;
}
else
{
EXEC SQL ROLLBACK WORK RELEASE;
}
printf("\nDéconnexion sans problème.\n");
}
void sql_error(char *msg)
{
char err_msg[128];
long buf_len, msg_len;
EXEC SQL WHENEVER SQLERROR CONTINUE;
printf("%s\n", msg);
buf_len = sizeof (err_msg);
sqlglm(err_msg, &buf_len, &msg_len);
if (msg_len > buf_len)
msg_len = buf_len;
printf("%.*s\n", msg_len, err_msg);
deconnexion(0);
exit(1);
}
void traitErreur(char *msg)
{
EXEC SQL WHENEVER SQLERROR CONTINUE;
printf("%s\n", msg);
deconnexion(0);
exit(1);
}
int main(int argc, char** argv)
{
EXEC SQL WHENEVER SQLERROR DO sql_error("Oracle error\n");
printf("\n Appel de la fonction connexion");
connexion();
printf("\n Appel de la fonction deconnexion");
EXEC SQL WHENEVER SQLERROR DO sql_error("Oracle error\n");
EXEC SQL CREATE TABLE tessai1(
id char(3) constraint tessai1_CP primary key,
num number constraint tessai1_num check (num between 100 and 199),
unCar char(1) constraint tessai1_car check (unCar in('A','B', 'C')),
chaine varchar2(10) constraint tessai1_chaine check (chaine like 'E%'),
uneDate date constraint tessai1_date check(to_char(uneDate, 'yyyy') = '2015')
);
EXEC SQL COMMIT;
deconnexion(1);
return(0);
}

@ -0,0 +1,90 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define size_t long
EXEC SQL INCLUDE SQLCA.H;
EXEC SQL INCLUDE SQLDA.H;
EXEC SQL INCLUDE ORACA.H;
void connexion()
{ VARCHAR uid[50];
char login[20];
char passwd[20];
printf("\n");
strcpy(uid.arr,"mfservaj");
strcat(uid.arr,"/");
strcat(uid.arr,"marif044");
strcat(uid.arr,"@kirov");
uid.len=strlen(uid.arr);
EXEC SQL CONNECT :uid;
if (sqlca.sqlcode==0)
printf(" Connexion réussie avec succès.\n\n");
else
{
printf ("Problème à la connexion.\n\n");
exit(1);
}
}
void deconnexion(int validation)
{
if (validation == 1)
{
EXEC SQL COMMIT WORK RELEASE;
}
else
{
EXEC SQL ROLLBACK WORK RELEASE;
}
printf("\nDéconnexion sans problème.\n");
}
void sql_error(char *msg)
{
char err_msg[128];
long buf_len, msg_len;
EXEC SQL WHENEVER SQLERROR CONTINUE;
printf("%s\n", msg);
buf_len = sizeof (err_msg);
sqlglm(err_msg, &buf_len, &msg_len);
if (msg_len > buf_len)
msg_len = buf_len;
printf("%.*s\n", msg_len, err_msg);
deconnexion(0);
exit(1);
}
void traitErreur(char *msg)
{
EXEC SQL WHENEVER SQLERROR CONTINUE;
printf("%s\n", msg);
deconnexion(0);
exit(1);
}
int main(int argc, char** argv)
{
EXEC SQL WHENEVER SQLERROR DO sql_error("Oracle error\n");
printf("\n Appel de la fonction connexion");
connexion();
printf("\n Appel de la fonction deconnexion");
EXEC SQL WHENEVER SQLERROR DO sql_error("Oracle error\n");
/*EXEC SQL INSERT INTO tessai1 VALUES ('T01', 100,'C','Essai', to_date('01/03/2015', 'dd/mm/yyyy'));*/
/*EXEC SQL INSERT INTO tessai1 VALUES ('T02', 200,'C','Essai', to_date('01/03/2015', 'dd/mm/yyyy'));*/
/*EXEC SQL INSERT INTO tessai1 VALUES ('T03', 100,'D','Essai', to_date('01/03/2015', 'dd/mm/yyyy'));*/
/*EXEC SQL INSERT INTO tessai1 VALUES ('T04', 100,'C','Adam', to_date('01/03/2015', 'dd/mm/yyyy'));*/
/*EXEC SQL INSERT INTO tessai1 VALUES ('T05', 100,'C','Essai', to_date('01/03/2014', 'dd/mm/yyyy'));*/
/*EXEC SQL INSERT INTO tessai1 VALUES ('T06', 180,'A','EveEtAdamEtLesEnfants', to_date('01/02/2015', 'dd/mm/yyyy'));*/
EXEC SQL INSERT INTO tessai1 VALUES ('T07', 180,'A','EveEtAdam', to_date('01/02/2015', 'dd/mm/yyyy'));
EXEC SQL COMMIT;
deconnexion(1);
return(0);
}

@ -0,0 +1,96 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define size_t long
EXEC SQL INCLUDE SQLCA.H;
EXEC SQL INCLUDE SQLDA.H;
EXEC SQL INCLUDE ORACA.H;
char vid[4];
int vnum;
char vunCar[2];
varchar vchaine[10];
varchar vuneDate[10];
void connexion()
{ VARCHAR uid[50];
char login[20];
char passwd[20];
printf("\n");
strcpy(uid.arr,"mfservaj");
strcat(uid.arr,"/");
strcat(uid.arr,"marif044");
strcat(uid.arr,"@kirov");
uid.len=strlen(uid.arr);
EXEC SQL CONNECT :uid;
if (sqlca.sqlcode==0)
printf(" Connexion réussie avec succès.\n\n");
else
{
printf ("Problème à la connexion.\n\n");
exit(1);
}
}
void deconnexion(int validation)
{
if (validation == 1)
{
EXEC SQL COMMIT WORK RELEASE;
}
else
{
EXEC SQL ROLLBACK WORK RELEASE;
}
printf("\nDéconnexion sans problème.\n");
}
void sql_error(char *msg)
{
char err_msg[128];
long buf_len, msg_len;
EXEC SQL WHENEVER SQLERROR CONTINUE;
printf("%s\n", msg);
buf_len = sizeof (err_msg);
sqlglm(err_msg, &buf_len, &msg_len);
if (msg_len > buf_len)
msg_len = buf_len;
printf("%.*s\n", msg_len, err_msg);
deconnexion(0);
exit(1);
}
void traitErreur(char *msg)
{
EXEC SQL WHENEVER SQLERROR CONTINUE;
printf("%s\n", msg);
deconnexion(0);
exit(1);
}
int main(int argc, char** argv)
{
EXEC SQL WHENEVER SQLERROR DO sql_error("Oracle error\n");
printf("\n Appel de la fonction connexion");
connexion();
printf("\n Appel de la fonction deconnexion");
/*----------------------------------lecture----------------------------*/
EXEC SQL WHENEVER SQLERROR DO sql_error("Oracle error\n");
EXEC SQL SELECT id, num, unCar, chaine, uneDate INTO :vid, :vnum,:vunCar, :vchaine, :vuneDate FROM tessai1 where id='T01';
vchaine.len=strlen(vchaine.arr);
vid[3]='\0';
vunCar[1]='\0';
vuneDate.len=strlen(vuneDate.arr);
printf("\n\n%s %d %s %.*s %.*s\n",vid, vnum, vunCar, vchaine.len, vchaine.arr, vuneDate.len, vuneDate.arr);
deconnexion(1);
return(0);
}
Loading…
Cancel
Save