2013-04-05 105 views
3

我創建的第一次光標(指this site) 我做了這個至今(MySQL的遊標錯誤1193:未知的系統變量

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鏈接,創建一個循環內的存儲過程

UPDATE: 聲明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 
+1

我做'DECLARE CONTINUE處理程序設定找不到DONE1 = TRUE;'看第二光標 – 2013-04-05 12:51:55

回答

7

您需要申報done1爲您done做:

DECLARE done INT DEFAULT FALSE; 

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

我後認爲done1應該在第二塊'block_cursor:BEGIN'內聲明,否則編譯器將如何知道哪個'done/done1'對應於哪個遊標 – 2013-04-05 12:55:42

+1

我發現了一個很好的參考:http://stackoverflow.com/a/6099837/1983854。遊標有點棘手,所以我強烈建議你學習如何做到這一點,然後移動到兩個,三個...... – fedorqui 2013-04-05 12:59:38

+0

'爲NOT FOUND SET聲明CONTINUE HANDLER done = TRUE;'行沒有聲明'完成「變量。它宣佈一個處理程序。 'SET done = TRUE'是處理程序的主體。看來這似乎還不清楚。 – Nasir 2013-04-05 13:09:08