2013-03-21 3 views
2

ЭтоMySQL создать функцию не удается

CREATE FUNCTION getTagID(tag VARCHAR(100)) RETURNS BIGINT 

BEGIN 
DECLARE tagID BIGINT; 
      SET tagID = (SELECT id FROM tags WHERE text = tag); 
IF tagID IS NULL 
THEN 
      (INSERT INTO tags (text) VALUES (tag)); 
      SET tagID = (SELECT LAST_INSERT_ID()); 
END IF; 
RETURN tagID; 
END 

терпит неудачу с

Вы имеете ошибку в вашем синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с '' по строке 4

Почему?

Эта функция связана с проблемой здесь:

mysql insert if not exists on joined tables

+0

Установили ли вы разделитель на нечто, отличное от ';'? –

ответ

3

Попробуйте изменить DELIMITER и удалить скобки вокруг INSERT заявления.

DELIMITER $$ 
CREATE FUNCTION getTagID(tag VARCHAR(100)) 
RETURNS BIGINT 
BEGIN 
    DECLARE tagID BIGINT; 
    SET tagID = (SELECT id FROM tags WHERE text = tag); 
    IF tagID IS NULL THEN 
     INSERT INTO tags (text) VALUES (tag); -- don't put inside parenthesis 
     SET tagID = (SELECT LAST_INSERT_ID()); 
    END IF; 
    RETURN tagID; 
END $$ 
DELIMITER ; 
+0

, который, кажется, работает, и вы являетесь героем моего времени ... но не могли бы вы объяснить, что случилось с «DELIMITER»? –

+0

'DELIMITER' изменяет символ завершения запроса и позволяет выполнять несколько операторов, содержащих'; '. Помните, что каждый после ';' закрывает оператор, поэтому при смене на другой символ вы можете выполнять несколько операторов, не нарушая его. –

+1

отлично, спасибо. Выученный урок –

2

Тип, чтобы установить разделитель ;; как это:

DELIMITER ;; 

CREATE FUNCTION getTagID(tag VARCHAR(100)) RETURNS BIGINT 
BEGIN 
    DECLARE tagID BIGINT; 
    SET tagID = (SELECT id FROM tags WHERE text = tag); 
    IF tagID IS NULL 
    THEN 
    INSERT INTO tags (text) VALUES (tag); 
    SET tagID = (SELECT LAST_INSERT_ID()); 
    END IF; 
    RETURN tagID; 
END;; 

DELIMITER ; 

Разделитель используется клиентом MySQL (не разъединить), чтобы разделить входной сигнал на отдельные запросы. По умолчанию разделителем является ; так MySQL клиент посылает следующий запрос к серверу:

CREATE FUNCTION getTagID(tag VARCHAR(100)) RETURNS BIGINT 

BEGIN 
DECLARE tagID BIGINT 

, которая является неполной и, следовательно, неверно.

+0

очень хорошее объяснение, спасибо –

Смежные вопросы