web-dev-qa-db-fra.com

Supprimer la procédure si elle existe dans mysql

Salut, j'essaie de créer un script mysql que je peux exécuter chaque fois que j'ai besoin de mettre à jour ma base de données. Le script crée une table, puis exécute certaines procédures stockées.

DELIMITER $$

CREATE TABLE IF NOT EXISTS tbl_name (
    col1 bigint(20) NOT NULL AUTO_INCREMENT,
    col2  varchar(255) NOT NULL,
    col3 varchar(64) NOT NULL,
    col4 datetime DEFAULT NULL,
    PRIMARY KEY (`col1 `),
    UNIQUE KEY col2  (`col2`)
) ENGINE=InnoDB AUTO_INCREMENT=572 DEFAULT CHARSET=utf8$$

CREATE DEFINER=`root`@`localhost` PROCEDURE `myproc`(IN username 
VARCHAR(255))
BEGIN
    DECLARE var1 VARCHAR(64);
    DECLARE expirationDate DATETIME;

    SET var1 = 12345;
    SET expirationDate = DATE_ADD(NOW(), INTERVAL 30 SECOND);

    REPLACE INTO tbl_name (col2, col3, col4) VALUES (someval, var1, expirationDate);
END$$

DELIMITER ;

Lorsque j'ai exécuté le script pour la première fois, il a créé la table et exécuté la procédure stockée dans MySQL Workbench. Lorsque j'ai exécuté la même chose la deuxième fois, j'ai eu la procédure d'erreur 1304 qui existe déjà.

J'ai regardé en ligne ici à propos de l'abandon de la procédure, puis recréer. Mais lorsque j'ai entré la commande ci-dessous avant de créer la procédure, j'ai reçu une erreur sur la commande CREATE avec le code 1064.

DROP PROCEDURE IF EXISTS myproc;
CREATE DEFINER=`root`@`localhost` PROCEDURE `myproc`(IN username 
    VARCHAR(255))
.
.
.

Je suis très nouveau sur mysql et je ne sais pas comment exécuter la procédure si elle existe déjà.

Toute aide serait appréciée.

6
Naphstor

Depuis que vous êtes passé à DELIMITER $$ vous devez utiliser ce délimiteur à la fin de chaque instruction jusqu'à ce que vous le changiez à nouveau.

DROP PROCEDURE et CREATE PROCEDURE sont des instructions distinctes et chacune requiert son propre délimiteur d'instructions.

DROP PROCEDURE IF EXISTS myproc $$

Notez le délimiteur à la fin de la ligne ci-dessus.

CREATE DEFINER=`root`@`localhost` PROCEDURE `myproc`(IN username 
    VARCHAR(255))
.
.
.
END $$

Et un autre délimiteur à la fin de l'instruction CREATE PROCEDURE entière.

8
Bill Karwin