SQL 程序参数
SQL procedure parameter
我正在尝试在 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 语法错误;
按日期排序;
DECLARE CONTINUE HANDLER' à la ligne 53
你能帮帮我吗?
'date'是MySQL中的保留字。使用另一个别名。
此外,您应该考虑使用 CASE 语句来摆脱多个 UNION 语句(您可以在一个查询中创建所有 UNION)。
编辑:
正如 spencer7593 已经指出的那样,错误来自于您有额外的分号这一事实。
event_param_X 列声明为 varchar,但您正在对这些列进行算术运算 (+-)。
有一些虚假的分号(语句终止符)。
WHERE date >= p_dateFrom;
AND date <= p_dateTo;
ORDER BY date DESC;
删除那些
WHERE date >= p_dateFrom
AND date <= p_dateTo
ORDER BY date DESC
;
原(错误)答案:
CONTINUE HANDLER
必须跟在变量声明之后,但需要在游标声明之前。 (我认为这在 MySQL 参考手册中有模糊的记录。MySQL 存储程序对语句的顺序非常讲究。)
要修复该错误,只需将 DECLARE CONTINUE HANDLER
语句移到第一个 DECLARE CURSOR
之前。
我正在尝试在 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 语法错误; 按日期排序; DECLARE CONTINUE HANDLER' à la ligne 53
你能帮帮我吗?
'date'是MySQL中的保留字。使用另一个别名。
此外,您应该考虑使用 CASE 语句来摆脱多个 UNION 语句(您可以在一个查询中创建所有 UNION)。
编辑: 正如 spencer7593 已经指出的那样,错误来自于您有额外的分号这一事实。
event_param_X 列声明为 varchar,但您正在对这些列进行算术运算 (+-)。
有一些虚假的分号(语句终止符)。
WHERE date >= p_dateFrom;
AND date <= p_dateTo;
ORDER BY date DESC;
删除那些
WHERE date >= p_dateFrom
AND date <= p_dateTo
ORDER BY date DESC
;
原(错误)答案:
CONTINUE HANDLER
必须跟在变量声明之后,但需要在游标声明之前。 (我认为这在 MySQL 参考手册中有模糊的记录。MySQL 存储程序对语句的顺序非常讲究。)
要修复该错误,只需将 DECLARE CONTINUE HANDLER
语句移到第一个 DECLARE CURSOR
之前。