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