web-dev-qa-db-ja.com

mysqlに存在する場合、プロシージャを削除します

こんにちは、データベースを更新する必要があるときにいつでも実行できるmysqlスクリプトを作成しようとしています。スクリプトはテーブルを作成し、いくつかのストアドプロシージャを実行します。

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 ;

スクリプトを初めて実行したとき、テーブルを作成し、MySQL Workbenchでストアドプロシージャを実行しました。 2回目に同じことを実行すると、エラー1304プロシージャが既に存在します。

オンラインで見た こちら プロシージャを削除してから、再度作成する。しかし、プロシージャを作成する前に以下のコマンドを入力すると、コード1064のCREATEコマンドでエラーが発生しました。

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

私はmysqlを初めて使用しますが、プロシージャが既に存在する場合の実行方法がわかりません。

任意の助けをいただければ幸いです。

6
Naphstor

DELIMITER $$に変更したため、元に戻すまで、各ステートメントの最後にその区切り文字を使用する必要があります。

DROP PROCEDUREとCREATE PROCEDUREは別々のステートメントであり、それぞれに独自のステートメント区切り文字が必要です。

DROP PROCEDURE IF EXISTS myproc $$

上記の行の終わりにある区切り文字に注意してください。

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

そして、CREATE PROCEDUREステートメント全体の最後にある別の区切り文字。

8
Bill Karwin