【问题标题】:MySQL CURSOR ERROR 1193: Unknown system variableMySQL CURSOR ERROR 1193:未知系统变量
【发布时间】:2013-03-27 21:33:36
【问题描述】:

我是第一次创建游标。(参考this site) 到目前为止我做到了(

CREATE PROCEDURE `abc`.`cursordemo` (IN start_date DATETIME,IN end_date DATETIME)
BEGIN
DECLARE done INT DEFAULT FALSE;
  DECLARE k1,k2,g,s,last_status VARCHAR(45);
  DECLARE b, c INT;
  DECLARE cur1 CURSOR FOR SELECT `key` FROM `abc`.`temp_weekly`;
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

OPEN cur1;
 read_loop: LOOP
    FETCH cur1 INTO k1;
    IF done THEN
      LEAVE read_loop;
    END IF;
    block_cursor:BEGIN
        DECLARE cur2 CURSOR FOR SELECT `key`,`group`,`status` FROM `abc`.`jira_local` WHERE `key` = k1 AND updateddate < end_date;
        DECLARE CONTINUE HANDLER FOR NOT FOUND SET done1 = TRUE;
        OPEN cur2;
        REPEAT
            FETCH cur2 INTO k2,g,s;
            IF NOT done1 THEN


            IF s != last_status THEN
                CASE
                    WHEN s = 'verified' THEN
                    SET c = c +1;
                    WHEN s = 'closed' THEN
                    SET c = c +1;
                    WHEN s = 'to be scheduled' THEN
                    SET c = c +1;
                    WHEN s = 'deferred' THEN
                    SET c = c +1;
/*'resolved','closed','to be scheduled','deferred','validated','assigned','l3 need more info','l2 need more info','need more info'*/
                    WHEN s = 'resolved' THEN
                    SET c = c +1;
                    WHEN s = 'validated' THEN
                    SET c = c +1;
                    WHEN s = 'assigned' THEN
                    SET c = c +1;
                    WHEN s = 'l3 need more info' THEN
                    SET c = c +1;
                    WHEN s = 'l2 need more info' THEN
                    SET c = c +1;
                    WHEN s = 'need more info' THEN
                    SET c = c +1;
                END CASE;
                SET last_status = s;
            END IF;
            END IF; 
        UNTIL NOT done1 END REPEAT;
        INSERT INTO ticketsResolvedCount values(k2,g,s,c);
    END block_cursor;

  END LOOP;

  CLOSE cur1;
  CLOSE cur2;
END$$

我在做什么 1) 从 temp_weekly 读取所有键并迭代 2) 从 jira_local 表中查找特定键的所有记录,并计算它被验证、解决等的次数。

问题: 当我编译它时,它给出了一个错误

ERROR 1193: Unknown system variable 'done1'

另外,我引用了this 链接在循环内创建存储过程

更新: 声明 done/done1 后,我的程序如下所示

BEGIN

      DECLARE k1,k2,g,s,last_status VARCHAR(45);
      DECLARE b, c INT;
      DECLARE cur1 CURSOR FOR SELECT `key` FROM `abc`.`temp_weekly`;
        DECLARE done1 BOOLEAN DEFAULT FALSE;
        DECLARE done BOOLEAN DEFAULT FALSE;
      DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
        .
        .
        .
block_cursor:BEGIN
        DECLARE cur2 CURSOR FOR SELECT `key`,`group`,`status` FROM `abc`.`jira_local` WHERE `key` = k1 AND updateddate < end_date;
        DECLARE CONTINUE HANDLER FOR NOT FOUND SET done1 = TRUE;
       .
       .
       .

这给了我

ERROR 1337: Variable or condition declaration after cursor or handler declaration

【问题讨论】:

  • 我在 DECLARE CONTINUE HANDLER FOR NOT FOUND SET done1 = TRUE; 看第二个光标

标签: mysql cursor


【解决方案1】:

您需要像使用 done 一样声明 done1

来自

DECLARE done INT DEFAULT FALSE;

DECLARE done, done1 INT DEFAULT FALSE;
            ^^^^^^^

【讨论】:

  • 我认为 done1 应该在第二块 block_cursor:BEGIN 中声明,否则编译器将如何知道哪个 done/done1 对应于哪个光标
  • 我找到了一个很好的参考:stackoverflow.com/a/6099837/1983854。光标有点棘手,所以我强烈建议您学习如何只用一个,然后再继续使用两个、三个...
  • DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; 行未声明 done 变量。它正在声明一个处理程序。 SET done = TRUE 是处理程序的主体。只是似乎没有清楚地理解。
  • @nsr81 :是的,我想这就是我会尝试声明它然后编译的问题
  • ERROR 1337: Variable or condition declaration after cursor or handler declaration 这意味着您不能在游标或处理程序之后声明任何内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-18
  • 1970-01-01
  • 2019-07-24
相关资源
最近更新 更多