Aller au menu - Aller au contenu

Procédure stockée

Pour accéder à cette section
Connectez-vous !
connexion_rpx
Page 1 
Pseudo Commentaire
Page 1 
Hors ligne Anonyme # Posté le 22/07/2006 à 11:41:46

Trés bon tuto, bien expliqué, claire, en gros tous ce que l'on demande d'un tuto, aller un petit 20 :D
Hors ligne NarTy # Posté le 27/08/2006 à 15:55:57
Je t'aime amèrement !
Avatar
Groupe : Bannis

Bravo J'ai adoré tes deux tutos !
J'attends un autre sur les fonctions et les requetes recursives
18/20

Venez jouer
Mon blog => JuLeS’ ProGs
Programmeur xHTML/CSS,PHP/SQL,Javascript,C à votre service

 
Hors ligne aureg # Posté le 29/09/2006 à 16:50:25
Avatar

Ville : Stembert
Pays : Belgique
Études : HEPL INPRES

Woaw, rien a redire, clair, complet et précis.

Génial :) , vivement la suite :p

un "p'tit" 19/20 (ba quoi rien est parfait ^^ )
 
Hors ligne jacek # Posté le 12/12/2006 à 14:23:44
Avatar

Tres bon tuto (jai juste une peu mal a la tete maitenant :D ) mais y'a une chose que j'ai pas comprise c'est quand est ce que c'est interessant d'utiliser cette methode .
Merci :)

Je te met 18 ;)
Hors ligne Gaga971 # Posté le 29/04/2007 à 13:41:21
Programmeur indépendant
Avatar

Un petit mal de crane aussi pour moi lool :-°
Mais quand est ce que l'on utilise cela ??Encore les requete préparée c'est facilement compréhensible pour l'utilisation mais là...


 
Hors ligne Layus # Posté le 15/09/2008 à 20:50:51
!? encore un Layus...
Avatar

Études : Université catholique de Louvain

Très bon tuto... 18/20 !

Cependant tu abuse un peu du <minicode> pour donner un aperçu de ta console Sql...

Ah oui, on dit bloc et pas "bloque", bien que tu aies corrigé ça dans le code Sql, tu ne l'a pas fait dans le retour console (le <minicode> justement)

J'apprécie encore la clarté du tuto.

Celui qui reçoit une idée de moi reçoit un savoir sans diminuer le mien, tout comme celui qui allume sa bougie à la mienne reçoit la lumière sans me plonger dans la pénombre.
Thomas Jefferson
 
Hors ligne Jean-Seb # Posté le 22/09/2008 à 04:49:40
Fi. doo . daa...
Avatar

Ville : Québec
Pays : Canada

excellent tutoriel!

mais j'ai une question et je crois ne pas être le seul à me demander cela:
dans quel but nous utilisons cela?

simplement pour se simplifier la vie à l'écriture des requêtes?

ou bien est-ce qu'on peut en début de script appeler une procédure qui mettra nos données dans une variable de session et qu'en parallèle notre script PHP continu de tourner jusqu'à ce qu'au moment de l'affichage il appelle une autre procédure qui sélectionnera les information ?
si c'est possible, cela pourrait considérablement accélérer l'exécution d'un script
 
Hors ligne Dutiona # Posté le 15/01/2009 à 21:28:04
Vis pour être heureux !
Avatar

Ville : Toulouse
Pays : France métropolitaine
Études : EISTI

Exellent. Bonne continuation ;) !


Bisous, Nyu

#LGDF: winzou vaincra !
Défiez ma brute !
Eclipse user | Ubuntu (KDE) user | php/sql/xhtml/css/xml/xsl/javascript/java/python/perl/c/scheme/ada/uml/ocl coder.
Framework in use : Seraframework (my own one).
In Microeisti staff.
 
Hors ligne christophetd # Posté le 29/06/2009 à 11:00:31
Regardez-moi !
Avatar
Flux RSS

Ville : Gap
Pays : France métropolitaine

Super tutoriel, utile, bien expliqué et très clair.
 
Hors ligne JeromeJ # Posté le 06/07/2009 à 18:31:28
Cet espace est trop petit pour
Avatar

Bonjour,

Je trouve que les exemples ne sont pas assez concret... Généralement déjà il est déconseillé d'utiliser de l'esthétique SQL...

Et j'ai une question... Est-ce que CREATE PROCEDURE test(IN var VARCHAR(20)) BEGIN SELECT 'test'; END vaut-il mieux qu'un simple SELECT 'test' (évidemment cette requête serait souvent utilisée)

www.olissea.com
Site communautaire et multi-thème

Olissea recrute ! Cliquer ici pour voir le sujet.

Olissea c'est: Tchat (à venir), Forums, Articles, Programmes, etc. (+ Tout ce que vous souhaitez)
 
Hors ligne mykeys # Posté le 18/09/2009 à 02:09:22
Unfaithful destiny
Avatar
Flux RSS

Études : Cégep de Victoriaville

À mon avis, l'utilité des procédures stockées, c'est lorsqu'on a un ensemble de requêtes complexes à éxécuter en même temps. Cela évite d'avoir à envoyer plusieurs requêtes au serveur SQL, sauvant ainsi du traffic réseau (lorsque le serveur SQL est dédié), et facilite la migration du code qui appelle la procédure stockée vers un autre SGBDR.

Voici un exemple de requête "complexe" (okay, le code est pour MSSQL, mais on comprend l'idée ;) )
"Déplacement d'un sous arbre - représentation intervallaire"
Ça fait quand même cinq cents lignes et des poussières :-°

On pourrait aussi écrire le code en PHP. d'ailleurs, ça donne, pour mysql cette fois (les tables sont différentes par contre :p ):
Secret (cliquez pour afficher)

Code : PHP
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
<?php
/*
  GF IDP PF
   ¯\¯!¯/¯
    |-!-|
   _/_!_\_
  FC ELC FA
  */
	function deplacement_arbre($eId, $eIdParent, $eMode, $eRecurs){
		$OK = 0;
		$bdmax = 0; //Limite droite arbo.
		$deltaB= 0 ; //dBorne
		$bgd=0;$bdd=0;$nivd=0; //Infos sur e Déplacé.
		$bgp=0;$bdp=0;$nivp=0; //Infos sur e Parent.
		
		$req = mysql_query('SELECT MAX(CPTRIGHT) AS bdmax FROM componentsri');
		$req = mysql_fetch_assoc($req);
		$bdmax = intval($req['bdmax']);
		
		$res = mysql_query('SELECT CPTLEFT, CPTRIGHT, LEVEL FROM componentsri WHERE ID='.$eId);
		$req = mysql_fetch_assoc($res);
		$bgd=intval($req['CPTLEFT']); 
		$bdd=intval($req['CPTRIGHT']);
		$nivd=$req['LEVEL'];
		
		$res = mysql_query('SELECT CPTLEFT, CPTRIGHT, LEVEL FROM componentsri WHERE ID ='.$eIdParent);
		//On replace l'élément déplacé
		$req = mysql_fetch_assoc($res);
		$bgp=intval($req['CPTLEFT']);
		$bdp=intval($req['CPTRIGHT']);
		$nivp=$req['LEVEL'];
		
		//Dummy Checks
		if($eId == $eIdParent){
			echo 'Dummy check :> Same element';
			return false;
		}
		//Le ""parent"" est enfant du déplacé.
		if($bgp >= $bgd && $bdp <= $bdd){
			//Vulkins 1-4 (d)
			//Sous 2-3 (p)
			//2 > 1 & 3 < 4; vrai
			echo 'Dummy check :> IsSpecifiedParentAChild() returned true;';
			return false;
		}
		
		
		$deltaB=$bdmax + 1 - $bgd;
		if(!$eRecurs){
			//Déplacement en fin de liste
			mysql_query(sprintf("UPDATE componentsri SET CPTLEFT = CPTLEFT + %d, CPTRIGHT = CPTRIGHT + %d WHERE ID=%d",$deltaB, $deltaB, $eId));
			//Enfants de l'élément remontent d'un niveau.
			mysql_query('UPDATE componentsri SET CPTLEFT = CPTLEFT -1, CPTRIGHT = CPTRIGHT - 1, LEVEL = LEVEL-1
						WHERE CPTLEFT > '.$bgd.' AND CPTRIGHT < '.$bdd);
			
			//On bouche le trou de l'arbre
			mysql_query('UPDATE componentsri SET CPTLEFT = CPTLEFT-2 WHERE CPTLEFT > '.$bdd.' AND CPTLEFT < '.$bdmax);
			mysql_query('UPDATE componentsri SET CPTRIGHT = CPTRIGHT-2 WHERE CPTRIGHT > '.$bdd.' AND CPTRIGHT <= '.$bdmax);
			
			$res = mysql_query('SELECT CPTLEFT, CPTRIGHT, LEVEL FROM componentsri WHERE ID ='.$eIdParent);
		//On replace l'élément déplacé
		$req = mysql_fetch_assoc($res);
		$bgp=$req['CPTLEFT'];
		$bdp=$req['CPTRIGHT'];
		$nivp=$req['LEVEL'];
		
			switch($eMode){
			case 'FC':
				mysql_query('UPDATE componentsri SET CPTRIGHT = CPTRIGHT+2 WHERE CPTRIGHT >= '.$bdp.' AND CPTRIGHT <= '.$bdmax);
				mysql_query('UPDATE componentsri SET CPTLEFT = CPTLEFT+2 WHERE CPTLEFT > '.$bdp.' AND CPTLEFT < '.$bdmax);
				mysql_query('UPDATE componentsri SET CPTLEFT='.$bdp.', CPTRIGHT='.$bdp.'+1, LEVEL='.$nivp.'+1 WHERE ID = '.$eId);
				break;
			case 'FA':
				mysql_query('UPDATE componentsri SET CPTRIGHT = CPTRIGHT+2 WHERE CPTRIGHT > '.$bgp.' AND CPTRIGHT <= '.$bdmax);
				mysql_query('UPDATE componentsri SET CPTLEFT = CPTLEFT+2 WHERE CPTLEFT > '.$bgp.' AND CPTLEFT < '.$bdmax);
				mysql_query('UPDATE componentsri 
             SET CPTLEFT = '.$bgp.' + 1, 
                 CPTRIGHT = '.$bgp.' + 2, 
                 LEVEL = '.$nivp.' +1
             WHERE ID = '.$eId) or die(mysql_error());
				break;
			case 'GF':
				mysql_query('UPDATE componentsri SET CPTRIGHT = CPTRIGHT+2 WHERE CPTRIGHT >= '.$bdp.' AND CPTRIGHT <= '.$bdmax);
				mysql_query('UPDATE componentsri SET CPTLEFT = CPTLEFT+2 WHERE CPTLEFT >= '.$bgp.' AND CPTLEFT < '.$bdmax);
				mysql_query('UPDATE componentsri 
             SET CPTLEFT = '.$bgp.', 
                 CPTRIGHT = '.$bgp.' + 1, 
                 LEVEL = '.$nivp.' 
             WHERE ID = '.$eId) or die(mysql_error());
				break;
			case 'PF':
				mysql_query('UPDATE componentsri SET CPTRIGHT = CPTRIGHT+2 WHERE CPTRIGHT > '.$bdp.' AND CPTRIGHT <= '.$bdmax);
				mysql_query('UPDATE componentsri SET CPTLEFT = CPTLEFT+2 WHERE CPTLEFT > '.$bdp.' AND CPTLEFT < '.$bdmax);
				mysql_query('UPDATE componentsri 
             SET CPTLEFT = '.$bdp.' + 1, 
                 CPTRIGHT = '.$bdp.' + 2, 
                 LEVEL = '.$nivp.' 
             WHERE ID = '.$eId) or die(mysql_error());
				break;
			}
		} else {
			//Déplacement en fin de liste
			mysql_query(sprintf("UPDATE componentsri SET LEVEL = LEVEL - %d, CPTLEFT = CPTLEFT + %d, CPTRIGHT = CPTRIGHT + %d WHERE CPTLEFT >= %d AND CPTRIGHT <= %d",$nivd,$deltaB, $deltaB, $bgd, $bdd));
			//On nettoie
			
			$deltaB = $bdd-$bgd+1;
			
			//mysql_query('UPDATE componentsri SET CPTLEFT = CPTLEFT -1, CPTRIGHT = CPTRIGHT - 1, LEVEL = LEVEL-1
			//			WHERE CPTLEFT > '.$bgd.' AND CPTRIGHT < '.$bdd);
			//On bouche le trou de l'arbre
			mysql_query('UPDATE componentsri SET CPTRIGHT = CPTRIGHT-'.$deltaB.' WHERE CPTRIGHT > '.$bdd.' AND CPTRIGHT <= '.$bdmax);
			mysql_query('UPDATE componentsri SET CPTLEFT = CPTLEFT-'.$deltaB.' WHERE CPTLEFT > '.$bdd.' AND CPTLEFT < '.$bdmax);
			//return;
			$res = mysql_query('SELECT CPTLEFT, CPTRIGHT, LEVEL FROM componentsri WHERE ID ='.$eIdParent);
		//On replace l'élément déplacé
		$req = mysql_fetch_assoc($res);
		$bgp=$req['CPTLEFT'];
		$bdp=$req['CPTRIGHT'];
		$nivp=$req['LEVEL'];
		
			switch($eMode){
			case 'FC':
				mysql_query('UPDATE componentsri SET CPTRIGHT = CPTRIGHT+'.$deltaB.' WHERE CPTRIGHT >='.$bdp.' AND CPTRIGHT <= '.$bdmax);
				mysql_query('UPDATE componentsri SET CPTLEFT = CPTLEFT+'.$deltaB.' WHERE CPTLEFT > '.$bdp.' AND CPTLEFT < '.$bdmax);
				$deltaB = $bdmax - $bdp +1;
				mysql_query('UPDATE componentsri 
             SET CPTLEFT = CPTLEFT - '.$deltaB.', 
                 CPTRIGHT = CPTRIGHT - '.$deltaB.', 
                 LEVEL = LEVEL + '.$nivp.' +1
             WHERE CPTLEFT > '.$bdmax) or die(mysql_error());
				break;
			case 'FA':
				mysql_query('UPDATE componentsri SET CPTRIGHT = CPTRIGHT+'.$deltaB.' WHERE CPTRIGHT >'.$bgp.' AND CPTRIGHT <= '.$bdmax);
				mysql_query('UPDATE componentsri SET CPTLEFT = CPTLEFT+'.$deltaB.' WHERE CPTLEFT > '.$bgp.' AND CPTLEFT < '.$bdmax);
				$deltaB = $bdmax - $bgp;
				mysql_query('UPDATE componentsri 
             SET CPTLEFT = CPTLEFT - '.$deltaB.', 
                 CPTRIGHT = CPTRIGHT - '.$deltaB.', 
                 LEVEL = LEVEL + '.$nivp.' +1
             WHERE CPTLEFT > '.$bdmax) or die(mysql_error());
				break;
			case 'GF':
				mysql_query('UPDATE componentsri SET CPTRIGHT = CPTRIGHT+'.$deltaB.' WHERE CPTRIGHT > '.$bgp.' AND CPTRIGHT <= '.$bdmax);
				mysql_query('UPDATE componentsri SET CPTLEFT = CPTLEFT+'.$deltaB.' WHERE CPTLEFT >= '.$bgp.' AND CPTLEFT < '.$bdmax);
				$deltaB = $bdmax - $bgp +1;
				mysql_query('UPDATE componentsri 
             SET CPTLEFT = CPTLEFT - '.$deltaB.', 
                 CPTRIGHT = CPTRIGHT - '.$deltaB.', 
                 LEVEL = LEVEL + '.$nivp.' 
             WHERE CPTLEFT > '.$bdmax) or die(mysql_error());
				break;
			case 'PF':
				mysql_query('UPDATE componentsri SET CPTRIGHT = CPTRIGHT+'.$deltaB.' WHERE CPTRIGHT > '.$bdp.' AND CPTRIGHT <= '.$bdmax);
				mysql_query('UPDATE componentsri SET CPTLEFT = CPTLEFT+'.$deltaB.' WHERE CPTLEFT > '.$bdp.' AND CPTLEFT < '.$bdmax);
				$deltaB = $bdmax - $bdp;
				mysql_query('UPDATE componentsri 
             SET CPTLEFT = CPTLEFT - '.$deltaB.', 
                 CPTRIGHT = CPTRIGHT - '.$deltaB.', 
                 LEVEL = LEVEL + '.$nivp.' 
             WHERE CPTLEFT > '.$bdmax) or die(mysql_error());
				break;
			}
		}
		
		return true;
	}

?>


Dans ce cas, l'utilisation de la procédure stockée aura un effet positif sur le serveur SQL; car, bien qu'en ajoutant une partie traitement au serveur SQL, on évite de nombreux allers-retours Web <=> SGBDR. De plus, la procédure stockée utilise une transaction qui évite de faire n'importe quoi avec l'arbre :D .
Hors ligne heaster # Posté le 04/03/2010 à 13:49:19
Avatar

Ville : Bierwart
Pays : Belgique

en fait , le but des procédures stockées est surtout pour éviter de devoir compiler les requêtes SQL dans du code , il faut écrire les requêtes dans des procédures stockées que l'on stock sur la base de donnée , et ainsi , dans l'application , on ne fait appel que a la procédure et non a une requête complexe , cela est plus facile pour maintenir l'application , ou le site web et cela permet aussi de changer une requête sans avoir a modifier tout le code.

rendre une salutation n'est rien comparer au fait la formuler en premier
 
Hors ligne remybdx # Posté le 21/12/2010 à 21:17:29
Avatar

Avis : Mitigé

Ville : La bréde
Pays : France métropolitaine

Bonjour,
Il manque une bonne définition pratique, claire et précise dans l'introduction ;)

Autres pseudos: RJJ, qzdbdx, movox ,azeza, aze098
Zero depuis 2007 \o/
 
Hors ligne leki006 # Posté le 03/02/2011 à 19:10:43

Bonjour, ce tutoriel est exactement ce que je recherchais, mais je ne sais pas utiliser MySQL en ligne de commande.

Je suis sous Windows XP et Wampserver 2.0

J'ouvre une ligne de commande mais je n'arrive pas à lancer mysql, quelqu'un pourrait-il m'aider ?
Hors ligne leki006 # Posté le 04/02/2011 à 17:18:46

Re, mon problème avait une solution bien simple ^^

cliquer sur l'icône Wampserver > Mysql > console Mysql

LOL
Hors ligne capitaine ad-hoc # Posté le 02/04/2011 à 20:32:27

Tutoriel très intéressant

Petit détail dérangeant : "Definer, mais j'y reviendrai plus tard."

Mais tu ny reviens jamais. Un petit chapitre sur les DEFINER serait intéressant.
Connecté nabla's # Posté le 25/08/2011 à 11:04:19

Avis : Bon

Merci bien. Je passais par là plutôt pour avoir un éditeur... malheureusement tu ne parles que de la console.. Personnelement ca me donne des boutons.

A mon grand regret, phpmyadmin ne gère pas à ma connaissance les procédures stockées. Je vous invite donc à utiliser TOAD for MySQL (freeware :) ) ou un des autres logiciels décrit sur ce site:
http://mysql.developpez.com/outils/?pa [...] -desktop#toad

En tout cas, bonne initiation ...
Un exemple plus complet avec un appel depuis php ou autres langages serait toutefois le bienvenu
Hors ligne SONIK340 # Posté le 06/04/2012 à 12:34:12
Let's try to beat the byte !
Avatar

Avis : Très bon

Études : SUPMECA Paris

Excellent tuto. Il faudrait le rattacher au tutoriel général de MySQL (pour plus de visibilité), peut-être faire un lien...

Pour ce qui de l'éditeur, pour MySQl je propose "Toad for MySQL" il est excellent et très professionel (du moins pour moi)

"A bove ante, ab asino retro, a stulto undique caveto" ... c'est pas faux du tout !
 
Pour accéder à cette section
Connectez-vous !
connexion_rpx