mysql - SQL 过程参数

标签 mysql sql stored-procedures procedure

我正在尝试在 sql 中执行一个过程,但我在日期参数方面遇到一些问题

DELIMITER #
CREATE PROCEDURE conso(IN p_upcNameId VARCHAR(20), IN p_dateFrom DATE, IN p_dateTo DATE)     
BEGIN
    DECLARE done int default false;

    DECLARE v_cumule FLOAT;

    DECLARE v_reserve VARCHAR(40);
    DECLARE v_kg VARCHAR(40);
    DECLARE v_date DATETIME;

    DECLARE v_reserve_1 VARCHAR(40);
    DECLARE v_kg_1 VARCHAR(40);
    DECLARE v_date_1 DATETIME;

    DECLARE cur1 CURSOR FOR
        SELECT reserve, kg, date
        FROM
        (
            ( SELECT event_param_3 as reserve, event_param_4 as kg, event_datetime as date FROM events WHERE upcNameId = p_upcNameId AND event_code = 50 ORDER BY event_datetime DESC )
            UNION
            ( SELECT event_param_2 as reserve, event_param_3 as kg, event_datetime as date FROM events WHERE upcNameId = p_upcNameId AND event_code = 54 ORDER BY event_datetime DESC )

            UNION
            ( SELECT event_param_2 as reserve, event_param_3 as kg, event_datetime as date FROM events WHERE upcNameId = p_upcNameId AND event_code = 52 ORDER BY event_datetime DESC )
            UNION
            ( SELECT event_param_1 as reserve, event_param_2 as kg, event_datetime as date FROM events WHERE upcNameId = p_upcNameId AND event_code = 56 ORDER BY event_datetime DESC )

            UNION
            ( SELECT event_param_2 as reserve, event_param_3 as kg, event_datetime as date FROM events WHERE upcNameId = p_upcNameId AND event_code = 53 ORDER BY event_datetime DESC )
            UNION
            ( SELECT event_param_1 as reserve, event_param_2 as kg, event_datetime as date FROM events WHERE upcNameId = p_upcNameId AND event_code = 57 ORDER BY event_datetime DESC )
        ) as diffusion_programs
        ORDER BY date DESC;
    DECLARE cur2 CURSOR FOR
        SELECT reserve, kg, date
        FROM
        (
            ( SELECT event_param_3 as reserve, event_param_4 as kg, event_datetime as date FROM events WHERE upcNameId = p_upcNameId AND event_code = 50 ORDER BY event_datetime DESC )
            UNION
            ( SELECT event_param_2 as reserve, event_param_3 as kg, event_datetime as date FROM events WHERE upcNameId = p_upcNameId AND event_code = 54 ORDER BY event_datetime DESC )

            UNION
            ( SELECT event_param_2 as reserve, event_param_3 as kg, event_datetime as date FROM events WHERE upcNameId = p_upcNameId AND event_code = 52 ORDER BY event_datetime DESC )
            UNION
            ( SELECT event_param_1 as reserve, event_param_2 as kg, event_datetime as date FROM events WHERE upcNameId = p_upcNameId AND event_code = 56 ORDER BY event_datetime DESC )

            UNION
            ( SELECT event_param_2 as reserve, event_param_3 as kg, event_datetime as date FROM events WHERE upcNameId = p_upcNameId AND event_code = 53 ORDER BY event_datetime DESC )
            UNION
            ( SELECT event_param_1 as reserve, event_param_2 as kg, event_datetime as date FROM events WHERE upcNameId = p_upcNameId AND event_code = 57 ORDER BY event_datetime DESC )
        ) as diffusion_programs
        WHERE date >= p_dateFrom;
        AND date <= p_dateTo;
        ORDER BY date DESC;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
    OPEN cur1;
    OPEN cur2;

    /* Create temporary table */
    CREATE TEMPORARY TABLE tmp
    (
        date DATE,
        kg FLOAT
    );
    SET v_cumule = 0;
    FETCH cur2 INTO v_reserve_1, v_kg_1, v_date_1;

    forLoop: LOOP
        /* Actual row */
        FETCH cur1 INTO v_reserve, v_kg, v_date;

        /* Next row */
        FETCH cur2 INTO v_reserve_1, v_kg_1, v_date_1;

        /* Reserves differents TODO */
        /*IF v_reserve != v_reserve_1
        END IF;*/

        IF DATE(v_date) = DATE(v_date_1) THEN SET v_cumule = v_cumule + (v_kg_1 - v_kg);
        ELSE
            INSERT INTO tmp VALUES (DATE(v_date), v_cumule);
            SET v_cumule = 0;
        END IF;

        IF done THEN LEAVE forLoop;
        END IF;
    END LOOP;

    CLOSE cur1;
    CLOSE cur2;
END#

您会看到 p_datefrom 和 p_dateto 是我在调用函数时想要传递的一些参数:

DELIMITER ;
CALL conso('Name','2017-01-01','2018-01-01');
SELECT * FROM tmp;

如您所见,这是一个日期间隔。 但我收到此错误:

1064 - 'AND date <= p_dateTo; 语法错误 按日期 DESC 排序; 声明 CONTINUE HANDLER' à la ligne 53

你能帮我吗?

最佳答案

'date'是MySQL中的保留字。使用另一个别名。

此外,您应该考虑使用 CASE 语句来消除多个 UNION 语句(您可以在一个查询中进行所有 UNION 语句)。

编辑: 该错误来自以下事实:您有多余的分号,正如 spencer7593 已经指出的那样。

event_param_X 列被声明为 varchar,但您正在对它们进行算术运算 (+-)。

关于mysql - SQL 过程参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50003974/

相关文章:

mysql STR_TO_DATE 函数

mysql 从同一个表中选择一个值作为另一个值

php - 如何在mysql表中添加特定单元格

mysql - 将数组传递给 MySQL 存储例程

MySql存储过程调用错误

javascript - 将表单值从 PHP 文件传递​​到另一个 PHP 文件

java - 在Java中,PreparedStatement如何为以下查询工作

sql - SSIS - OLEDB 源代码 - 如何使用带变量的 sql 查询?

python - 如何使用 Python 列表中的值查询 SQLite 数据库?

mysql - 有没有比使用存储过程更好的方法?