Création d'une procédure stockée

Eléphanteau du PHP | 22 Messages

16 déc. 2008, 10:28

Bonjour,
j'ai crée un petit projet personnel d'auto formation pour visual studio (C# winForm).
J'utilisais dans mon projet un Base de Donnée MS SQL Serveur (version manager).
Mon projet porte sur le classement et la recherche de position de yoga et intéresse finalement plusieurs amis.
Je souhaite donc leurs passer le .EXE mais vu que la BD est uniquement sur mon PC sa bloque (logique).
Je souhaite donc passer la base de donnée sur mon hébergeur sous MySql 5.0.45
Là j'essaie simplement de convertir mes procédures stockées.
Voici le code de mon "ancienne" procédure :

Code : Tout sélectionner

Create PROCEDURE Select_User @user_Nom nvarchar(50), @user_Pass nvarchar(255) OUTPUT, @user_Lvl int OUTPUT AS SET @user_Pass = (SELECT usr_Pass FROM Utilisateur WHERE usr_Nom=@user_Nom) SET @user_Lvl = (SELECT usr_Lvl FROM Utilisateur WHERE usr_Nom=@user_Nom) RETURN
J'ai donc essayer de traduire cela en :

Code : Tout sélectionner

CREATE PROCEDURE Select_User (IN _userNom varchar(50), OUT _userPass varchar(255), OUT _userLvl int) BEGIN SET _userPass = (SELECT usr_Pass FROM Utilisateur WHERE usr_Nom=_userNom); SET_userLvl = (SELECT usr_Lvl FROM Utilisateur WHERE usr_Nom=_userNom); END
Mais lors de l'exécution j'obtiens l'erreur
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 5
Je cherche depuis hier après midi comment se font les procédures sous MySql et les doc que je trouve ou exemple ne me sont pas clair et n'arrive pas a trouver mon erreur ?

(Shéma de la base )

Code : Tout sélectionner

-- -------------------------------------------------------- -- -- Structure de la table `Yoga_Utilisateur` -- CREATE TABLE `Yoga_Utilisateur` ( `usr_ID` int(11) NOT NULL auto_increment, `usr_Nom` varchar(50) NOT NULL default '', `usr_Pass` varchar(255) NOT NULL default '', `usr_Lvl` int(11) NOT NULL default '0', PRIMARY KEY (`usr_ID`), UNIQUE KEY `usr_Nom` (`usr_Nom`) ) TYPE=MyISAM AUTO_INCREMENT=2 ; -- -- Contenu de la table `Yoga_Utilisateur` -- INSERT INTO `Yoga_Utilisateur` VALUES (1, 'MonNom', 'MonPassCryptéMd5', 1000);
Le coeur de l'homme est un dont de dieux.
Garde toi de le négliger. (Amenenope)

Eléphant du PHP | 254 Messages

16 déc. 2008, 11:07

Salut

Ca serait pas un probleme de DELIMITER ?

Code : Tout sélectionner

DROP PROCEDURE IF EXISTS Select_User ; DELIMITER $ CREATE PROCEDURE Select_User ( ) BEGIN SET _userPass = (SELECT usr_Pass FROM Utilisateur WHERE usr_Nom=_userNom); SET_userLvl = (SELECT usr_Lvl FROM Utilisateur WHERE usr_Nom=_userNom); END ; $ DELIMITER ;

Eléphanteau du PHP | 22 Messages

16 déc. 2008, 11:39

là j'obtiens :

Code : Tout sélectionner

1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DELIMITER $
Mais j'avoue n'avoir absolument rien compris a propos de ces delimiter.
N'auriez vous pas un tutoriel à me proposer autre que les sites :

- http://dev.mysql.com/doc/refman/5.0/fr/ ... edure.html
- http://www.journaldunet.com
- http://www.manuelphp.com/php/pdo.prepar ... ements.php
ou même nexen ?
Le coeur de l'homme est un dont de dieux.
Garde toi de le négliger. (Amenenope)

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

16 déc. 2008, 11:46

La syntaxe Mysql pour les procédures stockées varie sensiblement de celle de SQL Server et surtout au niveau de l'affectation de valeurs aux variables ou paramètres par l'instruction SELECT.

Il y a aussi le problème du délimiteur qui doit être porté à un caractère autre que ; (point virgule) qui est souvent utilisé pour séparer les requêtes à l'intérieur de la procédure.

Voici comment écrire ta procédure sous mysql:

Code : Tout sélectionner

DELIMITER $ CREATE PROCEDURE Select_User (IN _userNom varchar(50), OUT _userPass varchar(255), OUT _userLvl int) BEGIN SELECT _userPass=usr_Pass, _userLvl=usr_Lvl FROM Utilisateur WHERE usr_Nom=_userNom; END
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphanteau du PHP | 22 Messages

16 déc. 2008, 12:18

Merci à sadeq,
Maintenant je vois mieux comment je doit écrire mes procédures.

Par contre un autre soucis se présente à moi au niveau du DELIMITER (me suis renseigné a son sujet entre temps et voie clairement son utilité) mais je me demande si il est possible que l'hébergeur bloque cette commande ? (J'en doute sa serrais vraiment stupide de le faire)
Car quand je met le DELIMITER dans la requête j'obtient

Code : Tout sélectionner

MySQL a répondu:Documentation #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DELIMITER $' at line 1

EDIT : 16h00
RUTUDJUUUU!!!
depuis ce matin je suis sur mon DELIMITER et l'hébergeur est en phpmyadmin 2.6 si je ne m'abuse c'est à la version 2.10 que sa gère le DELIMITER non ?
Le coeur de l'homme est un dont de dieux.
Garde toi de le négliger. (Amenenope)