-1

こんにちは、MySQL で次のコードを実行中にエラーが発生しました。

BEGIN
DECLARE right_most_sibling INTEGER;
SET right_most_sibling
= (SELECT rgt
FROM Personnel
WHERE emp = 'Albert');
UPDATE Personnel
SET lft = CASE WHEN lft > right_most_sibling
THEN lft + 2
ELSE lft END,
rgt = CASE WHEN rgt >= right_most_sibling
THEN rgt + 2
ELSE rgt END
WHERE rgt >= right_most_sibling;
INSERT INTO Personnel (emp, lft, rgt)
VALUES ('Bert', right_most_sibling,
(right_most_sibling + 1))
END;

次のエラーが表示されます。

#1064 - SQL 構文にエラーがあります。2 行目の 'DECLARE right_most_sibling INTEGER' 付近で使用する正しい構文については、MySQL サーバーのバージョンに対応するマニュアルを確認してください。

任意のアイデア、どうすれば修正できますか?

私はこのチュートリアルに従っていました

4

2 に答える 2

2

コードを単にコピーして貼り付けようとしないでください。概念を読んで理解してから、特定の問題に使用してください。

前の質問への回答で、PHP レベルでこの機能を実装する方法を示すページへの 2 つ目のリンクを編集して追加しました (PHP を使用しているため)。

Celko の機能は優れています。Bill が言うように、何が起こっているのかを考えずに mySQL にドロップすることはできません。

まず概念理解してから、独自の実装を構築してください。

于 2009-09-20T23:12:49.923 に答える
1

ストアド プロシージャ ヘッダーを宣言せずに、ストアド プロシージャ構文を使用しているようです。

DECLAREストアド プロシージャ本体の複合ステートメントでないと使用できません。

http://dev.mysql.com/doc/refman/5.1/en/declare.html言います:

DECLARE は、BEGIN ... END 複合ステートメント内でのみ許可されます...

http://dev.mysql.com/doc/refman/5.1/en/begin-end.html言います:

BEGIN ... END 構文は、ストアド プログラム内に表示される複合ステートメントを記述するために使用されます。

あなたがリンクしているチュートリアルは、Joe Celko によって書かれました。彼は、Oracle または IBM DB2 で動作するコードを書いていると思います。彼がサンプル コードに MySQL を使用することはまずありません。


あなたのコメントについて、プロシージャ内でブロックを宣言することにより、少なくとも構文を受け入れるようにしました。

DELIMITER //
CREATE PROCEDURE insert_new_node()
BEGIN
DECLARE right_most_sibling INTEGER;
. . . 
END//
DELIMITER ;

チュートリアル全体を実行するつもりはないため、手順をテストしていません。

于 2009-09-20T22:59:09.923 に答える