You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复MariaDB存储过程中的Error #1064语法错误?

存储过程语法错误修正方案

错误原因

在MariaDB/MySQL的存储过程中,DECLARE仅用于声明不带@前缀的局部变量;带@前缀的是会话级用户变量,这类变量不需要通过DECLARE声明,直接赋值即可。原代码里的DECLARE @study_ID INT;违反了该语法规则,导致报错。

修正方案

有两种可行的修正方式:

方式1:使用会话用户变量(移除DECLARE声明)

直接去掉对@study_ID的DECLARE语句,保留会话变量的使用:

DELIMITER $$

CREATE PROCEDURE insert_priority_rows()
BEGIN
  DECLARE max_heuristics INT DEFAULT 10;
  DECLARE heuristic_ID INT;

  DECLARE cur CURSOR FOR
    SELECT heuristicID
    FROM heuristics;
    
  DECLARE CONTINUE HANDLER 
  FOR NOT FOUND SET heuristic_ID = 0;
    
  -- 直接赋值会话变量,无需提前声明
  SELECT MAX(studyID) INTO @study_ID FROM study;

  OPEN cur;

  REPEAT
    FETCH cur INTO heuristic_ID;
    IF heuristic_ID = 0 THEN
      LEAVE;
    END IF;

    INSERT INTO heuristic_priority (studyID, heuristicID, h_priority)
    VALUES (@study_ID, heuristic_ID, 'm');
  UNTIL heuristic_ID = 0 END REPEAT;

  CLOSE cur;
END$$

DELIMITER ;

方式2:使用局部变量(移除@前缀)

推荐采用这种方式,局部变量仅在存储过程执行期间有效,更符合封装性:

DELIMITER $$

CREATE PROCEDURE insert_priority_rows()
BEGIN
  DECLARE max_heuristics INT DEFAULT 10;
  DECLARE heuristic_ID INT;
  -- 声明局部变量,不带@前缀
  DECLARE study_ID INT;

  DECLARE cur CURSOR FOR
    SELECT heuristicID
    FROM heuristics;
    
  DECLARE CONTINUE HANDLER 
  FOR NOT FOUND SET heuristic_ID = 0;
    
  SELECT MAX(studyID) INTO study_ID FROM study;

  OPEN cur;

  REPEAT
    FETCH cur INTO heuristic_ID;
    IF heuristic_ID = 0 THEN
      LEAVE;
    END IF;

    INSERT INTO heuristic_priority (studyID, heuristicID, h_priority)
    VALUES (study_ID, heuristic_ID, 'm');
  UNTIL heuristic_ID = 0 END REPEAT;

  CLOSE cur;
END$$

DELIMITER ;

注:两种方式均能解决语法错误,方式2的局部变量不会污染会话环境,更适合存储过程场景。

内容的提问来源于stack exchange,提问作者learning Gatherer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 03:25:15