\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}
