【问题标题】:MySQL 5.1 Stored Procedure Error - Declaring VariableMySQL 5.1 存储过程错误 - 声明变量
【发布时间】:2014-02-12 00:37:38
【问题描述】:

尝试在 MySQL (5.1) 中创建存储过程时遇到错误。 每当我尝试运行这个 SQL 脚本时,都会看到:

错误 1064 (42000) 第 3 行:您的 SQL 语法有错误。 Near 'DECLARE checkExists INT; SET checkExists = 0; SELECT count(*) INTO c' 在第 29 行

据我了解,以这种方式声明变量应该是可以接受的。 我在下面包含了 SQL 脚本。

DELIMITER //

CREATE PROCEDURE add_movie(
IN movieTitle VARCHAR(100),
IN movieYear INT,
IN movieDirector VARCHAR(100),
IN movieBannerURL VARCHAR(100),
IN movieTrailerURL VARCHAR(100),
IN starFirstName VARCHAR(50),
IN starLastName VARCHAR(50),
IN starDateOfBirth DATE,
IN starPhotoURL VARCHAR(200),
IN genreName VARCHAR(32),
OUT movieAdded INT,
OUT starAdded INT,
OUT genreAdded INT,
OUT movieStarLinkAdded INT,
OUT movieGenreLinkAdded INT)

LANGUAGE SQL
NOT DETERMINISTIC
SQL SECURITY INVOKER
COMMENT 'Adds Movie, Star, Genre and respective links to DB if they do not exist'

    BEGIN
        SET movieAdded = 0;
        SET starAdded = 0;
        SET genreAdded = 0;
        SET movieStarLinkAdded = 0;
        SET movieGenreLinkAdded = 0;

        DECLARE checkExists INT;
        SET checkExists = 0;

        SELECT count(*) INTO checkExists FROM movies m WHERE m.title = movieTitle;
        IF(checkExists > 0) THEN
                INSERT INTO movies(title, year, director, banner_url, trailer_url)
                VALUES (movieTitle, movieYear, movieDirector, movieBannerURL, movieTrailerURL);
                SET movieAdded = 1;
        END IF;

        SET checkExists = 0;

        SELECT count(*) INTO checkExists FROM stars s WHERE s.first_name = starFirstName AND s.last_name = starLastName;
        IF(checkExists > 0) THEN
                INSERT INTO stars(first_name, last_name, dob, photo_url)
                VALUES (starFirstName, starLastName, starDateOfBirth, starPhotoURL);
                SET starAdded = 1;
        END IF;

        SET checkExists = 0;

        SELECT count(*) INTO checkExists FROM genres g WHERE g.name = genreName;
        IF(checkExists > 0) THEN
                INSERT INTO genres(name)
                VALUES (genreName);
                SET genreAdded = 1;
        END IF;

        SET checkExists = 0;

        SELECT count(*) INTO checkExists FROM stars_in_movies sm, stars s, movies m 
        WHERE m.title = movieTitle AND s.first_name = starFirstName
        AND s.last_name = starLastName AND sm.star_id = s.id AND sm.movie_id = m.id;
        IF(checkExists > 0) THEN
                INSERT INTO stars_in_movies(star_id, movie_id)
                VALUES(
                    SELECT s.id, m.id FROM stars s, movies m WHERE s.first_name = starFirstName
                    AND s.last_name = starLastName AND m.title = movieTitle);
                SET movieStarLinkAdded = 1;
        END IF;

        SET checkExists = 0;

        SELECT count(*) INTO checkExists FROM genres_in_movies gm, genres g, movies m
        WHERE m.title = movieTitle AND genre.name = genreName
        AND gm.movie_id = m.id AND gm.genre_id = g.id;
        IF(checkExists > 0) THEN
                INSERT INTO genres_in_movies(genre_id, movie_id)
                VALUES(
                    SELECT g.id, m.id FROM genres g, movies m
                    WHERE g.name = genreName AND m.title = movieTitle);
                SET movieGenreLinkAdded = 1;
        END IF;
    END //
DELIMITER ;

如果有人可以帮助我理解我在这里做错了什么,我将不胜感激。谢谢。

【问题讨论】:

    标签: mysql stored-procedures


    【解决方案1】:

    将所有DECLARE 语句移动到BEGIN .. END 块的开头,紧邻BEGIN

    见文档:https://dev.mysql.com/doc/refman/5.6/en/declare.html

    DECLARE 只能在 BEGIN ... END 复合语句中使用,并且必须在其开头,在任何其他语句之前

    【讨论】:

    • 谢谢你,解决了这个错误。完全错过了。
    • @Greiver 如果解决了您的问题,请按旁边的复选标记将答案标记为已接受。
    猜你喜欢
    • 2016-07-19
    • 1970-01-01
    • 2019-08-01
    • 1970-01-01
    • 2014-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多