【问题标题】:MySQL cursor issues: what did i do wrong?MySQL游标问题:我做错了什么?
【发布时间】:2016-04-04 03:55:43
【问题描述】:

我一直在编写这段代码,根据这本书应该这样做:

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

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

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;

【问题讨论】:

    标签: mysql stored-procedures cursor


    【解决方案1】:

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

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

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

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

    (我想我已经在该输出中得到了所有单引号和双引号,但我不做任何承诺。;)

    【讨论】:

    • 那没有做到。它所做的只是改变了列的名称,我不需要为这些做参数,只是一个结果。
    • 好的。我刚刚阅读了CONCAT 的文档,我有了一个更好的主意。
    【解决方案2】:

    我通过在进入循环之前初始化结果变量并去掉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 //
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-05
      • 2021-09-04
      • 2016-08-01
      • 2023-03-22
      • 1970-01-01
      • 1970-01-01
      • 2013-11-25
      • 1970-01-01
      相关资源
      最近更新 更多