Почему эта функция имеет синтаксическую ошибку около DECLARE? - PullRequest
2 голосов
/ 20 августа 2011

Код:

DELIMITER $$
CREATE FUNCTION CHECK_AVABILITY(nama CHAR(30))
RETURNS INT(4)
DECLARE vreturn INT(4);
BEGIN
IF nama = 'ika' THEN
SET vreturn = 0;
ELSE
SET vreturn = 1;
END IF
RETURN vreturn;
END $$

Сообщение об ошибке:

ОШИБКА 1064 (42000): у вас ошибка в вашем синтаксисе sql; проверьте руководство, соответствующее вашей версии сервера MySQL, чтобы найти правильный синтаксис для использования рядом с 'DECLARE vreturn INT4); НАЧАТЬ '

Помощь приветствуется.

Ответы [ 2 ]

6 голосов
/ 20 августа 2011

Перемещение DECLARE vreturn INT(4) внутри блока BEGIN / END.Вам, вероятно, также нужен ; после END IF.Кроме того, похоже, что это будет функция DETERMINISTIC.Добавьте ключевое слово DETERMINISTIC перед BEGIN.

DELIMITER $$
CREATE FUNCTION CHECK_AVABILITY(nama CHAR(30))
RETURNS INT(4)
DETERMINISTIC
BEGIN
  DECLARE vreturn INT(4);
  IF nama = 'ika' THEN
    SET vreturn = 0;
  ELSE
    SET vreturn = 1;
  END IF;
  RETURN vreturn;
END $$
1 голос
/ 19 октября 2011

Вот мои выводы на эту тему:

Это цитата из руководства:

"Вам необходим блок BEGIN / END, когда в процедуре содержится более одного оператора. Этот блок используется для включения нескольких операторов.

Но это еще не все. Блок BEGIN / END, также называемый составным оператором, - это место, где вы можете определить переменные и поток управления. "

Другими словами:

(Эти правила, похоже, применяются к триггерам и хранимым процедурам одинаково, так как кажется, что в обоих случаях используется один и тот же синтаксис.)

Во-первых, обратите внимание, что группа управления потоком ключевых слов, таких как IF ... END IF или WHILE ... END WHILE, рассматривается как единое утверждение в том, что касается его завершения точкой с запятой, то есть завершается в целом одной точкой с запятой в конце: IF ... END IF; WHILE ... END WHILE;.

Тогда, если тело триггера или хранимой процедуры содержит только один этап, и этот оператор не является ни объявлением переменной, ни группой управления потоком ключевых слов, как указано выше, этот оператор не может заканчиваться точкой с запятой (;) и не заключен в блок BEGIN ... END.

Напротив, если тело триггера или хранимой процедуры содержит более одного этапа, и особенно если оно содержит объявления переменных и / или группы управления потоками ключевых слов, то оно должно быть заключено в BEGIN ... END блок.

Наконец, сам блок BEGIN ... END не должен заканчиваться точкой с запятой.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...