2011-06-28 91 views
1
delimiter | 

CREATE FUNCTION BASE64_DECODE (input BLOB) 
     RETURNS BLOB 
     CONTAINS SQL 
     DETERMINISTIC 
     SQL SECURITY INVOKER 
BEGIN 
     DECLARE ret BLOB DEFAULT ''; 
     DECLARE done TINYINT DEFAULT 0; 

     IF input IS NULL THEN 
       RETURN NULL; 
     END IF; 

each_block: 
     WHILE NOT done DO BEGIN 
       DECLARE accum_value BIGINT UNSIGNED DEFAULT 0; 
       DECLARE in_count TINYINT DEFAULT 0; 
       DECLARE out_count TINYINT DEFAULT 3; 

each_input_char: 
       WHILE in_count < 4 DO BEGIN 
         DECLARE first_char CHAR(1); 

         IF LENGTH(input) = 0 THEN 
           RETURN ret; 
         END IF; 

         SET first_char = SUBSTRING(input,1,1); 
         SET input = SUBSTRING(input,2); 

         BEGIN 
           DECLARE tempval TINYINT UNSIGNED; 
           DECLARE error TINYINT DEFAULT 0; 
           DECLARE base64_getval CURSOR FOR SELECT val FROM base64_data WHERE c = first_char; 
           DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET error = 1; 

           OPEN base64_getval; 
           FETCH base64_getval INTO tempval; 
           CLOSE base64_getval; 

           IF error THEN 
             ITERATE each_input_char; 
           END IF; 

           SET accum_value = (accum_value << 6) + tempval; 
         END; 

         SET in_count = in_count + 1; 

         IF first_char = '=' THEN 
           SET done = 1; 
           SET out_count = out_count – 1; 
         END IF; 
       END; END WHILE; 

       WHILE out_count > 0 DO BEGIN 
         SET ret = CONCAT(ret,CHAR((accum_value & 0xff0000) >> 16)); 
         SET out_count = out_count – 1; 
         SET accum_value = (accum_value << 8) & 0xffffff; 
       END; END WHILE; 

     END; END WHILE; 

     RETURN ret; 
END | 

我得到的錯誤是:在MySQL這個MYSQL查詢有什麼問題?

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '– 1; 
         END IF; 
       END; END WHILE; 
     ' at line 52 

回答

0

這個問題很愚蠢,因爲它始終都是使用非標準符號。 -s和'是錯誤的格式。由於我正在使用IDE的編碼或者一樣愚蠢的東西。

facepalm

3

WHILE迴路簡單地END WHILE;終止。你有END; END WHILE;這是不正確的。

+0

「END;」結束while循環中的「BEGIN」。我會嘗試沒有「BEGIN ... END;」正如Marc所言。 – Neil

+0

嗯,我已經刪除了'END;'在'END; END WHILE;'並且我得到了與新代碼類似的錯誤... –

+0

WHILE循環也不需要'BEGIN'。 'WHILE ... DO .... END;'是正確的語法。 –

0

END之前END WHILE;是造成這個問題。你已經有了第46行的END,所以這個試圖結束這個函數。我敢打賭你可以刪除它。