以下代码仅循环遍历游标一次,在该循环中,它将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();
答案 0 :(得分:1)
我认为问题是retString
已初始化为NULL
。
我们知道表达式:
CONCAT(NULL,'something')
评估为NULL
。无论我们添加多少非NULL值,它仍然是NULL。
尝试在循环之前将retString
初始化为非NULL值。
SET retString = 'foo';
看看你得到了什么。我怀疑以空字符串开头会让你得到你想要的东西:
SET retString = '';
这也可以指定为过程变量的DEFAULT
,而不是单独的SET
语句。
如果CONCAT
函数中的任何参数计算为NULL,则CONCAT将返回NULL
。 (考虑当product_name
或list_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 ;