IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL Procédural MySQL Discussion :

problème pour créer une procédure stockée


Sujet :

SQL Procédural MySQL

  1. #1
    Membre habitué Avatar de PoichOU
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2006
    Messages
    328
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juillet 2006
    Messages : 328
    Points : 161
    Points
    161
    Par défaut problème pour créer une procédure stockée
    Bonjour à tous

    Je souhaitarai créer une procèdure stockée sous mysql j'ai je rencontre un petit soucis, quelqu'un pourrait m'aider ?

    Je ne m'y connais pas très très bien mais je me suis basé sur : le site mysql.com


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    delimiter |
    	DROP TABLE IF EXISTS `ma_table` |
     
    	CREATE TABLE `ma_table` (
    		`id` int(11) NOT NULL auto_increment, 
    		`nom` varchar(100) NOT NULL,
    		`number` int(11) NOT NULL,
    		KEY `id` (`id`)
    	) |
     
     
    	DROP PROCEDURE IF EXISTS `PROC_ADD_TN` |
    	CREATE PROCEDURE PROC_ADD_TN
    	(
    		IN _nom VARCHAR(100),
    		IN _number VARCHAR(100),
    		OUT _id	INTEGER(11)
    	)
    	BEGIN
    		SET AUTOCOMMIT=0;
    		SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
    		DECLARE numberDix INTEGER(11);
    		SET numberDix = _number * 10;
    		INSERT INTO ma_table (nom,number) values (_nom,numberDix);
    		COMMIT ;
    		RETURN SELECT LAST_INSERT_ID();
    	END |
    delimiter ;
    edit : j'ai oublié de préciser que j'ai l'erreur suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ERROR 1064 (42000): 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 'DECLARE numberDix INTEGER(11);
    j'espère que quelqu'un pourra m'aider.

    Merci d'avance
    PoichOU

  2. #2
    Expert éminent
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 903
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 903
    Points : 6 027
    Points
    6 027
    Par défaut
    Il faut bien lire jusqu'au bout...

    Citation Envoyé par 19.2.8. La commande DECLARE
    DECLARE ne peut être utilisé dans un bloc BEGIN ... END, et doit intervenir au début de la routine, avant tout autre commande.
    "Il n'y a pas de bonnes réponses à une mauvaise question." (M. Godet)
    -----------------------
    Pensez à cloturer votre sujet - Aucune réponse aux sollicitations techniques par MP
    Usus magister est optimus

  3. #3
    Membre habitué Avatar de PoichOU
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2006
    Messages
    328
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juillet 2006
    Messages : 328
    Points : 161
    Points
    161
    Par défaut


    mais quel boulet de me casser la tête alors que c'était sous mes yeux !

    merci beaucoup qi130


    edit : en fait je viens de tester et ça marche pas non plus

    voici mon code, c'est bien ça non ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    delimiter |
    	DROP TABLE IF EXISTS `ma_table` |
     
    	CREATE TABLE `ma_table` (
    		`id` int(11) NOT NULL AUTO_INCREMENT, 
    		`nom` varchar(100) NOT NULL,
    		`number` int(11) NOT NULL,
    		KEY `id` (`id`)
    	) |
     
     
    	DROP PROCEDURE IF EXISTS `PROC_ADD_TN` |
    	CREATE PROCEDURE PROC_ADD_TN
    	(
    		IN _nom VARCHAR(100),
    		IN _number VARCHAR(100),
    		OUT _id	INTEGER(11)
    	)
    	DECLARE numberDix INTEGER(11);
    	BEGIN
    		SET AUTOCOMMIT=0;
    		SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
    		SET numberDix = _number * 10;
    		INSERT INTO ma_table (nom,number) VALUES (_nom,numberDix);
    		COMMIT ;
    		RETURN SELECT LAST_INSERT_ID();
    	END |
    delimiter ;

  4. #4
    Membre habitué Avatar de PoichOU
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2006
    Messages
    328
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juillet 2006
    Messages : 328
    Points : 161
    Points
    161
    Par défaut
    J'ai essayé de mettre int au lieu de integer mais ça ne marche toujours pas

    voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    delimiter |
    	DROP TABLE IF EXISTS `ma_table` |
     
    	CREATE TABLE `ma_table` (
    		`id` int(11) NOT NULL AUTO_INCREMENT, 
    		`nom` varchar(100) NOT NULL,
    		`number` int(11) NOT NULL,
    		KEY `id` (`id`)
    	) |
     
    	DROP PROCEDURE IF EXISTS `PROC_ADD_TN` |
    	CREATE PROCEDURE PROC_ADD_TN
    	(
    		IN _nom VARCHAR(100),
    		IN _number VARCHAR(100),
    		OUT _id	int(11)
    	)
    	DECLARE numberDix int(11);
    	BEGIN
    		SET AUTOCOMMIT=0;
    		SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
    		SET numberDix = _number * 10;
    		INSERT INTO ma_table (nom,number) VALUES (_nom,numberDix);
    		COMMIT ;
    		RETURN SELECT LAST_INSERT_ID();
    	END |
    delimiter ;
    et voici l'erreur que j'ai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ERROR 1064 (42000): Erreur de syntaxe près de 'SET AUTOCOMMIT=0;
     SET TRANSACTION ISOLATION LEVEL SERIALIZABL' à la ligne 2 
    Quelqu'un aurait une idée ?

    PoichOU

  5. #5
    Expert éminent
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 903
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 903
    Points : 6 027
    Points
    6 027
    Par défaut
    2 idées en fait....

    1/ mentionne SESSION ou GLOBAL, la doc laisse penser qu'un des 2 termes est nécessaire.
    2/ je ne sais pas comment MySQL va réagir sur cette instruction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SET numberDix = _number * 10;
    -> c'est un calcul sur 1 chaine... le transtypage est-il automatique ?
    -> si oui, un nombre de 100 chiffres respect !
    "Il n'y a pas de bonnes réponses à une mauvaise question." (M. Godet)
    -----------------------
    Pensez à cloturer votre sujet - Aucune réponse aux sollicitations techniques par MP
    Usus magister est optimus

  6. #6
    Membre habitué Avatar de PoichOU
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2006
    Messages
    328
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juillet 2006
    Messages : 328
    Points : 161
    Points
    161
    Par défaut
    J'ai trouvé en fait l'erreur se situe à ce niveau.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RETURN SELECT LAST_INSERT_ID();
    Apparement, une proc ne retourne rien, il faut donc mettre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT LAST_INSERT_ID() into _id;


    ce qui donne au final
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    delimiter |
    	DROP TABLE IF EXISTS `ma_table` |
     
    	CREATE TABLE `ma_table` (
    		`id` int(11) NOT NULL AUTO_INCREMENT, 
    		`nom` varchar(100) NOT NULL,
    		`number` int(11) NOT NULL,
    		KEY `id` (`id`)
    	) |
     
    	DROP PROCEDURE IF EXISTS `PROC_ADD_TN` |
    	CREATE PROCEDURE PROC_ADD_TN
    	(
    		IN _nom VARCHAR(100),
    		IN _number INTEGER(100),
    		OUT _id	int(11)
    	)
    	BEGIN
    		DECLARE numberDix int(11);
    		SET AUTOCOMMIT=0;
    		SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
    		SET numberDix = _number * 10;
    		INSERT INTO ma_table (nom,number) VALUES (_nom,numberDix);
    		COMMIT ;
    		SELECT LAST_INSERT_ID() into _id;
    	END |
    delimiter ;

    et voilà
    PoichOU

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Créer une procédure stockée sous MySQL avec phpmyadmin
    Par Jordan59 dans le forum SQL Procédural
    Réponses: 11
    Dernier message: 17/08/2011, 14h08
  2. Réponses: 18
    Dernier message: 04/04/2007, 14h34
  3. Problème pour créer une illumination par dôme de lumière
    Par m-matthieu dans le forum Développement 2D, 3D et Jeux
    Réponses: 1
    Dernier message: 09/11/2006, 13h54
  4. Problème pour créer une clé étrangère
    Par DevloNewb' dans le forum Requêtes
    Réponses: 5
    Dernier message: 01/07/2006, 16h30
  5. Créer une procédure stockée depuis Delphi
    Par blonde dans le forum Bases de données
    Réponses: 10
    Dernier message: 10/03/2006, 11h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo