2013-11-27 64 views
0

我寫了一個存儲過程在mysql中,當我通過料斗運行時,它工作正常,但是當我試圖從mysql工作臺或java運行它時,它不返回任何結果,也沒有表現出任何異常mysql存儲過程不工作從mysqlworkbench或java代碼

我會請你,請幫我在這

-- -------------------------------------------------------------------------------- 
-- Routine DDL 
-- Note: comments before and after the routine body will not be stored by the server 
-- -------------------------------------------------------------------------------- 
DELIMITER $$ 

CREATE DEFINER=`root`@`localhost` PROCEDURE `issueitem`() 
BEGIN 
    DECLARE done INT DEFAULT 0; 
    DECLARE inventoryids INT DEFAULT 0; 
    DECLARE batch varchar(39); 
    DECLARE resultstr varchar(3000) DEFAULT ''; 
    DECLARE exp DATE; 
    DECLARE mfgdate DATE; 
    DECLARE availableunit INT; 
    DECLARE quantity INT DEFAULT 100; 
    DECLARE oldest_date DATETIME; 
    DECLARE cur_count INT; 
    DECLARE que_size INT DEFAULT 0; 
    DECLARE curs CURSOR FOR SELECT inventoryid,batch,exp,availableunit FROM aashramdata.inventory where itemid=1 ORDER BY exp ASC; 
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; 

    OPEN curs; 
    SET cur_count=quantity; 
    read_loop: LOOP 
    FETCH curs INTO inventoryids,batch,exp,availableunit; 
    IF done THEN 
     LEAVE read_loop; 
    END IF; 
    SET que_size = que_size + availableunit; 
     IF cur_count >= availableunit THEN 
    set cur_count=cur_count-availableunit; 
     set resultstr=CONCAT(resultstr,batch,' - ',exp,' - ',availableunit,' - '); 
    update aashramdata.inventory set `availableunit`=0 where inventoryid=inventoryids; 
    END IF; 
    IF cur_count < availableunit THEN 

    update aashramdata.inventory set `availableunit`=availableunit-cur_count where inventoryid=inventoryids; 
     set resultstr=CONCAT(resultstr,batch,' - ',exp,' - ',availableunit-cur_count,' - '); 

    set cur_count=0; 
    END IF; 
    IF que_size >= quantity then 
     LEAVE read_loop; 
    END IF; 
    END LOOP; 

    CLOSE curs; 
    select resultstr; 
     END 
+0

有人可以幫我嗎 – user1047873

回答

0

由於程序顯然是語法上有效的,這是不可能回答的問題可能是什麼,沒有一些知識的數據。

調試存儲過程中的最簡單的方法是通過用無界SELECT語句(即,選擇不屬於子查詢的一部分,而不是的INSERT ... SELECTSELECT ... INTO部分),然後從MySQL命令行運行它胡椒它客戶端,它比大多數圖形客戶端更優雅地處理來自存儲過程的多個結果集。

例如:

... 
SET cur_count=quantity; 
SELECT cur_count;          -- add this 
read_loop: LOOP 
    FETCH curs INTO inventoryids,batch,exp,availableunit; 
    SELECT inventoryids,batch,exp,availableunit;   -- add this 
    SELECT done;           -- add this 
    IF done THEN 
... 

當從命令行客戶機運行...

mysql> CALL issueitem(); 

...輸出將開始在你推出控制檯,顯示您的內部值該過程在迭代循環時遇到。

這個或其他SELECT像這樣的陳述添加到別處,將公開內部變量,這應該可以幫助您找到問題。在從代碼甚至GUI調用過程之前,您需要先刪除它們,因爲GUI可能無法很好地處理它們 - 它可能會開始打開新選項卡或拆分窗格,或者在第一個SELECT之後忽略所有內容。

請注意,循環的最後一次迭代,您可能會看到上一次重複的值,因爲從光標讀取失敗可能不會重置變量,但「done」也將從0轉換爲1,指示遊標已經用盡了行並且發起了CONTINUE HANDLER,所以這些值實際上不會被處理兩次。