-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 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 2 行的“DECLARE right_most_sibling INTEGER”附近使用正确的语法

任何想法,我该如何解决?

我正在关注本教程

4

2 回答 2

2

不要试图只是复制/粘贴代码——阅读并理解这些概念,然后将它们用于您的特定问题。

在我对您上一个问题的回答中,我编辑并添加了第二个指向页面的链接,显示如何在 PHP 级别实现这些东西(因为您使用的是 PHP)。

Celko 的东西很好——正如比尔所说,你不能不考虑发生了什么就将它放到 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 回答