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 27/05/2011, 15h58   #1
Invité de passage
 
Inscription : avril 2007
Messages : 13
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 13
Points : 3
Points : 3
Par défaut Requéte IF NOT EXISTS

Salut,
j'arrive pas à trouver l'erreur dans ce script, pourtant il marche sous MS SQL SERVER 2008.

Code :
1
2
3
4
5
6
7
8
9
10
    IF EXISTS (
        SELECT * FROM information_schema.COLUMNS
        WHERE column_name='fieldName'
        AND table_name='tableName'
        AND table_schema='dbName'
        )
    THEN
        ALTER TABLE tableName
                CHANGE fieldName nouevaufieldName INT NOT NULL AUTO_INCREMENT
    END IF;
l'erreur Mysql est:
Citation:
#1064 - 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 'IF EXISTS ( SELECT * FROM information_schema.COLUMNS WHERE column_name='id' at line 1
est ma version Mysql 5.5.8

Merci pour votre aide
ouss_sk8 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/05/2011, 16h04   #2
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 007
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 007
Points : 18 278
Points : 18 278
Envoyer un message via MSN à CinePhil
Il manque le début de ta procédure et la définition du DELIMITER.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/05/2011, 22h09   #3
Membre Expert
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 852
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : avril 2011
Messages : 852
Points : 1 330
Points : 1 330
salut,

c'est normal, mysql ne supporte pas cette syntaxe...
ça va faire la même chose:
Code sql :
1
2
3
4
5
6
7
8
9
10
declare t bool;
SELECT count(*)>0 INTO t FROM information_schema.COLUMNS
        WHERE column_name='fieldName'
        AND table_name='tableName'
        AND table_schema='dbName'
        
IF t then
    ALTER TABLE tableName
                CHANGE fieldName nouevaufieldName INT NOT NULL AUTO_INCREMENT;
end IF;
__________________
Eric Dureuil, développeur web, c/c++, java indépendant
soyons
pensez à mettre et
ericd69 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 01/06/2011, 17h30   #4
Invité de passage
 
Inscription : avril 2007
Messages : 13
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 13
Points : 3
Points : 3
Citation:
Envoyé par ericd69 Voir le message
salut,

Code sql :
1
2
3
4
5
6
7
8
9
10
declare t bool;
SELECT count(*)>0 INTO t FROM information_schema.COLUMNS
        WHERE column_name='fieldName'
        AND table_name='tableName'
        AND table_schema='dbName'
        
IF t then
    ALTER TABLE tableName
                CHANGE fieldName nouevaufieldName INT NOT NULL AUTO_INCREMENT;
end IF;
MySQL n'accepte pas cette instruction declare t bool;
je pense qu'il fait declarer les variable seulement enre BEGIN et END, et donc forcement dans une procedure.


je me rappelle que dans MS SQL SERVER on pouvait exécuter des requetes avec branchement conditionnel et tout, sans déclarer de procédure.
c'est pas le cas avec MySQL donc je devais faire ceci,

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
DELIMITER ;
DROP procedure IF EXISTS ModifColumnUnlessExists;
delimiter //
 
CREATE procedure ModifColumnIfExists(
	IN dbName tinytext,
	IN tableName tinytext,
    IN fieldName tinytext
	)
begin
	IF EXISTS (
		SELECT * FROM information_schema.COLUMNS
		WHERE column_name=fieldName
		AND table_name=tableName
		AND table_schema=dbName
		)
	THEN
		SET @ddl=CONCAT('ALTER TABLE ',dbName,'.',tableName,
			' CHANGE ',fieldName,' ',
			'
			Lieu_modif VARCHAR(32) NULL
			');
		prepare stmt FROM @ddl;
		execute stmt;
	END IF;
end;
//
 
DELIMITER ;
 
 
CALL ModifColumnIfExists('basename', 'tablename', 'colonne');
Merci
ouss_sk8 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/06/2011, 17h40   #5
Membre Expert
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 852
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : avril 2011
Messages : 852
Points : 1 330
Points : 1 330
oui je t'ai donné le corps d'une procédure sans préciser car je pensais que c'est ce que tu demandais...

mysql ne permet pas d'instruction de test ou de branchement hors d'une procédure
__________________
Eric Dureuil, développeur web, c/c++, java indépendant
soyons
pensez à mettre et
ericd69 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 20h08.


 
 
 
 
Partenaires

Hébergement Web