创建存储过程时出错

时间:2013-12-15 08:39:58

标签: mysql procedure

CREATE PROCEDURE `go`()     
LANGUAGE SQL    
NOT DETERMINISTIC   
CONTAINS SQL    
SQL SECURITY DEFINER    
COMMENT '' 
BEGIN   DECLARE d_z CONDITION FOR SQLSTATE '35241';     
SELECT COUNT(*)as @a from _time    
IF  @a>0 THEN           
SIGNAL d_z SET MESSAGE_TEXT='errrrrrrrrrrrr';   
END IF;  
END;

错误:SQL错误(1064):您的SQL语法中有错误;检查与您的MySQL服务器版本对应的手册,以便在'_time from _time附近使用正确的语法    IF @ a> 0 THEN SIGNAL d_z SET MESSAGE_TEXT ='errrrrrrrrrr'在第9行

3 个答案:

答案 0 :(得分:0)

您的即时错误是由格式错误的SELECT语句引起的。您必须使用正确的SELECT INTO语法

更改

SELECT COUNT(*)as @a from _time  

SELECT COUNT(*) INTO @a FROM _time
                ^^^^

现在您的代码还存在其他几个问题:

  1. 无需使用用户(会话)变量,您可以使用本地变量
  2. 不希望获取所有行的总数,只是为了判断您的表中是否有行。如果你这样做,你将支付性能损失(如果你当然没有使用MyISAM)。您可以将NOT EXISTS()用于该LIMIT 1子句。
  3. 据说,您的程序的简化版可能看起来像

    DELIMITER $$
    CREATE PROCEDURE `go`()     
    BEGIN
      DECLARE d_z CONDITION FOR SQLSTATE '35241';     
      IF  NOT EXISTS(SELECT * FROM _time) THEN           
        SIGNAL d_z SET MESSAGE_TEXT='errrrrrrrrrrrr';   
      END IF;  
    END$$
    DELIMITER ;
    

    这是 SQLFiddle 演示

    我们试一试

    mysql> CREATE TABLE _time (`id` int);
    Query OK, 0 rows affected (0.03 sec)
    
    mysql> DELIMITER $$
    mysql> CREATE PROCEDURE `go`()     
        -> BEGIN
        ->   DECLARE d_z CONDITION FOR SQLSTATE '35241';     
        ->   IF  NOT EXISTS(SELECT * FROM _time) THEN           
        ->     SIGNAL d_z SET MESSAGE_TEXT='errrrrrrrrrrrr';   
        ->   END IF;  
        -> END$$
    Query OK, 0 rows affected (0.02 sec)
    
    mysql> DELIMITER ;
    mysql> CALL go();
    ERROR 1644 (35241): errrrrrrrrrrrr
    

答案 1 :(得分:0)

问题在于select语句“@a”是别名,无法进一步查询。

您可以使用peterm查询“into”而不是

希望这有帮助

快乐编码

答案 2 :(得分:0)

您有一些语法问题。以下是我的工作:

DELIMITER //
CREATE PROCEDURE `go`()
LANGUAGE SQL
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
BEGIN
DECLARE d_z CONDITION FOR SQLSTATE '35241';
select count(*) INTO @a from _time;
IF  @a>0 THEN
SIGNAL d_z SET MESSAGE_TEXT='errrrrrrrrrrrr';
END IF;
END
//

重要的是:

  1. 使用@variable语法选择var
  2. 中的值
  3. 使用DELIMITER终止多行程序正文