MySQL(5.6.14)语句中的Declare和Temporary Table语法错误

时间:2016-04-12 16:02:04

标签: mysql sql stored-procedures

我有以下SQL程序:

DELIMITER $$
CREATE PROCEDURE Do_Stuff()
LANGUAGE SQL
  BEGIN
    CREATE TEMPORARY TABLE IF NOT EXISTS users_temp AS (
      SELECT id FROM users);
    DECLARE i INT DEFAULT 0;
  END;
$$
DELIMITER ;    

出现错误:“您的SQL语法出错;请查看与您的MySQL服务器版本对应的手册,以便在第8行'DECLARE i INT DEFAULT 0; END'附近使用正确的语法”

现在,如果我删除临时表,它运行正常。

DELIMITER $$
CREATE PROCEDURE Do_Stuff()
LANGUAGE SQL
  BEGIN
    DECLARE i INT DEFAULT 0;
  END;
$$
DELIMITER ;

此外,如果我在程序中声明除了其他声明,它运行正常。

DELIMITER $$
CREATE PROCEDURE Do_Stuff()
LANGUAGE SQL
  BEGIN
    CREATE TEMPORARY TABLE IF NOT EXISTS users_temp AS (
      SELECT id FROM users);
    SELECT * FROM users;
  END;
$$
DELIMITER ;    

可能导致此语法错误的原因是什么?

2 个答案:

答案 0 :(得分:2)

来自docs

  

DECLARE仅允许在BEGIN ... END复合语句中使用,并且必须在其开始之前,在任何其他语句之前。

CREATE TEMPORARY TABLE之前移动它。

答案 1 :(得分:1)

尝试:

DELIMITER $$

CREATE PROCEDURE Do_Stuff()
LANGUAGE SQL
BEGIN
   DECLARE i INT DEFAULT 0;
   CREATE TEMPORARY TABLE IF NOT EXISTS users_temp AS (
      SELECT id FROM users);
   -- DECLARE i INT DEFAULT 0;
END$$

DELIMITER ;