MySQL DELIMITER не работает - PullRequest
       23

MySQL DELIMITER не работает

1 голос
/ 20 января 2011

Я попробовал учебник с этого сайта , где вставляется образец таблицы вместе с некоторыми данными тестирования в хранимой процедуре.Но, к сожалению, выдается сообщение об ошибке, в котором говорится, что с DELIMITER что-то не так.Весь сценарий:

CREATE TABLE filler (
    id INT NOT NULL PRIMARY KEY AUTO_INCREMENT
) ENGINE=Memory;

CREATE TABLE t_hierarchy (
    id INT NOT NULL PRIMARY KEY,
    parent INT NOT NULL,
    lft INT NOT NULL,
    rgt INT NOT NULL,
    sets LineString NOT NULL,
    data VARCHAR(100) NOT NULL,
    stuffing VARCHAR(100) NOT NULL
) ENGINE=MyISAM;

DELIMITER $$

CREATE PROCEDURE prc_filler(cnt INT)
BEGIN
    DECLARE _cnt INT;
    SET _cnt = 1;
    WHILE _cnt <= cnt DO
            INSERT
            INTO    filler
            SELECT  _cnt;
            SET _cnt = _cnt + 1;
    END WHILE;
END;

CREATE PROCEDURE prc_hierarchy(width INT)
main:BEGIN
    DECLARE last INT;
    DECLARE level INT;
    SET last = 0;
    SET level = 0;
    WHILE width >= 1 DO
            INSERT
            INTO    t_hierarchy
            SELECT  COALESCE(h.id, 0) * 5 + f.id,
                    COALESCE(h.id, 0),
                    COALESCE(h.lft, 0) + 1 + (f.id - 1) * width,
                    COALESCE(h.lft, 0) + f.id * width,
                    LineString(
                    Point(-1, COALESCE(h.lft, 0) + 1 + (f.id - 1) * width),
                    Point(1, COALESCE(h.lft, 0) + f.id * width)
                    ),
                    CONCAT('Value ', COALESCE(h.id, 0) * 5 + f.id),
                    RPAD('', 100, '*')
            FROM    filler f
            LEFT JOIN
                    t_hierarchy h
            ON      h.id >= last;
            SET width = width / 5;
            SET last = last + POWER(5, level);
            SET level = level + 1;
    END WHILE;
END
$$

DELIMITER ;

START TRANSACTION;
CALL prc_filler(5);
CALL prc_hierarchy(585937);
COMMIT;

CREATE INDEX ix_hierarchy_parent ON t_hierarchy (parent);
CREATE INDEX ix_hierarchy_lft ON t_hierarchy (lft);
CREATE INDEX ix_hierarchy_rgt ON t_hierarchy (rgt);
CREATE SPATIAL INDEX sx_hierarchy_sets ON t_hierarchy (sets);

При выполнении этого на сервере MySQL 5.0.51a-24 + lenny2 выдается следующее сообщение об ошибке:

[Err] 1310 - End-ярлык $$ без совпадения

Кто-нибудь знает, почему это происходит и как это исправить?

Ответы [ 2 ]

6 голосов
/ 20 января 2011

$$ должно быть после каждой созданной процедуры.

CREATE PROCEDURE prc_filler(cnt INT)
BEGIN
    DECLARE _cnt INT;
    SET _cnt = 1;
    WHILE _cnt <= cnt DO
            INSERT
            INTO    filler
            SELECT  _cnt;
            SET _cnt = _cnt + 1;
    END WHILE;
END$$ -- here's your problem

Вот почему он называется разделителем - он разделяет команды SQL. У тебя есть ';' внутренние процедуры и $$ вне их.

0 голосов
/ 20 января 2011

Я видел некоторые клиенты MySQL, которые не поддерживают ключевое слово DELIMITER и выдают ошибку ... Я считаю, что это ваш случай ... Вы должны попробовать использовать другой клиент, возможно, инструмент CLI в комплекте с MySQL ( если сможешь ...)?

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