MySQL游标问题:我做错了什么?

时间:2016-04-04 03:55:43

标签: mysql stored-procedures cursor

根据这本书,我一直在研究这段代码:

  

编写一个脚本,用于创建和调用名为test的存储过程。   此存储过程应为结果集创建一个游标   由每个产品的product_name和list_price列组成   标价高于700美元。此结果中的行   set应按列表价格按降序排序。然后,   procedure应该显示一个包含的字符串变量   product_name和每个产品的定价,所以它看起来像什么   像这样:"Gibson SG", "2517.00" | "Gibson Les Paul", "1199.00""

不幸的是,我的代码所做的是返回null值而不是任何东西。我做错了什么?

USE my_guitar_shop;

DROP PROCEDURE IF EXISTS test;

DELIMITER //

Create Procedure test()
Begin
    DECLARE names_var VARCHAR(50);
    DECLARE prices_var DECIMAL (8,2);
    DECLARE results VARCHAR(150);
    DECLARE done TINYINT;

    DECLARE products_cursor CURSOR FOR
        SELECT product_name, list_price FROM products;

    DECLARE continue handler for not found set done = 1;
    SET done = 0;

    OPEN products_cursor;

    testloop : loop
    FETCH products_cursor INTO names_var, prices_var;
    IF done = 1 then leave testloop;
    END IF;

    IF prices_var > 700 THEN
        SET results = concat(results, "names_var", ', ', "prices_var", '|');
    END if;
    END loop testloop; 

    CLOSE products_cursor;

    SELECT results;


END //

DELIMITER ;

Call test;

2 个答案:

答案 0 :(得分:0)

根据文档,如果任何参数 null CONCAT将返回 null 。我怀疑正在发生的事情是,您的选择是从其中一行返回 null ,这会消除results的整个内容。

要处理这种情况,您可以使用COALESCE,如下所示:

IF prices_var > 700 THEN
    SET results = concat(results, '"', COALESCE(names_var, ' '), '", "', COALESCE(prices_var, ' '), '" | ');

COALESCE的调用返回变量的值(如果它不为null),如果变量为null,则返回空字符串' '

(我想我的输出中只有单引号和双引号,但我没有做出任何承诺。;)

答案 1 :(得分:0)

我通过在进入循环之前初始化结果变量并取消了names_var和prices_var

周围的报价来解决了这个问题
Create Procedure test()
BEGIN
DECLARE names_var VARCHAR(50);
DECLARE prices_var DECIMAL (8,2);
DECLARE results VARCHAR(400);
DECLARE done INT;


DECLARE products_cursor 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 done = 1;
SET done = 0;
SET results = '';

OPEN products_cursor;

testloop : loop
FETCH products_cursor INTO names_var, prices_var;

IF done = 1 THEN
LEAVE testloop;
END IF;

SET results = concat('"', names_var, '"', ',', '"', prices_var, '"', "|", results);

END loop testloop; 

SELECT results;
CLOSE products_cursor;

END //