MySQL - проблема с созданием пользовательской функции (UDF) - PullRequest
1 голос
/ 08 июля 2011

Я пытаюсь создать эту функцию:

CREATE FUNCTION remove_non_alphanum (prm_strInput varchar(3000))
RETURNS VARCHAR(3000)
DETERMINISTIC

BEGIN

  DECLARE i INT DEFAULT 1;
  DECLARE v_char VARCHAR(1);
  DECLARE v_parseStr VARCHAR(3000) DEFAULT '';

  WHILE (i <= LENGTH(prm_strInput) )  DO
    SET v_char = SUBSTR(prm_strInput,i,1);

    IF v_char REGEXP '^[A-Za-z0-9]$' THEN
      SET v_parseStr = CONCAT(v_parseStr,v_char);  
    END IF;

    SET i = i + 1;
  END WHILE;

  RETURN trim(v_parseStr);
END

Но MySQL говорит:

13: 52: 45 [CREATE - 0 ряд (а), 0,000 с.] [Код ошибки: 1064, состояние SQL: 42000] В вашем синтаксисе SQL есть ошибка;проверьте руководство, соответствующее вашей версии сервера MySQL, чтобы найти правильный синтаксис для использования рядом с '' в строке 5

В чем я могу ошибаться?Синтаксис выглядит правильно для меня.

Ответы [ 3 ]

7 голосов
/ 08 июля 2011

Вы должны изменить разделитель, чтобы вы могли использовать ; внутри функции:

DELIMITER $$

CREATE FUNCTION remove_non_alphanum (prm_strInput varchar(3000))
RETURNS VARCHAR(3000)
DETERMINISTIC
BEGIN
  DECLARE i INT DEFAULT 1;
  DECLARE v_char VARCHAR(1);
  DECLARE v_parseStr VARCHAR(3000) DEFAULT '';
WHILE (i <= LENGTH(prm_strInput) )  DO
  SET v_char = SUBSTR(prm_strInput,i,1);
  IF v_char REGEXP '^[A-Za-z0-9]$' THEN
        SET v_parseStr = CONCAT(v_parseStr,v_char);  
  END IF;
  SET i = i + 1;
END WHILE;
RETURN trim(v_parseStr);
END
$$

DELIMITER ;

Обновление: в MySQL разделителем по умолчанию является ;. Таким образом, при вводе исходного кода MySQL думает, что первая команда заканчивается там, где найдена первая ; (в строке 5, как указано в сообщении об ошибке), таким образом, вы получаете сообщение об ошибке, потому что это недопустимый SQL:

CREATE FUNCTION remove_non_alphanum (prm_strInput varchar(3000))
RETURNS VARCHAR(3000)
DETERMINISTIC
BEGIN
  DECLARE i INT DEFAULT 1;

Если вы измените разделитель на что-то еще, MySQL идентифицирует полную команду (от CREATE FUNCTION до END и запускает ее. Вуаля! Ваша функция создана. Наконец, когда вы запускаете свою функцию, код работает просто отлично потому что тело функции состоит из нескольких операторов, использующих разделитель по умолчанию.

2 голосов
/ 08 июля 2011

Я нашел ответ здесь .

Оказалось, что это была какая-то странная проблема с DB Visualizer.

Заключение полного блока в "- /" и "/ "работал для меня:

--/
CREATE FUNCTION remove_non_alphanum (prm_strInput varchar(3000))
RETURNS VARCHAR(3000)
DETERMINISTIC
BEGIN
  DECLARE i INT DEFAULT 1;
  DECLARE v_char VARCHAR(1);
  DECLARE v_parseStr VARCHAR(3000) DEFAULT '';
WHILE (i <= LENGTH(prm_strInput) )  DO
  SET v_char = SUBSTR(prm_strInput,i,1);
  IF v_char REGEXP '^[A-Za-z0-9]$' THEN
        SET v_parseStr = CONCAT(v_parseStr,v_char);  
  END IF;
  SET i = i + 1;
END WHILE;
RETURN trim(v_parseStr);
END
/
0 голосов
/ 31 июля 2013

Альтернативой

--/
CREATE FUNCTION ... 
/ 

является:

@delimiter $$;
CREATE FUNCTION ...
@delimiter ;$$

Дополнительная информация: http://www.dbvis.com/doc/main/doc/ug/sqlCommander/sqlCommander.html#mozTocId437790

...