2015-10-22 40 views
0

我是新來的存儲過程,我試圖實施該解決方案的問題@Hierarchical Query in MySQL II。我在下面發佈了我的代碼。我立即掛斷了第三行。它看起來像我的問題回答@Error declaring integer variable inside MySQL stored function,但我仍然無法得到它的工作。錯誤回覆:在MySQL聲明整數存儲過程

對於我的第一個實驗,我想通過指定1(動物王國)作爲整數查詢整個分類樹。

我一直在尋找一些存儲過程的教程,但它究竟是如何運作目前尚不清楚,我,我可能有本末倒置。據我瞭解,存儲過程可以通過MySQL或PHP進行查詢,我寧願在PHP中執行。我不明白如果下面的代碼是一個存儲過程查詢或我可以編寫查詢之前必須做的事情。我創建了練習表(t)。

所以,也許我應該問另一種方式:如果我已經有一個練習表與家長ID字段,我想學習如何用PHP查詢該表,我仍然需要混亂代碼如下,以創建一個「存儲過程」?或者我可以使用用PHP編寫的查詢創建存儲過程?

DELIMITER $$ 
create procedure showHierarchyUnder 
(
SET i = 1; 
) 
BEGIN 
declare bDoneYet boolean default false; 
declare working_on int; 
declare next_level int; 
declare theCount int; 
CREATE temporary TABLE xxFindChildenxx 
( N int not null, 
    processed int not null, 
    level int not null, 
    parent int not null 
); 
set bDoneYet=false; 
insert into xxFindChildenxx (N,processed,level,parent) select theId,0,0,0; 
while (!bDoneYet) do 
    select count(*) into theCount from xxFindChildenxx where processed=0; 

    if (theCount=0) then 
     set bDoneYet=true; 
    else 
     SELECT N,level+1 INTO working_on,next_level FROM xxFindChildenxx where processed=0 limit 1; 
     insert into xxFindChildenxx (N,processed,level,parent) 
     select N,0,next_level,parent 
     from t 
     where parent=working_on; 
     update xxFindChildenxx set processed=1 where N=working_on; 
    end if; 
end while; 
delete from xxFindChildenxx where N=theId; 
select level,count(*) as lvlCount from xxFindChildenxx group by level; 
drop table xxFindChildenxx; 
END 
?? 
+0

是的,這是我得到的錯誤信息。 –

+0

只是出於好奇,你自己寫這個嗎? – BK435

+0

沒有,我是從http://stackoverflow.com/questions/33248361/hierarchical-query-in-mysql-ii我不得不刪除它的工作之前,然後,我就掛了整數的所有評論。順便說一下,我使用的是phpMyAdmin。 –

回答

1

這將爲您創建存儲過程。爲了在存儲過程中設置變量,您必須先聲明它,然後才能在聲明所有變量後設置它。注意SET i = 1;怎麼不在()之間不再和i一直declared i int;。看起來你正在嘗試傳遞一個像create procedure showHierarchyUnder(IN i int(10))這樣的變量,但是當過程被調用時,那將會期待一個值。你仍然可以這樣做,但如果i將永遠是1,沒有意義。在未來,如果有疑問,請去dev.mysql

DELIMITER // 
create procedure showHierarchyUnder() 
BEGIN 
declare bDoneYet boolean default false; 
declare working_on int; 
declare next_level int; 
declare theCount int; 
declare i int; 
SET i = 1; 
CREATE temporary TABLE xxFindChildenxx 
( N int not null, 
    processed int not null, 
    level int not null, 
    parent int not null 
); 
set bDoneYet=false; 
insert into xxFindChildenxx (N,processed,level,parent) select theId,0,0,0; 
while (!bDoneYet) do 
    select count(*) into theCount from xxFindChildenxx where processed=0; 

    if (theCount=0) then 
     set bDoneYet=true; 
    else 
     SELECT N,level+1 INTO working_on,next_level FROM xxFindChildenxx where processed=0 limit 1; 
     insert into xxFindChildenxx (N,processed,level,parent) 
     select N,0,next_level,parent 
     from t 
     where parent=working_on; 
     update xxFindChildenxx set processed=1 where N=working_on; 
    end if; 
end while; 
delete from xxFindChildenxx where N=theId; 
select level,count(*) as lvlCount from xxFindChildenxx group by level; 
drop table xxFindChildenxx; 
END// 
DELIMITER ; 
+0

Thx,但我現在得到一個1064錯誤指向第一行 - 「DELIMITER」。如果我用$替換雙斜線 - // - ,我會得到相同的結果。所以我無法創建名爲Uno的存儲過程,也無法創建一個名爲Dos的存儲過程。但是當我回去嘗試使用不同的分隔符再次創建Uno時,它說Uno已經被創建。所以也許這些1064錯誤中的一些是我可以忽略的「錯誤標誌」? –

+0

看起來下一步就是簡單地學習如何用PHP查詢存儲過程。這樣我可以判斷一個存儲過程是否真的被創建。有沒有辦法列出所有現有的存儲過程,以便我可以以某種方式刪除那些有問題或不再使用的程序? –

+0

Syntx應該工作..爲我創建的程序...不知道你在做什麼錯誤,是的...你怎麼樣只是谷歌如何在這個時候查詢存儲過程... – BK435