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 21/10/2006, 22h58   #1
Membre régulier
 
Inscription : juin 2004
Messages : 247
Détails du profil
Informations forums :
Inscription : juin 2004
Messages : 247
Points : 70
Points : 70
Par défaut Grouper un bloc de fonctions mysql

Bonjour,

Je souhaite executer plusieurs requetes SQL (update) mais je veux executer celles-ci seulement si aucune ne retournent d'erreurs. Si un update n'a pas été bien executé, je ne souhaite pas que les autres soit executés, et je veux afficher un message d'erreur.
Je ne sais pas si cette question est à sa bonne place (peut etre que c'est gerable uniquement en mysql en créant des procédures ou je ne sais quoi...)

Merci pour vos réponses !
pekka77 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/10/2006, 23h03   #2
Expert Confirmé
 
Avatar de Eusebius
 
Inscription : avril 2003
Messages : 3 286
Détails du profil
Informations forums :
Inscription : avril 2003
Messages : 3 286
Points : 3 155
Points : 3 155
Peut-être que c'est gérable par MySQL, avec des trucs comme les requêtes transactionnelles (commit) ou les requêtes stockées, je ne sais pas.

Si tu veux le gérer par PHP, tu peux faire quelque chose de simple, comme ça :
Code :
1
2
3
4
5
6
7
8
9
10
requête 1
si requête 1 ok alors {
  requête 2
  si requête 2 OK alors {
    requête 3
    ...
  }
  sinon {...}
}
sinon {...}
Eusebius est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/10/2006, 23h21   #3
Membre régulier
 
Inscription : juin 2004
Messages : 247
Détails du profil
Informations forums :
Inscription : juin 2004
Messages : 247
Points : 70
Points : 70
Oui je suis d'accord, mais si la requete 3 s'est mal passée, je voudrais pas que la requete 1 s'execute. Je pourrais traiter le cas dans le else et revenir à l'état d'origine, mais c'est un peu galere et puis pas très optimisé... je serai obligé de refaire un update.
pekka77 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/10/2006, 23h48   #4
Membre émérite
 
Inscription : juin 2002
Messages : 1 013
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 1 013
Points : 959
Points : 959
tu n'es pas compliqué

donc si 1 se passe bien, tu fais 2, si 2 se passe bien, tu fais 3, et si 3 se passe mal, tu ne veux pas faire 1, ni 2, déjà exécutés.

je te dirais, commence par 3, mais je suppose que cela ne convient pas du tout dans ta logique.

et sincèrement, je ne sais pas comment tu peux régler cela logiquement : si j'ai compris ta question, il suffit que l'une de tes requetes s'exécute mal pour qu'aucune ne doit être exécutée. Pourtant, il faudra bien que tu commences par l'une de ces requêtes. Et dès qu'elle sera exécutée, ce sera fait.

A mon avis ton problème est insoluble

Enfin, en php.

Avec des requêtes transactionnelles ou requêtes stockées, peut-être, je n'y connais rien. Pose ta question dans le forum mysql

Sinon, tu peux les exécuter dans une table tampon et s'il n'y a aucune erreur les exécuter dans ta table de base. Ainsi, si erreur, cela évitera des update des infos antérieures à ta requête, que tu n'as peut-être pas en mémoire. Mais en vitesse d'exécution, je ne suis pas persuadé que ce soit une bonne chose.
francis m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/10/2006, 00h17   #5
Membre Expert
 
Inscription : janvier 2005
Messages : 1 249
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : janvier 2005
Messages : 1 249
Points : 1 417
Points : 1 417
C'est parfaitement possible avec les transactions dans MySql.
Attention, il faut que tu choisisses une table de format InnoDB, car les tables MyIsam (format par défaut) ne supportent pas les transactions.
Les transactions sont prévues exactement pour ton problème : c'est du tout ou rien => soit tout a fonctionné et les changements sont validés, soit il y a une erreur, et tout est annulé.
Plus de renseignements dans le forum mysql.
vg33 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/10/2006, 02h31   #6
Membre régulier
 
Inscription : juin 2004
Messages : 247
Détails du profil
Informations forums :
Inscription : juin 2004
Messages : 247
Points : 70
Points : 70
Arf..! Je crois pas avoir le choix du type de base. Elles ont déjà été créés et je suis pas le seul sur le projet. J'ai peur que le fait de modifie rle type de la base modifie d'autres choses.
En Perl, il me semble que cela est possible (je suis meme sur puisque je l'ai utilisé). En fait la fct magique que j'attendais était une sorte de mysql_query ou on pourrait mettre plusieurs requetes en paramètres, et executer les requetes seulement si toutes sont executables. Si une requete aurait rencontré un pb, aucune n'aurait été executée et le mega mysql_query aurait renvoyé faux.
Bon bah je crois que je vais essayer de trouver une autre solution pour mon problème...
pekka77 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/10/2006, 10h38   #7
Membre Expert
 
Inscription : janvier 2005
Messages : 1 249
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : janvier 2005
Messages : 1 249
Points : 1 417
Points : 1 417
Je ne te parle pas du type de base mais tu type de table. Le choix de InnoDB aura juste un petit impact sur certaines performances, mais toutes les fonctionnalités des tables MyIsam s'y retrouvent, plus les transactions et les procédures stockées. Tu n'as donc normalement aucun risque de choisir une table InnoDB. C'est la seule solution valable pour réaliser des transactions.
Au passage, avec php5, je te conseille d'utiliser les PDO, qui gère les transactions même si la version de mysql ne les autorise pas.
vg33 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/10/2006, 10h47   #8
Expert Confirmé
 
Avatar de Eusebius
 
Inscription : avril 2003
Messages : 3 286
Détails du profil
Informations forums :
Inscription : avril 2003
Messages : 3 286
Points : 3 155
Points : 3 155
Citation:
Envoyé par vg33
Je ne te parle pas du type de base mais tu type de table. Le choix de InnoDB aura juste un petit impact sur certaines performances, mais toutes les fonctionnalités des tables MyIsam s'y retrouvent, plus les transactions et les procédures stockées. Tu n'as donc normalement aucun risque de choisir une table InnoDB. C'est la seule solution valable pour réaliser des transactions.
Au passage, avec php5, je te conseille d'utiliser les PDO, qui gère les transactions même si la version de mysql ne les autorise pas.
S'il a un index "full text" dans sa table, il ne pourra pas passer en InnoDB (si ma mémoire est bonne).
Eusebius est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/10/2006, 11h15   #9
Membre Expert
 
Inscription : janvier 2005
Messages : 1 249
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : janvier 2005
Messages : 1 249
Points : 1 417
Points : 1 417
Citation:
Envoyé par Eusebius
S'il a un index "full text" dans sa table, il ne pourra pas passer en InnoDB (si ma mémoire est bonne).
=> il vaudrait mieux passer ce thread dans le forum mysql.
vg33 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/10/2006, 15h40   #10
Membre régulier
 
Inscription : juin 2004
Messages : 247
Détails du profil
Informations forums :
Inscription : juin 2004
Messages : 247
Points : 70
Points : 70
Citation:
Envoyé par vg33
Je ne te parle pas du type de base mais tu type de table. Le choix de InnoDB aura juste un petit impact sur certaines performances, mais toutes les fonctionnalités des tables MyIsam s'y retrouvent, plus les transactions et les procédures stockées. Tu n'as donc normalement aucun risque de choisir une table InnoDB. C'est la seule solution valable pour réaliser des transactions.
Au passage, avec php5, je te conseille d'utiliser les PDO, qui gère les transactions même si la version de mysql ne les autorise pas.
Peux tu me donner un peu plus de renseignements sur les procédures stockées et PDO ?
pekka77 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 06h32.


 
 
 
 
Partenaires

Hébergement Web