2017-10-18 88 views
0

下面的代碼只循環一次遊標,在一個循環中,它將product_name和list_price設置爲null。我已經運行了SELECT語句(CURSOR的那個),它返回4個結果。我不確定如何或爲何它在所有4次不循環,爲什麼,它的單迴路,它是幹什麼的,是不是使用PRODUCT_NAME和list_price第一記錄的值MySQL CURSOR沒有獲取所需的行

DROP PROCEDURE IF EXISTS test; 
DELIMITER // 
CREATE PROCEDURE test() 
BEGIN 
    DECLARE retString VARCHAR(1000); 
    DECLARE rowNotFound TINYINT DEFAULT FALSE; 
    DECLARE product_name VARCHAR(255); 
    DECLARE list_price DECIMAL(10,2); 

    DECLARE prodCursor CURSOR FOR 
     SELECT product_name, list_price FROM products WHERE list_price > 700 ORDER BY list_price DESC; 
    DECLARE CONTINUE HANDLER FOR NOT FOUND 
     SET rowNotFound = TRUE; 

    OPEN prodCursor; 

    WHILE rowNotFound = FALSE DO 
     FETCH prodCursor INTO product_name, list_price; 
     SET retString = CONCAT(retString, '"', product_name, '","' , list_price, '"|'); 
    END WHILE; 

    CLOSE prodCursor; 

    SELECT retString AS 'Message'; 
END// 
DELIMITER ; 

CALL test(); 

回答

0

以下結束了速記答案。我有兩個問題,首先在SELECT語句中的比較需要更好地量化,並且(如@ spencer7593指出的那樣)將retString初始化爲null。

DROP PROCEDURE IF EXISTS test; 
DELIMITER // 
CREATE PROCEDURE test() 
BEGIN 
    DECLARE retString VARCHAR(1000); 
    DECLARE rowNotFound TINYINT DEFAULT FALSE; 
    DECLARE product_name VARCHAR(255); 
    DECLARE list_price DECIMAL(10,2); 

    DECLARE prodCursor CURSOR FOR 
     SELECT p.product_name, p.list_price FROM products p WHERE p.list_price > 700.00 ORDER BY p.list_price DESC; 
    DECLARE CONTINUE HANDLER FOR NOT FOUND 
     SET rowNotFound = TRUE; 

    SET retString = ''; 
    OPEN prodCursor; 

    WHILE rowNotFound = FALSE DO 
     FETCH prodCursor INTO product_name, list_price; 
     SET retString = CONCAT(retString, '"', product_name, '","' , list_price, '"|'); 
    END WHILE; 

    CLOSE prodCursor; 

    SELECT retString AS 'Message'; 
END// 
DELIMITER ; 
1

我認爲問題是, retString初始化爲NULL

而且我們知道表達:

CONCAT(NULL,'something') 

評估爲NULL。無論我們添加多少個非NULL值,它仍然是NULL。

嘗試在循環之前將retString初始化爲非NULL值。

SET retString = 'foo'; 

然後看看你得到了什麼。我懷疑有一個空字符串開始將得到你所追求的:

SET retString = ''; 

這也可以被指定爲DEFAULT的程序變量,而不是一個單獨的SET聲明。

如果CONCAT函數中的參數的任何評估爲NULL,則CONCAT將返回NULL。 (考慮當product_namelist_price爲NULL會發生什麼。)MySQL有用於測試NULL值,否則返回東西一個方便的功能...

IFNULL(foo,'bar') 

IF(foo IS NULL,'bar',foo)