2011-06-28 9 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;なしで試してみるだろうマークが示唆するように。 – Neil

+0

hmm、 'END;で' END;を削除しました。 END WHILE; '新しいコードでも同様のエラーが発生します... –

+0

WHILEループでも' BEGIN'は必要ありません。 'WHILE ... DO .... END;'は正しい構文です。 –

0

ENDの前には、END WHILE;が問題の原因です。すでに46行目にENDがあるので、この関数は終了しようとしています。私はあなたがそれを取り除くことができると確信しています。

関連する問題