|
|
\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{multirow}
|
|
|
\usepackage{slashbox}
|
|
|
|
|
|
\usepackage{color, colortbl}
|
|
|
\definecolor{Gray}{gray}{0.9}
|
|
|
\usepackage{adjustbox}
|
|
|
\usepackage{slashbox}
|
|
|
%\usepackage{times}
|
|
|
\usepackage{tikz,pgflibraryarrows,pgffor,pgflibrarysnakes}
|
|
|
\usetikzlibrary{decorations.pathreplacing}
|
|
|
|
|
|
\usepackage{pdfpages}
|
|
|
|
|
|
\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 2020-2021 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}}
|
|
|
|
|
|
\usepackage{boxedminipage}
|
|
|
\usepackage{setspace}
|
|
|
|
|
|
|
|
|
\newsavebox\svbx
|
|
|
\newif\ifcache
|
|
|
\long\def\cache#1{\ \newline
|
|
|
\setbox\svbx=\vbox{\leavevmode \newline \begin{spacing}{1}#1\end{spacing}}
|
|
|
\smallskip\par\noindent
|
|
|
\begin{boxedminipage}{\linewidth}
|
|
|
\ifcache
|
|
|
\leavevmode\hrule height 0pt\vskip \ht\svbx\hrule height 0pt
|
|
|
\else \unvbox\svbx
|
|
|
\fi
|
|
|
\end{boxedminipage}
|
|
|
\par\smallskip}
|
|
|
|
|
|
|
|
|
\cachefalse % version prof
|
|
|
%\cachetrue % version etudiant
|
|
|
|
|
|
|
|
|
|
|
|
\begin{document}
|
|
|
|
|
|
|
|
|
\section*{Rappels}
|
|
|
Les fonctions \code{connexion}, \code{deconnexion} et \code{sql\_error}
|
|
|
sont rappell\'ees ci-dessous. Elles ne sont pas \`a r\'e\'ecrire sur
|
|
|
vos copies, mais \`a utiliser dans les exercices si besoin.
|
|
|
|
|
|
\begin{verbatim}
|
|
|
void connexion()
|
|
|
{ VARCHAR uid[50];
|
|
|
char login[20];
|
|
|
char passwd[20];
|
|
|
printf("Donner votre login : ");
|
|
|
scanf("%s",login);
|
|
|
printf("\nDonnez votre mot de passe Oracle : ");
|
|
|
scanf("%s",passwd);
|
|
|
printf("\n");
|
|
|
strcpy(uid.arr,login);
|
|
|
strcat(uid.arr,"/");
|
|
|
strcat(uid.arr,passwd);
|
|
|
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);
|
|
|
}}
|
|
|
\end{verbatim}
|
|
|
|
|
|
|
|
|
\begin{verbatim}
|
|
|
void deconnexion(int validation)
|
|
|
{
|
|
|
if (validation == 1)
|
|
|
{ EXEC SQL COMMIT WORK RELEASE;
|
|
|
} else
|
|
|
{ EXEC SQL ROLLBACK WORK RELEASE;}
|
|
|
printf("Déconnexion sans problème.\n");
|
|
|
}
|
|
|
\end{verbatim}
|
|
|
|
|
|
\begin{verbatim}
|
|
|
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);
|
|
|
}
|
|
|
\end{verbatim}
|
|
|
|
|
|
|
|
|
\section*{MEMO}
|
|
|
\subsection*{Langage PL/SQL}
|
|
|
|
|
|
\begin{verbatim}
|
|
|
DECLARE
|
|
|
variable_PL/SQL {type SQL | nom_table.nom_colonne%TYPE | nom_table%ROWTYPE} ;
|
|
|
CURSOR curseur IS SELECT … ;
|
|
|
nom_exception EXCEPTION;
|
|
|
BEGIN
|
|
|
OPEN curseur ;
|
|
|
FETCH curseur INTO liste de variables ;
|
|
|
curseur%FOUND
|
|
|
CLOSE curseur ;
|
|
|
RAISE nom_exception ;
|
|
|
SELECT liste_de_sélection INTO liste de variables FROM … WHERE … ORDER BY ... ;
|
|
|
Variable PL/SQL := ‘&variable_ SQLPlus’ …
|
|
|
IF … THEN … [ELSE …] END IF ;
|
|
|
WHILE … LOOP … END LOOP ;
|
|
|
EXCEPTION
|
|
|
WHEN nom_exception THEN …;
|
|
|
WHEN NO_DATA_FOUND THEN … ;
|
|
|
WHEN OTHERS THEN … :
|
|
|
END ;
|
|
|
\end{verbatim}
|
|
|
|
|
|
\subsection*{Langage PRO*C}
|
|
|
\begin{verbatim}
|
|
|
struct {long sqlcode;/* code resultant de l'exécution
|
|
|
=0 -> ok,
|
|
|
>0 -> ok avec un code d'état,
|
|
|
<0 -> erreur */
|
|
|
struct {
|
|
|
unsigned short sqlerrml;/*longueur du message*/
|
|
|
char sqlerrmc[70];/*message d'erreur*/
|
|
|
} sqlerrm;
|
|
|
long sqlerrd[6];/* seul sqlerrd[2] est utilisé -> donne le nombre de lignes modifiées
|
|
|
UPDATE ou rajoutées par INSERT ou ramenées par un SELECT*/
|
|
|
char sqlwarn[8];/*sqlwarn[0] 'W’ -> warning*/
|
|
|
sqlwarn[0] = '' /*-> pas de warning*/
|
|
|
sqlwarn[1] = 'W'/*-> troncation numérique ou char*/
|
|
|
sqlwarn[2] = 'W'/*-> valeur Null est ignore */
|
|
|
sqlwarn[3] = 'W'/*-> plus de champs dans SELECT que de variables pour recevoir*/
|
|
|
sqlwarn[4] = 'W'/*-> toutes les lignes d'une table sont touchées (par DELETE ou
|
|
|
UPDATE par exemple)*/
|
|
|
sqlwarn[5] /* inutilisé */
|
|
|
sqlwarn[6] = 'W'/*-> Oracle a dû exécuter un rollback */
|
|
|
sqlwarn[7] = 'W'/*-> la donnée ramenée par un FETCH a été modifié
|
|
|
depuis que la clause SELECT a été executé */
|
|
|
} sqlca;
|
|
|
:var_hote INDICATOR :indicateur
|
|
|
:var_hote :indicateur
|
|
|
\end{verbatim}
|
|
|
|
|
|
%\includepdf[pages=-]{MEMO.pdf}
|
|
|
|
|
|
\end{document}
|