34590-procedure-stockee.pdf

Embed Size (px)

Citation preview

  • 8/11/2019 34590-procedure-stockee.pdf

    1/21

    Procdure stocke

    Par Draeli

    www.siteduzero.com

    Licence Creative Commons 6 2.0Dernire mise jour le 6/12/2012

    http://www.siteduzero.com/
  • 8/11/2019 34590-procedure-stockee.pdf

    2/21

    Sommaire

    2Sommaire ...........................................................................................................................................3Procdure stocke .............................................................................................................................3Procdures stockes : les bases ......................................................................................................................................3Cration d'une procdure ............................................................................................................................................................................................5Appel d'une procdure ................................................................................................................................................................................................6Supprimer une procdure ............................................................................................................................................................................................6Voir les procdures existantes ....................................................................................................................................................................................

    8Les blocs d'instructions .....................................................................................................................................................9Dclaration : variable, gestionnaire, curseur .....................................................................................................................9Variables ......................................................................................................................................................................................................................

    10Gestionnaire ..............................................................................................................................................................................................................13Curseur ......................................................................................................................................................................................................................

    15Instructions de contrle ...................................................................................................................................................15IF ...............................................................................................................................................................................................................................16CASE .........................................................................................................................................................................................................................17LOOP ........................................................................................................................................................................................................................18REPEAT ....................................................................................................................................................................................................................18WHILE .......................................................................................................................................................................................................................19ITERATE ...................................................................................................................................................................................................................

    20Exemples .........................................................................................................................................................................21Partager .....................................................................................................................................................................................................................

    2/22

    www.siteduzero.com

    http://www.siteduzero.com/
  • 8/11/2019 34590-procedure-stockee.pdf

    3/21

    Procdure stocke

    Par Draeli

    Mise jour : 06/12/2012

    Difficult : Intermdiaire

    618 visitesdepuis 7 jours, class 194/797

    Vous avez vu la premire partie : les requtes prpareset vous avez ador : alors vous allez aimer a.

    Les procdures s tockes, apparues avec MySQL 5, sont ce que la cafine es t au caf, on peut boire le caf sans , mais a ne

    serait pas auss i bon.

    Cette partie de MySQL, qui n'est encore que trop peu utilise, est un bon moyen de mettre en oeuvre des scripts avancs qui,

    non content de pouvoir faire tout un tas d'actions, permettent une optimisation des scripts, ventuellement une couche

    d'abstraction s upplmentaire pour la programmation et, plus basiquement, des requtes qui sans cela seraient complexes et

    lourdes mettre en oeuvre, voire impossibles.

    C'est donc en partant de ce cons tat que je vais m'efforcer de vous montrer tous ces points et bien plus ...

    Pr-requis :

    - MySQL 5.0 ou Suprieur

    - avoir des connaissances de base sur MySQL est recommand (savoir faire des SELECT, UPDATE, INSERT, DELETE)

    - des bas es en algorithme pour faire vos propres s cripts par la suite- savoir utiliser MySQL en ligne de commande pour pouvoir effectuer les exercices.

    Sommaire du tutoriel :

    Procdures s tockes : les bases

    Les blocs d'instructions

    Dclaration : variable, gestionnaire, curseur

    Instructions de contrle

    Exemples

    Procdures stockes : les bases

    Cration d'une procdure

    La syntaxe est relativement s imple et se prsente s ous la forme suivante :

    Code : SQL

    CREATEPROCEDUREnom_de_la_procedure([parametres])

    Le nommage respecte les rgles habituelles, imaginons donc une procdure nomme 'sdz', elle sera cre s ous la forme :Code : SQL

    CREATEPROCEDUREsdz() caracteristiques

    Sommaire 3/22

    www.siteduzero.com

    http://www.siteduzero.com/tutoriel-3-34590-procedure-stockee.html?pdf=1#ss_part_5http://www.siteduzero.com/tutoriel-3-34590-procedure-stockee.html?pdf=1#ss_part_2http://www.siteduzero.com/tutoriel-3-34590-procedure-stockee.html?pdf=1#ss_part_1http://www.siteduzero.com/tutoriel-21-34590-procedure-stockee.htmlhttp://www.siteduzero.com/http://www.siteduzero.com/tutoriel-3-34590-procedure-stockee.html?pdf=1#ss_part_5http://www.siteduzero.com/tutoriel-3-34590-procedure-stockee.html?pdf=1#ss_part_4http://www.siteduzero.com/tutoriel-3-34590-procedure-stockee.html?pdf=1#ss_part_3http://www.siteduzero.com/tutoriel-3-34590-procedure-stockee.html?pdf=1#ss_part_2http://www.siteduzero.com/tutoriel-3-34590-procedure-stockee.html?pdf=1#ss_part_1http://www.siteduzero.com/tuto-3-4404-1-mysql-requete-preparee.htmlhttp://www.siteduzero.com/tutoriels-les-plus-visiteshttp://www.siteduzero.com/tutoriel-21-34590-procedure-stockee.htmlhttp://www.siteduzero.com/membres-294-10877.html
  • 8/11/2019 34590-procedure-stockee.pdf

    4/21

    Rien de compliqu jusque l, mais le point le plus important concerne les paramtres qui se dcompos ent en trois parties.

    sens_du_parametrenom_parametretype_parametre

    Le sens du parametrepeut prendre 3 valeurs :

    IN: le paramtre sera une valeur ou une variable d'entre. Le paramtre indiqu peut tre une valeur ou une variable que vousenvoyez lors de l'appel, et qui sera utilis l'intrieur de la procdure.

    OUT: le paramtre sera une variable de sortie. Le paramtre indiqu sera une variable (de sessionou de procdure) qui prendraune valeur (enfin normalement, s inon a n 'a que peu d 'intrt) lors de la procdure.INOUT: le paramtre sera une variable d'entre-sortie. Cette variable pourra tre utilis ou non dans la procdure, et verra

    normalement sa valeur modifie lors de la procdure.

    Le nom_parametresuit les rgles de nommage habituel. Ce nom de paramtre reprsentera par la suite dans la procdure une

    variable qui aura pour valeur celle qu 'on lui aura ass ign.

    Si vous ne comprenez pas ce que a veut d ire, ce n'est pas grave, les exemples ci-dessous sont l pour a.

    Le type_parametreprend en valeur le type de la valeur ou de variable attendu.

    Avant de pas ser la pratique, rappelons un point important : les procdures s tockes s ont, comme leur nom l'indique, stockes...

    J'entends dj des "on s'en serait dout". En fait, s'il est vrai qu'elles le sont, ceci entrane plusieurs chos es importantes et qui

    font toute la puissance des procdures s tockes. De par ce statut, elles s ont tout moment utilisables ; ainsi, les dclarer unefois pour une base de donnes suffit pour pouvoir les u tiliser par la su ite tout moment. Contrairement aux requtes prpares,

    elles ne dpendent pas d'un thread et ne sont pas dtruites automatiquement ; de mme, elles restent prsentes si le serveur

    s'arrte.

    Ceux dispos ant de MySQL Query Browserpourront par la suite vrifier cet tat de fait en ouvrant la base qu'ils ont utilise, et

    verront apparatre en dessous des tables, de nouvelles icnes qui, sur leur ct, porte le nom de la procdure concerne.

    Passons maintenant aux exemples .

    Pour commencer, nous allons changer le dlimiteur de fin de requte utilis, ceci non pas afin de vous perturber mais tous

    simplement par commodit pour la suite. Pour ce faire, tapez ceci en ligne de commande :

    Code : SQL

    DELIMITER|

    Dsormais, quand vous terminerez une requte, il ne faudra plus faire ;mais |.

    Premire procdure

    Nous allons crer une procdure qui nous renvoie la valeur que nous lui avons passe en paramtre.

    Code : SQL

    CREATEPROCEDUREsdz(INvaleur VARCHAR(20))BEGIN

    SELECTvaleur;END|

    Ceci est la structure complte d'une procdure : comme vous le voyez, ici apparaissent des choses dont je n'ai pas encore parl :

    BEGIN et END, qui permettent de mettre plusieurs instructions l?intrieur. Et chaque instruction l?intrieur de ce bloc se

    termine bien par ;, qui n'est en rien une erreur car si nous avions laiss notre dlimiteur normal, alors a n'aurait pas march. Pour

    ceux qui ne me croient pas, je les invite remettre le dlimiteur ;normal en faisant :Code : SQL

    DELIMITER;

    et ressayer.

    Dans ce bloc, nous voyons une instruction qui va chercher la valeur que nous avons passe en paramtre d'entre, et qui a t

    stocke dans la variable 'valeur'.

    Procdure stocke 4/22

    www.siteduzero.com

    http://www.siteduzero.com/http://dev.mysql.com/downloads/query-browser/1.1.html
  • 8/11/2019 34590-procedure-stockee.pdf

    5/21

    Voil : vous avez fait votre premire procdure, combien s impliste.

    Appel d'une procdure

    Nous avons vu dans la partie prcdente comment crer une procdure, nous allons apprendre dsormais l'appeler.

    Pour cela rien de plus simple, tapez :Code : SQL

    CALLsdz(2)|

    Si avez toujours le dlimiteur |, vous ne devriez pas avoir de problme et en suivant les tapes depuis le dbut, vous aurez lersultat suivant :

    Remarquez qu'ici l'appel est relativement simple, on peux complexifier la chose en partant du principe que notre valeur est dans

    une variable : pour ce faire, on va dclarer une nouvelle variable '@a', laquelle on affectera une valeur :

    Code : SQL

    SET@a:=666|

    Notre variable de sessionvaut donc dsormais 666.

    Bien ! Appelons notre procdure avec cette variable :

    Code : SQL

    CALLsdz(@a)|

    et la valeur qui va s'afficher est notre 666.

    Tu ne nous avais pas dit qu'il existait autre chose que IN ?

    Abs olument, et maintenant que vous avez vu le principe de base, nous allons refaire une procdure mais qui elle prendra en plus

    un paramtre de s ortie. Pour l'occasion, on va faire un truc plus utile que prcdemment.

    Calculons le carr d'un nombre :

    Code : SQL

    CREATEPROCEDUREcarre(INvaleur INT, OUTtoto BIGINT)BEGIN

    SELECTvaleur*valeur INTOtoto;END|

    En plus, on a un deuxime paramtre qui recevra une variable qui servira pour la sortie, de type BIGINT.

    Procdure stocke 5/22

    www.siteduzero.com

    http://www.siteduzero.com/http://www.siteduzero.com/tuto-3-6146-1-les-variables-utilisateur.html
  • 8/11/2019 34590-procedure-stockee.pdf

    6/21

    Dans le bloc d'instructions, on a une requte qui prend la valeur d'entre, la multiplie par elle-mme et le INTOva permettre dedire "stocke-moi le rsultat ici", qui sera alors mis dans la variable locale 'toto'. Cette variable n'est pas access ible en dehors.

    Ouais : donc le rsultat, on le rcupre comment ?

    Ah vous allez voir, c'est simple.

    On appelle la procdure que l'on vient de crer comme ceci :

    Code : SQL

    CALLcarre(2,@b)|

    L, on demande de calculer le carr de 2en passant 2 la valeur d'entre, et on indique la variable '@b' qui stockera le rsultatpour la sortie : remarquez que cette variable est, dans ce cas-ci, globale la session (ce qui veut dire qu'une autre ses sion peut

    trs bien appeler la mme procdure sans que les rsultats ne s 'crasent : donc, chaque rsultat est li la ses sion).

    J'ai fait comme toi mais il ne se pas se rien...

    En fait c'es t normal, la vraie magie c'est maintenant :Code : SQL

    SELECT@b|

    La requte retourne le rsultat du calcul, c'est--dire : 4.

    Si vous avez tout compris jusque l, alors rendez-vous la suite.

    Supprimer une procdure

    Certainement la partie la plus courte du tu toriel. vous venez de crer deux procdures dans les parties prcdentes, bien : nous

    allons supprimer la premire qui ne sert strictement rien.

    Code : SQL

    DROPPROCEDUREsdz|

    vous venez de s upprimer votre procdure. Eh oui, c'est dj fini...

    |vaut ;si vous avez lanc une autre fentre ou relanc la fentre des parties prcdentes.

    Voir les procdures existantes

    Vous souhaiterez certainement s avoir par la suite comment lister les procdures que vous avez cres : pour cela, rien de plus

    simple. Si vous voulez voir TOUTES les procdures de toutes les BDDs auxquelles vous avez un accs , alors :

    Code : SQL

    SHOWPROCEDURESTATUS LIKE'%%'\G

    Remarquez dans ce cas que j'ai utilis '%%'pour indiquer que je veux toutes les procdures (rien ne vous empche de mettreune expression qui corresponde plus vos besoins) et \G comme dlimiteur de fin de requte pour avoir un affichage lisiblehumainement en ligne de commande.

    Procdure stocke 6/22

    www.siteduzero.com

    http://www.siteduzero.com/
  • 8/11/2019 34590-procedure-stockee.pdf

    7/21

  • 8/11/2019 34590-procedure-stockee.pdf

    8/21

    Ceci parat relativement logique dans la mesure o chaque base de donnes peut avoir des procdures qui, dans ce cas , auront

    des noms communs .

    Comme vous le remarquez, le code de la procdure apparat avec d'autres renseignements.

    Les blocs d'instructions

    Comme nous l'avons vu dans les parties prcdentes , les b locs d'instructions permettent de dlimiter une zone d'instructions ;cependant, pour les autres parties du tuto, vous aurez besoin de comprendre son fonctionnement afin de ne pas vous arracher

    les cheveux.

    La syntaxe que nous avons vue prcdemment es t la plus s imple, savoir un BEGIN pour signaler le dbut, un END pour

    signaler la fin et l'inst ruction de fin de requte derrire le END pour fermer le bloc.

    Cependant, pour la suite, vous aurez peut-tre besoin d'attribuer un nom au bloc fermer ; pour ce faire, vous devez dclarer un

    label, ou si vous prfrez, un nom pour le bloc.

    Exemple:Code : SQL

    sdz_label: BEGIN#ici les instructionsENDsdz_label;

    Remarquez que le label de fin doit tre le mme que pour celui du dbut.

    Maintenant voyons le comportement des variables locales dans un bloc. Cette variable locale (dclare dans une procdure, j'y

    reviendrai) a une 'dure de vie' et une 'visibilit'. Ces deux notions - ne pas confondre- sont ce qui est s ouvent source d'erreur.

    Dure de vie: la variable existe de sa dclaration jusqu' la fin du bloc la contenant.

    Visibilit: espace o la variable peut tre utilise. La variable est visible jusqu' la fin du bloc et pas se invisible ds qu'un

    nouveau bloc commence et ce, jusqu ' ce que le dit bloc se finisse.

    Voici un petit schma qui rendra les choses plus claires :

    Enfin, on va faire un exemple qui permettra de lever d'ventuels doutes :

    Code : SQL

    CREATEPROCEDUREvisibilite()

    Procdure stocke 8/22

    www.siteduzero.com

    http://www.siteduzero.com/
  • 8/11/2019 34590-procedure-stockee.pdf

    9/21

    BEGIN

    DECLAREvar INTDEFAULT1; SELECTvar AS'Je suis la variable var du bloc 1';

    BEGIN

    DECLAREvar INTDEFAULT5; SELECTvar AS'Je suis la variable du bloc 2'; SETvar=10;

    SELECTvar AS'Je suis la variable du bloc aprsmodification'; END; SELECTvar AS'Je suis toujours la variable du bloc 1';END;

    Et on appelle ceci avec :

    Code : SQL

    callvisibilite();

    Ce qui donne le rsultat suivant :

    Dclaration : variable, gestionnaire, curseur

    Variables

    Lors d 'une procdure, il est pos sible de dclarer des variables qui seront locales la procdure, comme nous l'avons dans la

    partie prcdente ; ces variables ont une dure de vie et une visibilit dont le schma suivant es t le rcapitulatif :

    Procdure stocke 9/22

    www.siteduzero.com

    http://www.siteduzero.com/
  • 8/11/2019 34590-procedure-stockee.pdf

    10/21

    Pour crer une variable il faut utiliser la syntaxe :

    Code : SQL

    DECLAREnom_variable type_variable;

    Cependant ceci ne s uffit pas : la dclaration des variables doit tre faite imprativement derrire la dclaration du b loc, donc

    derrire BEGIN.

    Exemple:Code : SQL

    CREATEPROCEDUREcalcul1()BEGIN

    DECLAREi INTDEFAULT1;DECLAREj FLOATDEFAULTPI() ;SELECTi +j;END|

    Dans les procdures, il est tout fait pos sible de mlanger les types de variables d iffrentes, et mmes de les utiliser dans les

    requtes.

    De mme, les variables ont des espaces de noms diffrents ; il est donc tout fait pos sible d'avoir ceci :

    Code : SQL

    CREATEproceduretoto()BEGIN

    declarea intDEFAULT1;SET@a:=2;SELECTa,@a;END|

    Dans ce cas, les variables ont un nom identique, mais la premire est une variable locale la procdure et l'autre, une variable

    globale la session.

    Procdure stocke 10/22

    www.siteduzero.com

    http://www.siteduzero.com/
  • 8/11/2019 34590-procedure-stockee.pdf

    11/21

    Gestionnaire

    Lorsque vous crirez des procdures , vous pourrez tre confronts des problmes de la forme suivante : "et l , si je mets une

    valeur qui est dj dans la base de donnes, comment faire pour que la procdure continue sans s?arrter ?".

    C'est un exemple de problme qui ne peut se grer qu'avec la dclaration d'un gestionnaire, qui permettra de dire au programme :

    "continue d'excuter la procdure et ta is-toi", fort pratique pour viter le comportement par dfaut qui, lors d'une rencontre

    avec une erreur, sortira (EXIT) directement de la procdure.

    Exemple :

    Code : SQL

    CREATETABLEt (s1 int,PRIMARYKEY(s1))|CREATEPROCEDUREerreur_continue ()BEGIN

    DECLARECONTINUEHANDLERFOR1062SELECT'ERREUR';SELECT'je suis 1';INSERTINTOt VALUES(1);SELECT'je suis 2';INSERTINTOt VALUES(1);

    SELECT'je suis 3';END;|

    Cet exemple, inspir du manuel mais corrig, essaie de mettre deux valeurs dans une table t; seulement lors du deuxime appel,une erreur de cl duplique sera gnre dans ce cas-l si nous n'avions pas la ligne :

    Code : SQL

    DECLARECONTINUEHANDLERFOR1062SELECT'ERREUR';

    Le code s'arrterait l et la ligne :Code : SQL

    SET@x =3;

    ne serait pas excute, ce qui n'est pas trs pratique.

    Ouais, mais alors, comment on fait ?

    Vous allez voir, c'est pas trop compliqu : pour cela, on va suivre la syntaxe su ivante :

    Code : SQL

    DECLAREtype_gestionnaire HANDLERFORcondition_valeur requete;

    Il existe deux types de ges tionnaires actuellement supports, qui sont :

    EXIT: lors de la rencontre d'une erreur, la procdure s'arrte (comportement par dfaut).CONTINUE: lors de la rencontre d'une erreur, la procdure continue.

    Si on avait mis EXIT la place de CONTINUE dans l'exemple prcdent, la phrase 'je suis 3' ne serait pas apparue.

    Vient ensuite condition_valeur qui est subtile dans la mesure o il existe plusieurs conditions possibles, et que parmi elles,

    certaines reprennent un code d'erreur standard SQL, les autres provenant du s tandard de MySQL.Par exemple : ci-dessus, j'ai mis la valeur 1062 qui correspond au code d'erreur MySQL pour les cls dupliques, mais j'aurais

    aussi bien pu utiliser le code d'erreur standard la place, ce qui donne ceci :

    Code : SQL

    DECLARECONTINUEHANDLERFORSQLSTATE'23000'SELECT'ERREUR';

    Procdure stocke 11/22

    www.siteduzero.com

    http://www.siteduzero.com/
  • 8/11/2019 34590-procedure-stockee.pdf

    12/21

    Comme vous pouvez le remarquer, le mot cl SQLSTATE est venu en plus du code, et le numro de l'erreur est entour ; si vous

    ne le faites pas, vous aurez une erreur. De mme, si vous utilisez uniquement le code d'erreur sans dclarer SQLSTATE, vous

    aurez aussi une erreur (l'erreur du manuel MySQL est l).

    Il existe encore d'autres conditions :

    SQLWARNING: raccourci pour tous les codes SQLSTATE qui commencent par 01.NOT FOUND: raccourci pour tous les codes SQLSTATE qui commencent par 02.SQLEXCEPTION: raccourci pour tous les codes SQLSTATE qui ne sont pas reprsents par SQLWARNING ou par NOT

    FOUND.

    Et si on veut plusieurs codes d'erreurs ?

    C'est tout fait possible, par exemple :

    Code : SQL

    CREATEPROCEDUREerreur_continue ()BEGIN

    DECLARECONTINUEHANDLERFORSQLSTATE'02000', SQLEXCEPTIONSELECT'ERREUR';SELECT'je suis 1';INSERTINTOt VALUES(1);SELECT'je suis 2';INSERTINTOt VALUES(1);SELECT'je suis 3';END;|

    Vous avez donc vu tout ce qu'il est pos sible de faire avec les gestionnaires ; remarquez que la requte que j'ai mise en fin est un

    exemple, vous pouvez tout fait effectuer un autre traitement, voire mme mettre des blocs d'instructions.

    Exemple:

    Code : SQL

    CREATEPROCEDUREerreur_continue ()BEGIN

    DECLARECONTINUEHANDLERFORSQLEXCEPTION BEGIN SELECT'ERREUR'; SELECT'je suis une instruction du bloc d\'erreur';END;

    SELECT 'je suis 1';INSERT INTO t VALUES (1);SELECT 'je suis 2';INSERT INTO t VALUES (1);SELECT 'je suis 3';END;|

    Est-il poss ible d'avoir une ges tion nominative des erreurs ?

    Oui, ce qui permet d'ailleurs une meilleur lisibilit.Reprenons notre code prcdent et rajoutons-y ce qui manque :

    Code : SQL

    CREATEPROCEDUREcondition_propre ()BEGIN

    Procdure stocke 12/22

    www.siteduzero.com

    http://www.siteduzero.com/
  • 8/11/2019 34590-procedure-stockee.pdf

    13/21

    DECLAREcondition_cle_duplique CONDITION FORSQLSTATE'23000';DECLARECONTINUEHANDLERFORcondition_cle_duplique SELECT'ERREUR';SELECT'je suis 1';INSERTINTOt VALUES(1);SELECT'je suis 2';INSERTINTOt VALUES(1);SELECT'je suis 3';END;

    |

    La nouvelle ligne es t la suivante :

    Code : SQL

    DECLAREcondition_cle_duplique CONDITION FORSQLSTATE'23000';

    Dtaillons -la donc selon s a syntaxe.

    Code : SQL

    DECLAREnom_type_erreur CONDITION FORtype_erreur;

    Nous dfiniss ons donc ici un nom qui sera utilisable quand la condition suivante es t rencontre. Dans notre cas, nous avons dit

    d'associer 'condition_cle_duplique' l'erreur de cl duplique (code d'erreur 23000 en SQL Standard). Il est donc possible par la

    suite de donner ce nom plutt qu'un nom peu parlant.

    Le nom ainsi cr devra tre appel la place du type d'erreur attendu dans :

    Code : SQL

    DECLARECONTINUEHANDLERFORcondition_cle_duplique SELECT'ERREUR';

    Tout ceci vous permettra une meilleure conception de vos procdures , et surtout la possibilit de leur apporter une certaine

    autonomie face aux erreurs.

    Vous pouvez trouvez la liste des erreurs sur la documentation officielle.

    Curseur

    Jusqu' maintenant, ce que vous avez vu vous permet de construire des procdures relativement intressantes : cependant, vous

    serez vite confronts au problme de la lecture des rsultats lorsqu'une requte SELECT renvoie plus d'une ligne.

    Pour remdier cela, il y a les curseurs qui pour le moment s ont peu volus (car ils sont en lecture seule et non navigable) dans

    MySQL ; mais ils nous suffiront.

    Imaginons que nous ayons une table de membres : nous souhaiterions lire l'identifiant et le mot de pas se qui y sont contenus , ce

    qui donne la chose suivante :

    Code : SQL

    CREATEPROCEDUREliste_membres()BEGIN

    DECLAREvar_identifiant VARCHAR(64); DECLAREvar_mot_passe VARCHAR(32); DECLAREcurseur1 CURSORFORSELECTidentifiant, mot_passeFROMmembres;

    OPENcurseur1; #ouverture du curseur1

    #premire ligne du rsultat

    Procdure stocke 13/22

    www.siteduzero.com

    http://www.siteduzero.com/http://dev.mysql.com/doc/refman/4.1/en/error-handling.html
  • 8/11/2019 34590-procedure-stockee.pdf

    14/21

    FETCHcurseur1 INTOvar_identifiant, var_mot_passe;

    SELECTvar_identifiant, var_mot_passe;

    #seconde ligne du rsultat FETCHcurseur1 INTOvar_identifiant, var_mot_passe; SELECTvar_identifiant, var_mot_passe;

    #troisime ligne du rsultat

    FETCHcurseur1 INTOvar_identifiant, var_mot_passe; SELECTvar_identifiant, var_mot_passe;

    CLOSEcurseur1; #fermeture du curseur1END;

    Premire chos e remarquer, cette s tructure ne rcupre que trois des lignes , ce qui n'est pour le moment que peu intressant

    pour nous ; dans les parties suivantes, nous verrons comment s implifier a tout en permettant une lecture to tale du jeu de

    rsultats.

    Premire chos e effectue dans cet exemple aprs avoir dclar deux variables locales qui nous resserviront plus bas :

    Code : SQL

    DECLAREcurseur1 CURSORFORSELECTidentifiant, mot_passe FROMmembres;

    On demande la cration d'un curseur nomm 'curseur1' qui va aller chercher le jeu de rsultats correspondant la requte :

    SELECT identifiant, mot_passe FROM membres;

    Ensuite, afin de pouvoir utiliser notre jeu de rsultats et parcourir ce qui est l'intrieur, nous l'ouvrons avec ceci :

    Code : SQL

    OPENcurseur1;

    S'ensuit la partie :

    Code : SQL

    FETCHcurseur1 INTOvar_identifiant, var_mot_passe;

    Nous lisons le rsultat du curseur1 pour la ligne courante. Chaque appel FETCH fait avancer d'une ligne dans le jeu de

    rsultats.

    Nous affectons le rsultat de cette ligne nos variables.Remarquez bien que les variables doivent tre disposes dans le sens dans lequel on souhaite rcuprer les valeurs ; si

    dans le cas prsent, nous avions invers

    Code : SQL

    FETCHcurseur1 INTOvar_identifiant, var_mot_passe;

    avec

    Code : SQL

    FETCHcurseur1 INTOvar_mot_passe, var_identifiant;

    nous aurions alors eu les mots de pas se s tocks dans la variable qui taient pour les identifiants , et inversement.

    Procdure stocke 14/22

    www.siteduzero.com

    http://www.siteduzero.com/
  • 8/11/2019 34590-procedure-stockee.pdf

    15/21

    Enfin, aprs avoir rcupr nos lignes , nous fermons le curseur1 l'aide de :

    Code : SQL

    CLOSEcurseur1;

    Instructions de contrle

    IF

    Vous souhaiteriez certainement dans certains cas vrifier des valeurs et effectuer des actions en cons quence : le IF est l pour

    vous permettre ce genre de chos es.

    Imaginons la procdure suivante :

    Code : SQL

    CREATEPROCEDUREcontrole_if(INvar INT)

    BEGIN IF var =1THEN SELECT'Il est vrai de dire que 1 = 1 :D'; ELSE SELECT'Fou est celui qui vous dira que 1 est gal autre chose que 1 :D'; ENDIF;END|CALLcontrole_if(1)|CALLcontrole_if(2)|

    Procdure simple qui compare la variable passe en paramtre la procdure avec 1. Si les deux sont gaux, alors le rsultat

    suivant est excut, et si ce n'est pas le cas, la partie contenue aprs le ELSE(sinon) es t quant elle excute.L'appel des deux CALL nous dmontre bien le rsultat.

    Y a pas moyen de mettre plusieurs IF ?

    Il est tout fait possible de mettre plusieurs conditions , ce qui donne la chos e suivante :

    Code : SQL

    CREATEPROCEDUREcontrole_if(INvar INT)BEGIN

    IF var =1THEN

    SELECT'Il est vrai de dire que 1 = 1 :D'; ELSEIF var =2THEN SELECT'Il est vrai de dire que 2 = 2 :D'; ELSE SELECT'La variable passe en paramtre vaut autrechose que 1 et 2'; ENDIF;END|CALLcontrole_if(1)|CALLcontrole_if(2)|CALLcontrole_if(3)|

    Pour chaque condition que vous souhaiterez ajouter, il vous suffira d'ajouter une ligne :

    Code : SQL

    ELSEIF condition_vrai THENrequetes

    Procdure stocke 15/22

    www.siteduzero.com

    http://www.siteduzero.com/
  • 8/11/2019 34590-procedure-stockee.pdf

    16/21

    On peut mettre plusieurs requtes ?

    Oui, ce qui peut par exemple donner ceci :

    Code : SQL

    CREATEPROCEDUREcontrole_if(INvar INT)BEGIN

    IF var =1THEN SELECT'Il est vrai de dire que 1 = 1 :D'; ELSEIF var =2THEN SELECT'Il est vrai de dire que 2 = 2 :D'; SELECT'Je suis 2'; ELSE SELECT'La variable passe en paramtre vaut autrechose que 1 et 2'; SELECTvar; ENDIF;END|

    CALLcontrole_if(1)|CALLcontrole_if(2)|CALLcontrole_if(3)|

    CASE

    Cette syntaxe, qui diffre du CASE normal, va vous permettre d'effectuer une action si une condition est vrifie.

    Il existe deux types de s yntaxes : la premire se rapprochant de l'utilisation du 'SWITCH' dans les langages de programmation, etl'autre tant quivalente une succes sion de 'IF ... ELSEIF ... ELSEIF ... ELSE ...' .

    Exemple Syntaxe1:

    Code : SQL

    CREATEPROCEDUREcase1(INvar INT)BEGIN

    CASEvar WHEN1THENSELECT'Je suis 1'; WHEN2THENSELECT'Je suis 2'; ELSESELECT'Je suis autre chose que 1 et 2'; ENDCASE;

    END|

    Dans ce cas , la variable 'var' est compare chaque cas rencontr, et si aucune des valeurs n'est vrifie dans les WHEN, alors

    l'instruction aprs ELSEsera excute.

    Exemple Syntaxe2:

    Code : SQL

    CREATEPROCEDUREcase2(INvar INT)BEGIN

    CASEWHENvar =1THENSELECT'Je suis 1';

    WHENvar =2THENSELECT'Je suis 2'; ELSESELECT'Je suis autre chose que 1 et 2'; ENDCASE;END|

    Procdure stocke 16/22

    www.siteduzero.com

    http://www.siteduzero.com/
  • 8/11/2019 34590-procedure-stockee.pdf

    17/21

    Dans ce cas, la variable 'var' n'est pas value ; au lieu de cela, nous passons d'un bloc de WHEN l'autre en comparant s i uneexpress ion est vraie. Si c'est le cas, nous excutons alors l'instruction qui la su it, sinon, si aucune des express ions n 'est vrifie,

    alors l'instruction du ELSEest effectue.

    Est-il poss ible de mettre plus d 'une instruction dans THEN ?

    Oui vous n'tes pas limits une inst ruction.

    LOOP

    C'est une s tructure de boucle qui rpte un bloc d'instructions tant qu'elle ne rencontre pas une instruction LEAVE pour l'arrter.

    Exemple:Code : SQL

    CREATEPROCEDUREloop1()

    BEGINDECLAREi INTDEFAULT0;

    LOOP SETi :=i +1; SELECTi;

    ENDLOOP;END|

    Cette requte es t correcte, cependant, ne la testez pas car vous auriez une boucle qui dure trs longtemps (Ctrl+ Csous Windows pour arrter le dsastre).

    Aucune condition d'arrt n'a t rencontre, et une erreur ne s era rencontre que lorsque la valeur maximale valide de INT sera

    rencontre, soit le chiffre : 2 147 483 647.

    Comme pour toutes les instructions de boucle qui seront prsentes, il est possible d'arrter brusquement la boucle

    l'aide d'une instruction du type :

    Code : SQL

    LEAVE nom_label

    Exemple d'arrt lorsqu'un label est prsent :

    Code : SQL

    CREATEPROCEDUREloop1()BEGIN

    DECLAREi INTDEFAULT0;

    je_suis_un_label: LOOP SETi :=i +1; SELECTi;

    IF i =10THEN LEAVE je_suis_un_label; ENDIF;

    ENDLOOP je_suis_un_label;END|

    Procdure stocke 17/22

    www.siteduzero.com

    http://www.siteduzero.com/
  • 8/11/2019 34590-procedure-stockee.pdf

    18/21

    Le code s 'excute, et si i vaut 10, alors la boucle est arrte grce au nom du label.

    Le label indiqu avant l'instruction de boucle doit tre le mme que celui qui la termine.

    REPEAT

    Cette instruction de type boucle permet de rpter un bloc d'instructions jusqu' ce qu'une condition soit vrifie.

    Exemple:Code : SQL

    CREATEPROCEDURErepeat1()BEGIN

    DECLAREi INTDEFAULT0;

    REPEAT SETi :=i +1; SELECTi;

    UNTILi =10ENDREPEAT;END|

    Une boucle est lance jusqu' ce que la valeur de variable locale i soit gale 10.

    Plus court que la version avec LOOP pour un rsultat identique.

    Les labels sont supports de la mme manire qu'avec LOOP et prennent donc la mme syntaxe.

    WHILE

    C'est une structure de type boucle qui rpte un bloc d'instructions tant qu'une condition est vraie.

    Exemple:Code : SQL

    CREATEPROCEDUREwhile1()BEGIN

    DECLAREi INTDEFAULT0;

    WHILE i

  • 8/11/2019 34590-procedure-stockee.pdf

    19/21

    ITERATE

    ITERATE ne peut tre utilise qu' l'intrieur d'une boucle LOOP, REPEAT ou WHILE et s ignifie : "excute encore une fois la

    boucle".

    Et plus clairement ?

    Le mieux sera encore des exemples reprenant nos procdures prcdentes .

    Exemple LOOP:Code : SQL

    CREATEPROCEDUREloop1()BEGIN

    DECLAREi INTDEFAULT0;

    je_suis_un_label: LOOP SETi :=i +1; SELECTi;

    IF i

  • 8/11/2019 34590-procedure-stockee.pdf

    20/21

    CREATEPROCEDUREwhile1()BEGIN

    DECLAREi INTDEFAULT0;

    je_suis_un_label: WHILE i 0DO SETo :=o *X; SETexposant :=exposant -1; ENDWHILE ;SELECTo INTOresultat;END|DELIMITER;

    La procdure est appele ainsi :

    Code : SQL

    CALLMath_Puissance(3,3,@a); #appel de la procdureSELECT@a; #affichage du rsultat

    Lister les Membres d'une table:Code : SQL

    DELIMITER|#Exemple de procdure qui liste les membres d'une tableCREATE PROCEDURE Liste_Membres()

    BEGINDECLARE done INT DEFAULT 0;DECLARE var_identifiant VARCHAR(64);DECLARE var_mot_passe VARCHAR(32);DECLARE curseur1 CURSOR FOR SELECT identifiant, mot_passe FROMmembres;DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SETdone =1;

    Procdure stocke 20/22

    www.siteduzero.com

    http://www.siteduzero.com/
  • 8/11/2019 34590-procedure-stockee.pdf

    21/21

    OPENcurseur1; #ouverture du curseur1

    REPEAT FETCHcurseur1 INTOvar_identifiant, var_mot_passe; IF done =0THEN SELECTvar_identifiant, var_mot_passe; ENDIF;

    UNTILdone ENDREPEAT;

    CLOSEcurseur1; #fermeture du curseur1END|DELIMITER;

    La procdure es t appele par :

    Code : SQL

    CALLListe_Membres();

    Au final, les procdures stockes reprsentent un bon moyen d'optimiser les requtes redondantes, tout en offrant une structure

    suffisamment large pour permettre des applications volues.

    Partager

    Procdure stocke 21/22

    http://www.siteduzero.com/tutoriel-rss/34590.xml