2013-04-13 32 views
1

當試圖在phpMyAdmin的SQL窗口將返回以下錯誤..mysql的程序 - 運行總

SQL

DELIMITER $$ 

DROP FUNCTION IF EXISTS `stock_in_stock_ids` $$ 
CREATE DEFINER=`root`@`localhost` FUNCTION `stock_in_stock_ids`(_running_total_limit INT, _product_id INT, _block_id INT) RETURNS TEXT 
BEGIN 
    DECLARE done INT DEFAULT FALSE; 
    DECLARE _running_qty INT DEFAULT 0; 
    DECLARE _id INT; 
    DECLARE _qty INT; 
    DECLARE _ids TEXT DEFAULT NULL; 

    DECLARE _cur CURSOR FOR 
     SELECT id, qty 
     FROM stock 
     WHERE block_id=_block_id && type=2 && product_id=_product_id 
     ORDER BY time DESC, id DESC; 
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; 

    OPEN _cur; 

    read_loop: LOOP 
     FETCH _cur INTO _id, _qty; 

     IF done THEN 
      SET _ids = ''; 
      LEAVE read_loop; 
     END IF; 

     SET _running_qty = _running_qty + _qty; 
     SET _ids = CONCAT_WS(',', _ids, _id); 

     IF _running_qty >= _running_total_limit THEN 
      LEAVE read_loop; 
     END IF; 
    END LOOP read_loop; 

    CLOSE _cur; 

    RETURN _ids; 
END $$ 

DELIMITER ; 

錯誤

#1418 - This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable) 

更新(工作液運行此)

SELECT qty, price_cost, @running_total:[email protected] running_total, @total:[email protected]+qty total 
FROM stock, (SELECT @running_total:=0, @total:=0) vars 
WHERE block_id=101 && type=2 && product_id=20 
HAVING running_total<=3000 
ORDER BY time DESC, id DESC 

回答

1

Yo你想使用存儲過程,但正在使用一個函數。有區別,你知道嗎?

另外我覺得你根本不需要程序,更不用說遊標了。光標很貴,像地獄一樣。

這是否得到你想要的?

SELECT * FROM (
    SELECT 
    id, 
    qty, 
    @running_total:[email protected]_total + qty as running_total 
    FROM stock 
    , (SELECT @running_total:=0) vars 
    WHERE block_id=_block_id && type=2 && product_id=_product_id 
    ORDER BY time DESC, id DESC 
) sq 
WHERE running_total <= $yourRunningTotalLimit 
+0

你有一個鏈接,我可以閱讀更多關於這些內部變量'@running_total:'?這叫什麼? – clarkk

+0

它看起來像它返回我想要的! :D – clarkk

+1

這些是用戶定義的變量。你可以在這裏閱讀更多關於它們的內容:http://dev.mysql.com/doc/refman/5.0/en/user-variables.html我對''做了什麼,(SELECT @running_total:= 0)vars'就是在查詢中動態初始化它們。這與SET @running_total:= 0相同。 SELECT ...'沒有',(SELECT @running_total:= 0)vars'部分。 – fancyPants