根据这本书,我一直在研究这段代码:
编写一个脚本,用于创建和调用名为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;
答案 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 //