2011-01-20 83 views
1

我試過this site的一個教程,其中一個示例表與一些存儲過程中的測試數據一起插入。但不幸的是,出現了一條錯誤消息,說DELIMITER有問題。整個腳本是:MySQL 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服務器上執行這給了我以下錯誤信息:

[錯誤] 1310 - 最終標籤$$不匹配

有誰知道爲什麼發生這種情況,以及如何解決它?

回答

6

$$應該在每個創建的過程之後。

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

謝謝!我沒有看到這個。我根據你的文章改變了它(我之前也必須用`END $$`替換`END;`),現在它可以工作:-) – acme 2011-01-20 10:18:30

0

我看到一些MySQL客戶端不支持DELIMITER關鍵字並拋出一個錯誤......我相信這是你的情況...你應該嘗試使用不同的客戶端,也許與MySQL綁定的CLI工具(如果你可以的話...)?

+0

我使用支持它的Navicat,但感謝提示。 – acme 2011-01-20 10:16:43