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 08/09/2008, 16h26   #1
Membre Expert
 
Avatar de fregolo52
 
Homme
Développeur C
Inscription : août 2004
Messages : 1 460
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur C

Informations forums :
Inscription : août 2004
Messages : 1 460
Points : 2 070
Points : 2 070
Par défaut Syntaxe MySql (but faire une procédure stockée)

Bonjour,

Je me remets tout doucement aux SGDB. Ca fait environ 2ans que je n'ai pas fait de SQL (j'étais sous SQL Server).

Maintenant je suis sous MySql et j'ai quelques soucis, j'ai téléchargé MySQL Query Browser pour me faciliter la tâche.
Mon but est de faire une procédure stockée qui va chercher des éléments dans une table, et suivi le résultat, d'autres requêtes seront faites, donc dans cette procédure stockées il y aura plusieurs lignes de code exécutées.

J'ai trouvé des exemples dans des forum, mais jamais avec la même syntaxe, ça me déroute un peu :
Code :
1
2
3
Declare strSQL
SET strSQL = 'SELECT * FROM operation'
exec strSQL
le message d'erreur est le suivant :
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 strSQL
SET strSQL = 'SELECT * FROM operation'
exec strSQL' at line 1

J'ai aussi essayé la syntaxe SQL Server :
Code :
1
2
3
Declare @strSQL char(200)
SET @strSQL = 'SELECT * FROM operation'
exec (@strSQL)

J'ai essayer de mettre des ; en fin de ligne, mais je n'ai pas trop de succès.
J'ai supprimé la commande exec qui n'existe peut-etre pas sous MySql.
Code :
1
2
DECLARE strSQL CHAR(200);
SET strSQL = 'SELECT * FROM operations';
J'ai toujours le même style d'erreurs :
Script line: 1 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 strSQL CHAR(200)' at line 1
Script line: 2 Unknown system variable 'strSQL'

Quelqu'un aurait un lien vers une bonne source de doc à propos des scripts MySQL (version 5.0) ?

Merci
fregolo52 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/09/2008, 15h37   #2
Rédacteur/Modérateur
 
Avatar de MaitrePylos
 
Homme Gérard Ernaelsten
DBA & Dev PHP
Inscription : juin 2005
Messages : 3 183
Détails du profil
Informations personnelles :
Nom : Homme Gérard Ernaelsten
Âge : 39
Localisation : Belgique

Informations professionnelles :
Activité : DBA & Dev PHP
Secteur : Service public

Informations forums :
Inscription : juin 2005
Messages : 3 183
Points : 6 470
Points : 6 470
Perso je les fais comme ceci.

Code :
1
2
3
4
5
 
CREATE PROCEDURE `strSQL`()
BEGIN
SELECT * FROM operation;
END
MaitrePylos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/09/2008, 16h48   #3
Membre Expert
 
Avatar de fregolo52
 
Homme
Développeur C
Inscription : août 2004
Messages : 1 460
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur C

Informations forums :
Inscription : août 2004
Messages : 1 460
Points : 2 070
Points : 2 070
En fait, je me suis mal exprimé, ce n'est pas aussi simple !
Je fais une procédure stockée qui fait plusieurs choses.
- Je récupère des éléments dans une table (de téléchargement) en faisant un select distinct (avec un curseur)
Code :
DECLARE cur CURSOR FOR SELECT DISTINCT `serial_number` FROM `downloading`
- apres rescrute la table pour faire des 'select count(*)' de chaque éléments pour savoir lesquels ont eu des échecs et combien d'échecs de téléchargements.
- je stocke ce résultat dans une table temporaire

J'essaie d'utiliser les CURSOR (là ça va) et les tables temporaires (là ça coince), j'ai donc créé des tables non TEMPORARY.

J'essaie aussi de créer des requêtes dans la procédure en fonction de certains paramètres comme :
Code :
1
2
3
4
5
6
   SET @matable = CONCAT('table_tmp_', CAST(user_id AS CHAR(5)));
 
    SET @strsql = concat('DROP TABLE IF EXISTS `production`.', @matable);
    PREPARE stmt2 FROM @strsql;
    execute stmt2;
    DEALLOCATE PREPARE stmt2;
j'ai trouvé cette syntaxe, qui devrait être correcte, sur les forum, mais le serveur me retourne :
Unknown prepared statement handler (strsql) given to EXECUTE

Je fais mes test avec MySQL Query Browser. Par contre, j'ai fait un test avec MySQL Command Line Client, avec exactement la même syntaxe, je n'ai pas d'erreur.

J'ai encore beaucoup de mal avec la syntaxe MySQL, à quoi servent les '@' par exemple. Le script de création de la procédure ne retourne aucune erreur, mais je me demande quand même si ne n'ai pas fait des erreurs.

Merci pour votre aide.
fregolo52 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/09/2008, 04h40   #4
Expert Confirmé
 
Avatar de Alain Defrance
 
Homme Alain DEFRANCE
Project Lead
Inscription : août 2007
Messages : 1 993
Détails du profil
Informations personnelles :
Nom : Homme Alain DEFRANCE
Âge : 24
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Project Lead

Informations forums :
Inscription : août 2007
Messages : 1 993
Points : 2 919
Points : 2 919
Envoyer un message via MSN à Alain Defrance Envoyer un message via Skype™ à Alain Defrance
Bonjour,

construire la requête sous forme de chaîne de caractères peut être effectivement une solution.
Apparemment d'après le message d'erreur l'erreur ne se situe pas dans le bout de code que tu nous a premièrement montré. peut-tu nous montrer la requête complète ?

__________________
http://alaindefrance.wordpress.com - http://www.alain-defrance.com
Certifications : SCJP6 - SCWCD5 - SCBCD5 - SCMAD1
Project Lead eXo Social
Java Black Belt - Java Black Belt Coach
Alain Defrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/09/2008, 09h48   #5
Membre Expert
 
Avatar de fregolo52
 
Homme
Développeur C
Inscription : août 2004
Messages : 1 460
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur C

Informations forums :
Inscription : août 2004
Messages : 1 460
Points : 2 070
Points : 2 070
Bonjour,

J'ai mis en commentaire la commande INSERT parce qu'elle devra aussi faire l'objet d'un EXECUTE.

Voici tout le 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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
DELIMITER $$
 
DROP PROCEDURE IF EXISTS `production`.`liste`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE  `production`.`liste`(IN user_id INT, IN operation INT)
BEGIN
 
    DECLARE sn TEXT;
    DECLARE i INT;
 
 
    DECLARE done INT DEFAULT 0;
    DECLARE cur CURSOR FOR SELECT DISTINCT `serial_number` FROM `downloading` WHERE `operation_number`= operation;
   DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
 
   SET @tableTmp = CONCAT('count_liste', CAST(user_id AS CHAR(5)));
 
    SET @strsql = concat('DROP TABLE IF EXISTS `production`.', @tableTmp);
    PREPARE stmt2 FROM @strsql;
    execute stmt2;
    DEALLOCATE PREPARE stmt2;
 
 
    SET @strsql = "CREATE TABLE  `production`.";
    SET @strsql = concat(@strsql, @tableTmp," (
          `serial_number` varchar(100) NOT NULL default '',
          `nb_erreur` int(11) NOT NULL default '0',
          PRIMARY KEY  (`serial_number`)
          ) ENGINE=MyISAM DEFAULT CHARSET=latin1;");
 
    execute strsql;
 
    OPEN cur;
    REPEAT
        FETCH cur INTO sn;
        IF NOT done THEN
            SET i = (SELECT count(*) FROM `downloading` WHERE `serial_number` = sn);
--            INSERT INTO `production`.@tableTmp (`serial_number`, `nb_erreur`)
--              VALUES(sn, i);
        END IF;
    UNTIL done END REPEAT;
    CLOSE cur;
 
    SELECT * FROM `production`.r WHERE `nb_erreur` > 1;
END $$
 
DELIMITER ;
Je me remet doucement au SQL, le code n'est surement pas propre.

J'aurais aussi une question, ca marche bien quand je claque tout en dur. Pourque le SELECT de la dernière ligne me retourne une erreur me disant que la table n'existe pas quand je fait CREATE TEMPORARY TABLE. Il y a des 'GO' (ou équivalent) à mettre comme dans SQL Server ?

Vu que je débute en MySQL , je ne sais pas si c'est une erreur de syntaxe ou un problème de config du serveur.

Merci
fregolo52 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/09/2008, 11h17   #6
Membre Expert
 
Avatar de fregolo52
 
Homme
Développeur C
Inscription : août 2004
Messages : 1 460
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur C

Informations forums :
Inscription : août 2004
Messages : 1 460
Points : 2 070
Points : 2 070
Ca y est j'ai trouvé mon erreur.

Pourtant la description de l'erreur était explicite
fregolo52 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/09/2008, 13h25   #7
Expert Confirmé
 
Avatar de Alain Defrance
 
Homme Alain DEFRANCE
Project Lead
Inscription : août 2007
Messages : 1 993
Détails du profil
Informations personnelles :
Nom : Homme Alain DEFRANCE
Âge : 24
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Project Lead

Informations forums :
Inscription : août 2007
Messages : 1 993
Points : 2 919
Points : 2 919
Envoyer un message via MSN à Alain Defrance Envoyer un message via Skype™ à Alain Defrance
Bonjour,

laquelle est-elle ? Cela pourrait servir à d'autres.
__________________
http://alaindefrance.wordpress.com - http://www.alain-defrance.com
Certifications : SCJP6 - SCWCD5 - SCBCD5 - SCMAD1
Project Lead eXo Social
Java Black Belt - Java Black Belt Coach
Alain Defrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/09/2008, 11h16   #8
Membre Expert
 
Avatar de fregolo52
 
Homme
Développeur C
Inscription : août 2004
Messages : 1 460
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur C

Informations forums :
Inscription : août 2004
Messages : 1 460
Points : 2 070
Points : 2 070
En fait, au lieu de faire l'équivalent de :
Code :
1
2
3
4
    SET @strsql = concat('DROP TABLE IF EXISTS `production`.', @tableTmp);
    PREPARE stmt2 FROM @strsql;
    execute stmt2;
    DEALLOCATE PREPARE stmt2;
J'ai fait :
Code :
1
2
    SET @strsql = concat('DROP TABLE IF EXISTS `production`.', @tableTmp);
    execute @strsql;
L'erreur est au niveau de la requete "CREATE TABLE", dans le code que j'avais posté.

Erreur toute bête, mais quand on est à fond dedans on se rend plus compte des grosses bêtises qu'on fait, elle était pourtant simple à trouver.
fregolo52 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 22h19.


 
 
 
 
Partenaires

Hébergement Web