diff --git a/TP/TP1-sol.tex b/TP/TP1-sol.tex new file mode 100644 index 0000000..a2fe6ab --- /dev/null +++ b/TP/TP1-sol.tex @@ -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 d’une 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 l’ENT 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 d’un numéro de véhicule saisi au clavier, afficher l’immatriculation et le modèle correspondant ainsi que le nom du client si c’est un véhicule en cours de location. + +{\bf Cas d’erreur :} « 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 d’erreur :} +\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 d’un retour de location] + +Il est demander d'enregistrer le retour d’un véhicule. Donner la +procédure PL/SQL permettant l’enregistrement 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 n’est 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 /@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} diff --git a/TP/TP1.tex b/TP/TP1.tex new file mode 100644 index 0000000..621ea11 --- /dev/null +++ b/TP/TP1.tex @@ -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 d’une 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 l’ENT 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 d’un numéro de véhicule saisi au clavier, afficher l’immatriculation et le modèle correspondant ainsi que le nom du client si c’est un véhicule en cours de location. + +{\bf Cas d’erreur :} « 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 d’erreur :} +\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 d’un retour de location] + +Il est demander d'enregistrer le retour d’un véhicule. Donner la +procédure PL/SQL permettant l’enregistrement 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 n’est 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 /@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} diff --git a/TP/TP2-sol.tex b/TP/TP2-sol.tex new file mode 100644 index 0000000..a07edde --- /dev/null +++ b/TP/TP2-sol.tex @@ -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 d’une catégorie dont on saisit le numéro. +L’affichage se fera sous la forme : + +\begin{center} + \fbox{\BUseVerbatim{VerbEnv}} +\end{center} + +{\bf Cas d’erreur :} +\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 d’un 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 d’erreur n'est pas trait\'e dans cette question). + + + +{\bf Cas d’erreur :} +\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} diff --git a/TP/TP2.tex b/TP/TP2.tex new file mode 100644 index 0000000..bb4374c --- /dev/null +++ b/TP/TP2.tex @@ -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 d’une + catégorie dont le numéro est saisi. L’affichage se fera sous la + forme : + +\begin{center} + \fbox{\BUseVerbatim{VerbEnv}} +\end{center} + +{\bf Cas d’erreur :} +\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 d’un 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 d’erreur n'est pas trait\'e dans cette question). + + + +{\bf Cas d’erreur :} +\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} diff --git a/TP/TP3-sol.tex b/TP/TP3-sol.tex new file mode 100644 index 0000000..15d9b23 --- /dev/null +++ b/TP/TP3-sol.tex @@ -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 d’un 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 d’erreur :} +\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} diff --git a/TP/TP3.tex b/TP/TP3.tex new file mode 100644 index 0000000..6ce136a --- /dev/null +++ b/TP/TP3.tex @@ -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 d’un 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 d’erreur :} +\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} diff --git a/TP/TP4.tex b/TP/TP4.tex new file mode 100644 index 0000000..da2fd52 --- /dev/null +++ b/TP/TP4.tex @@ -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 d’accé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 l’extension \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 +l’exécutable. Tous les fichiers auront le même nom. Choisissez-le donc +bien pour vous assurer qu’il 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 l’exé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 + d’au 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 l’anné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} diff --git a/TP/TP5.tex b/TP/TP5.tex new file mode 100644 index 0000000..f7f1130 --- /dev/null +++ b/TP/TP5.tex @@ -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 l’insertion, 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 l’exé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 d’un client dans la table + \code{Tclient2019}. Vérifiez sous sqlplus que l’insertion 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 d’un client + existant en informant l’utilisateur que la suppression provoquera la + suppression de X locations en cours (s’il en existe) et Y locations + retournées (s’il en existe). Faites en sorte de tester les + différents cas, vous pouvez pour cela faire des insertions ou des + modifications sous sqlplus directement (n’oubliez pas de faire + commit work !). +\end{exercice} + +\end{document} diff --git a/TP/TP6-ND.pc b/TP/TP6-ND.pc new file mode 100644 index 0000000..5b99423 --- /dev/null +++ b/TP/TP6-ND.pc @@ -0,0 +1,788 @@ +/* + * Pro*C + * TP6 - Exercice 1 + * + * Auteur : Damien NGUYEN + * Groupe : 3 + */ + +#include +#include +#include + +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é. +****************************************************************************************************/ diff --git a/TP/TP6.tex b/TP/TP6.tex new file mode 100644 index 0000000..0a210e5 --- /dev/null +++ b/TP/TP6.tex @@ -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 l’exé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 d’appeler 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 d’afficher l’ensemble + des clients gérés par l’agence. Utilisez un curseur. +\item Ajoutez au menu une fonction qui permet d’afficher l’ensemble + 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. N’utilisez pas de curseur mais un tableau + indicé. Sachant que le nombre de locations faites par un client + n’excède pas 50. +\item Ajoutez au menu une fonction qui permet d’afficher l’ensemble + 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} diff --git a/TP/tp1Q1.pc b/TP/tp1Q1.pc new file mode 100755 index 0000000..f28618f --- /dev/null +++ b/TP/tp1Q1.pc @@ -0,0 +1,79 @@ +#include +#include +#include +#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); +} + + diff --git a/TP/tp1Q2.pc b/TP/tp1Q2.pc new file mode 100755 index 0000000..84efee8 --- /dev/null +++ b/TP/tp1Q2.pc @@ -0,0 +1,90 @@ +#include +#include +#include +#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); +} + + diff --git a/TP/tp1Q3.pc b/TP/tp1Q3.pc new file mode 100755 index 0000000..e9309e2 --- /dev/null +++ b/TP/tp1Q3.pc @@ -0,0 +1,90 @@ +#include +#include +#include +#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); +} + + diff --git a/TP/tp1Q4.pc b/TP/tp1Q4.pc new file mode 100755 index 0000000..0170702 --- /dev/null +++ b/TP/tp1Q4.pc @@ -0,0 +1,96 @@ +#include +#include +#include +#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); +} + +