MySQL CURSOR没有获取所需的行

时间:2017-10-18 00:32:20

标签: mysql cursor

以下代码仅循环遍历游标一次,在该循环中,它将product_name和list_price设置为null。我自己运行了SELECT语句(CURSOR的语句)并返回4个结果。我不确定它是如何或为什么不循环所有4次以及为什么,在它所做的单循环上,没有使用product_name和list_price的第一个记录值

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();

2 个答案:

答案 0 :(得分: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)

的简写

答案 1 :(得分: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 ;