2009-09-20 74 views
-1

你好我得到,而在MySQL中執行以下代碼的錯誤:錯誤而執行SQL樹

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服務器版本使用附近的「聲明right_most_sibling INTEGER」第2行

任何想法正確的語法手冊,我該如何解決?

我下面這個tutorial

+0

它是否在抱怨末尾的分號? – 2009-09-20 21:43:31

+0

如果你的意思是一個,那麼末尾有或沒有分號 – ant 2009-09-20 21:45:16

+0

嘗試從較小的東西開始:只是一個語句(例如DECLARE語句);然後添加語句。這將有助於確定哪個部分導致錯誤。 – ChrisW 2009-09-20 22:05:55

回答

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 ; 

我沒有測試的程序,因爲我不會跑通過整個教程。

+0

上面的代碼是從Joe Celko寫的鏈接而不是我,你能告訴我如何糾正這段代碼嗎?這正是我所需要的,我只是google了一下。 – ant 2009-09-20 23:05:06

2

不要試圖只複製/粘貼代碼 - 請閱讀&瞭解概念,然後將它們用於您的具體問題。

在回答你之前的問題時,我編輯並添加了第二個鏈接,顯示如何在PHP級別實現這些內容(因爲您使用的是PHP)。

Celko的東西很不錯 - 就像比爾說的那樣,如果不考慮發生了什麼事情,你就無法將其放入mySQL中。

首先理解的概念,然後繼續前進的構建自己的實現。

+0

不確定你的意思是什麼,如果你認爲我不明白二叉樹的概念,我向你保證,情況並非如此。另一方面,如果你的意思是「mysql語法」,你是對的。在我使用SELECT,UPDATE,DELETE之前,這是我第一次使用if/else /與mysql一起工作。再次感謝您付出的時間和精力。 – ant 2009-09-20 23:43:57

+0

我發現其他有用的鏈接http://dev.mysql.com/tech-resources/articles/hierarchical-data.html - >它實際上最接近我的需求,我用它來解決我的問題..希望一切都會工作得很好 – ant 2009-09-20 23:46:06

+0

我的意思是如果你得到嵌套集的概念,然後運行它。不要擔心在SQL中粘貼一堆條件語句(IF/ELSE)。嵌套設置的好處在於,通過一對相當高效的查詢,您可以完成所有重要的操作。 將這些操作作爲存儲過程來實現沒有什麼問題 - 這通常是最好的方法。但是,沒有什麼能夠阻止您首先在PHP中實現邏輯,並且擔心之後會進行優化。 – timdev 2009-09-21 06:26:58