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 03/11/2006, 11h05   #1
Membre du Club
 
Inscription : novembre 2006
Messages : 120
Détails du profil
Informations forums :
Inscription : novembre 2006
Messages : 120
Points : 55
Points : 55
Par défaut Problème de déclarations de variables dans une procédure mysql

Bonjour,

J'ai vu plusieurs postes traitant de ce sujet sur le forum mais malheureusement aucun n'allait assez loin dans la solution proposée.

J'ai une procédure stockée qui fait appel à un curseur.

DELIMITER //
CREATE PROCEDURE debou_abrev ()
DECLARE cabrev CURSOR FOR select abreviations,correction from abreviation;
BEGIN
for enreg in cabrev
loop
update clients, abreviation
set clients.adr2=REPLACE(clients.adr2,abreviations,correction);
end loop;
END //;

Comme j'ai lu sur différents postes que le problème pouvait être lié à des délimiteurs j'ai même mis en place cette évolution sur ma procédure.

Mais même dans ce cas elle ne fonctionne toujours pas. Le message d'erreur (selon l'interpreteur de ligne de commande de mysql 5.0.24) est:

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 'DECLA
RE cabrev CURSOR FOR select abreviations,correction from abreviation;
BEGIN' at line 2.

Ce que juge de ce message d'erreur, c'est qu'il n'arrive pas à interpréter la commande declare.

J'espère que quelqu'uns saura m'apporter la solution.

Merci d'avance,
beberd est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/11/2006, 11h18   #2
Provisoirement toléré
 
Avatar de Maximilian
 
Inscription : juin 2003
Messages : 2 622
Détails du profil
Informations forums :
Inscription : juin 2003
Messages : 2 622
Points : 2 505
Points : 2 505
Salut,

Le moins qu'on puisse dire c'est que ta syntaxe n'est pas très catholique (DECLARE avant le BEGIN et boucle for bizarre...)

Regarde ici pour un exemple d'utilisation des curseurs : http://dev.mysql.com/doc/refman/5.0/en/cursors.html
__________________
Pensez au bouton
Maximilian est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/11/2006, 11h25   #3
Membre du Club
 
Inscription : novembre 2006
Messages : 120
Détails du profil
Informations forums :
Inscription : novembre 2006
Messages : 120
Points : 55
Points : 55
La boucle for utilisé c'est typiquement de l'oracle.
Pour l'histoire du begin après la déclaration de mon curseur c'est une info que j'ai lu sur un autre poste.

Effectivement pour avoir modifié la syntaxe de du begin et du declare, je n'ai plus l'erreur j'en ai une autre lié à ma boucle for.

Il faut toujours modifié une chose à la foix pour identifier un problème !!!!
beberd est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/11/2006, 11h39   #4
Membre du Club
 
Inscription : novembre 2006
Messages : 120
Détails du profil
Informations forums :
Inscription : novembre 2006
Messages : 120
Points : 55
Points : 55
Je reviens à la charge avec quelque chose de tout bête.
Le create procedure exécute t-il cette derniere ?
Y a t'il une commande à lancer pour ensuite execute cette procédure ?
beberd est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/11/2006, 11h46   #5
Provisoirement toléré
 
Avatar de Maximilian
 
Inscription : juin 2003
Messages : 2 622
Détails du profil
Informations forums :
Inscription : juin 2003
Messages : 2 622
Points : 2 505
Points : 2 505
Citation:
Envoyé par beberd
Le create procedure exécute t-il cette derniere ?
Non. En ce qui concerne l'exécution tout est précisé dans la doc
__________________
Pensez au bouton
Maximilian est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/11/2006, 11h54   #6
Membre du Club
 
Inscription : novembre 2006
Messages : 120
Détails du profil
Informations forums :
Inscription : novembre 2006
Messages : 120
Points : 55
Points : 55
Merci maximilian,

En même temps dans la doc il dise de lancer un call nom_procedure et sa fonctionne.

En locurrence dans mon cas sous l'interpreteur de commande de mysql quand j'ouvre le call et que je met derrière le nom de ma procédure ; le prompt ne se ferme pas c'est comme si il attendait un paramètre en entrer.
Mais ni en entrer, ni en sortie je n'utilise de variables.

DELIMITER //
CREATE PROCEDURE dedou_abrev ()
BEGIN
DECLARE a VARCHAR(10);
DECLARE b VARCHAR(50);
DECLARE cabrev CURSOR FOR select abreviations,correction from abreviation;
open cabrev;
loop
fetch cabrev into a,b;
update clients
set clients.adr2=REPLACE(clients.adr2,a,b);
end loop;
END //

Pour expliquer le but de cette procédure; c'est de modifier dans un champs adresse les abréviations utilisés par certains clients.
beberd est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/11/2006, 12h34   #7
Provisoirement toléré
 
Avatar de Maximilian
 
Inscription : juin 2003
Messages : 2 622
Détails du profil
Informations forums :
Inscription : juin 2003
Messages : 2 622
Points : 2 505
Points : 2 505
Citation:
Envoyé par beberd
En locurrence dans mon cas sous l'interpreteur de commande de mysql quand j'ouvre le call et que je met derrière le nom de ma procédure ; le prompt ne se ferme pas c'est comme si il attendait un paramètre en entrer.
Tu as saisi le délimiteur derrière ?
__________________
Pensez au bouton
Maximilian est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/11/2006, 13h49   #8
Membre du Club
 
Inscription : novembre 2006
Messages : 120
Détails du profil
Informations forums :
Inscription : novembre 2006
Messages : 120
Points : 55
Points : 55
effectivement c'est mieux!!!
par contre ce que je ne comprends pas c'est pourquoi il ne se passe rien?

ERROR 1329 (02000): No data - zero rows fetched, selected, or processed

DELIMITER //
CREATE PROCEDURE dedou_abrev ()
BEGIN
DECLARE a VARCHAR(10);
DECLARE b VARCHAR(50);
DECLARE cabrev CURSOR FOR select abreviations,correction from abreviation;
open cabrev;
loop
fetch cabrev into a,b;
update clients
set clients.adr2=REPLACE(clients.adr2,a,b);
end loop;
END //

elle devrait en toute logique modifier le champs adresse dans la table clients en prenant pour paramètre chaque valeur de la table abreviation
beberd est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/11/2006, 15h55   #9
Membre du Club
 
Inscription : novembre 2006
Messages : 120
Détails du profil
Informations forums :
Inscription : novembre 2006
Messages : 120
Points : 55
Points : 55
Merci maximilian pour toutes ses informations !!!
Le problème est résolu, il me reste plus qu'à pirater la poste pour trouver toutes les abréviations existantes dans le monde
beberd 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 23h12.


 
 
 
 
Partenaires

Hébergement Web