2011-01-20 13 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サーバー上でこれを実行する私に、次のエラーメッセージを表示します。

[のErr] 1310 - 一致せずにエンドラベル$$

これがなぜ発生し、どのように修正するのか誰にも分かりますか?

答えて

6

$$は、作成されるすべての手順の後になければなりません。

これは、区切り文字と呼ばれ、SQLコマンドを区切る理由です。あなたが持っている ';'内部のプロシージャとそれらの外側の '$$'。

+0

ありがとうございました!私はこれを見ませんでした。私はあなたの投稿に従ってそれを変更しました(私は前に 'END $$'でいくつかの行を 'END;'に置き換えなければなりませんでした)、それは今動作します:-) – acme

0

私はDELIMITERキーワードをサポートしていないいくつかのMySQLクライアントを見て、エラーを投げます...私はあなたのケースだと信じています...別のクライアント、おそらくMySQLにバンドルされているCLIツール(できれば...)?

+0

私はそれをサポートするNavicatを使用していますが、それにもかかわらずヒントのためにありがとうございます。 – acme

関連する問題