Précédent   Forum des professionnels en informatique > Bases de données > MySQL > SQL Procédural
SQL Procédural Forum d'entraide sur les triggers, les procédures stockées et les fonctions en MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 01/09/2007, 15h22   #1
Membre habitué
 
Avatar de PoichOU
 
Homme PoichOU
Étudiant
Inscription : juillet 2006
Messages : 296
Détails du profil
Informations personnelles :
Nom : Homme PoichOU
Âge : 24
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Étudiant
Secteur : Associations - ONG

Informations forums :
Inscription : juillet 2006
Messages : 296
Points : 114
Points : 114
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 :
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 :
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
PoichOU est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/09/2007, 22h56   #2
Expert Confirmé Sénior
 
Avatar de qi130
 
Homme Pierre
Ingénieur qualité méthodes
Inscription : mars 2003
Messages : 3 726
Détails du profil
Informations personnelles :
Nom : Homme Pierre
Âge : 51
Localisation : France

Informations professionnelles :
Activité : Ingénieur qualité méthodes
Secteur : Finance

Informations forums :
Inscription : mars 2003
Messages : 3 726
Points : 4 739
Points : 4 739
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
qi130 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/09/2007, 23h08   #3
Membre habitué
 
Avatar de PoichOU
 
Homme PoichOU
Étudiant
Inscription : juillet 2006
Messages : 296
Détails du profil
Informations personnelles :
Nom : Homme PoichOU
Âge : 24
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Étudiant
Secteur : Associations - ONG

Informations forums :
Inscription : juillet 2006
Messages : 296
Points : 114
Points : 114


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 :
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 ;
PoichOU est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/09/2007, 15h47   #4
Membre habitué
 
Avatar de PoichOU
 
Homme PoichOU
Étudiant
Inscription : juillet 2006
Messages : 296
Détails du profil
Informations personnelles :
Nom : Homme PoichOU
Âge : 24
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Étudiant
Secteur : Associations - ONG

Informations forums :
Inscription : juillet 2006
Messages : 296
Points : 114
Points : 114
J'ai essayé de mettre int au lieu de integer mais ça ne marche toujours pas

voici mon code :
Code :
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 :
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
PoichOU est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/09/2007, 16h54   #5
Expert Confirmé Sénior
 
Avatar de qi130
 
Homme Pierre
Ingénieur qualité méthodes
Inscription : mars 2003
Messages : 3 726
Détails du profil
Informations personnelles :
Nom : Homme Pierre
Âge : 51
Localisation : France

Informations professionnelles :
Activité : Ingénieur qualité méthodes
Secteur : Finance

Informations forums :
Inscription : mars 2003
Messages : 3 726
Points : 4 739
Points : 4 739
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 :
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
qi130 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/09/2007, 09h58   #6
Membre habitué
 
Avatar de PoichOU
 
Homme PoichOU
Étudiant
Inscription : juillet 2006
Messages : 296
Détails du profil
Informations personnelles :
Nom : Homme PoichOU
Âge : 24
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Étudiant
Secteur : Associations - ONG

Informations forums :
Inscription : juillet 2006
Messages : 296
Points : 114
Points : 114
J'ai trouvé en fait l'erreur se situe à ce niveau.
Code :
RETURN SELECT LAST_INSERT_ID();
Apparement, une proc ne retourne rien, il faut donc mettre :
Code :
SELECT LAST_INSERT_ID() INTO _id;


ce qui donne au final
Code :
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
PoichOU est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 00h05.


 
 
 
 
Partenaires

Hébergement Web