2017-07-14 7 views
1

私は見つけたmysql関数を使用しようとしていますが、これでいくつかのエラーが発生しているようです。ここでは関数は次のとおりです。Mysqlエラー区切り文字:行区切り文字でエラーが発生しました

SET GLOBAL log_bin_trust_function_creators=1; 
DROP FUNCTION IF EXISTS digits; 
DELIMITER $$ 
CREATE FUNCTION digits(str CHAR(32)) RETURNS CHAR(32) 
BEGIN 
    DECLARE i, len SMALLINT DEFAULT 1; 
    DECLARE ret CHAR(32) DEFAULT ''; 
    DECLARE c CHAR(1); 
    SET len = CHAR_LENGTH(str); 
    REPEAT 
    BEGIN 
     SET c = MID(str, i, 1); 
     IF c BETWEEN '0' AND '9' THEN 
     SET ret=CONCAT(ret,c); 
     END IF; 
     SET i = i + 1; 
    END ; 
    UNTIL i > len END REPEAT; 
    RETURN ret; 
END 
$$ 
DELIMITER ; 

SELECT digits('123ab45cde6789fg'); 

私はここでMariadb 5.5

Server version: 5.5.50-MariaDB MariaDB Server 

を使用していますことは、私が表示されるエラーです。

[Err] 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '$$ 
DELIMITER ; 

私は、このような区切り文字を変更するなど、いくつかの提案を試してみましたもともとパイプだった。区切り文字を次からENDに移動すると、エラーは両方で発生しているようです。

私はエラーを修正するために基本的な修正を試みましたが、まだこのセクションを削除するとエラーは発生しなくなりましたが、結果は正しくありません。

REPEAT 
    BEGIN 
    SET c = MID(str, i, 1); 
    IF c BETWEEN '0' AND '9' THEN 
     SET ret=CONCAT(ret,c); 
    END IF; 
    SET i = i + 1; 
    END ; 
UNTIL i > len END REPEAT; 

すべてのポインタが優れています。

更新

私はいくつかの他のバージョンをテストし、同じ問題を持っています。私は現在Navicatを使用しています。

Server version: 5.5.50-MariaDB MariaDB Server 
Server version: 5.5.31-0ubuntu0.12.10.1 (Ubuntu) 
Server version: 5.1.73 Source distribution 
Server version: 5.5.52-MariaDB MariaDB Server 
+0

は(MySQLの5.6)を再生することはできません。 – Riedsio

+0

「サーバーバージョン:10.1.21-MariaDB MariaDBサーバー」 –

+0

** MariaDB 5.x **は本当に古いですか? –

答えて

0

私は、問題を再現することはできません。

MariaDB [_]> SELECT VERSION(); 
+----------------+ 
| VERSION()  | 
+----------------+ 
| 5.5.56-MariaDB | 
+----------------+ 
1 row in set (0.00 sec) 

MariaDB [_]> SET GLOBAL log_bin_trust_function_creators=1; 
Query OK, 0 rows affected (0.00 sec) 

MariaDB [_]> DROP FUNCTION IF EXISTS digits; 
Query OK, 0 rows affected (0.00 sec) 

MariaDB [_]> DELIMITER $$ 

MariaDB [_]> CREATE FUNCTION digits(str CHAR(32)) 
    -> RETURNS CHAR(32) 
    -> BEGIN 
    -> DECLARE i, len SMALLINT DEFAULT 1; 
    -> DECLARE ret CHAR(32) DEFAULT ''; 
    -> DECLARE c CHAR(1); 
    -> SET len = CHAR_LENGTH(str); 
    -> REPEAT 
    ->  BEGIN 
    ->  SET c = MID(str, i, 1); 
    ->  IF c BETWEEN '0' AND '9' THEN 
    ->   SET ret=CONCAT(ret,c); 
    ->  END IF; 
    ->  SET i = i + 1; 
    ->  END; 
    -> UNTIL i > len END REPEAT; 
    -> RETURN ret; 
    -> END$$ 
Query OK, 0 rows affected (0.00 sec) 

MariaDB [_]> DELIMITER ; 

MariaDB [_]> SELECT digits('123ab45cde6789fg'); 
+----------------------------+ 
| digits('123ab45cde6789fg') | 
+----------------------------+ 
| 123456789     | 
+----------------------------+ 
1 row in set (0.00 sec) 
関連する問題