sql过程参数

m1m5dgzv  于 2021-06-24  发布在  Mysql
关注(0)|答案(2)|浏览(447)

我试图在sql中执行一个过程,但是我在使用日期参数时遇到了一些问题

  1. DELIMITER #
  2. CREATE PROCEDURE conso(IN p_upcNameId VARCHAR(20), IN p_dateFrom DATE, IN p_dateTo DATE)
  3. BEGIN
  4. DECLARE done int default false;
  5. DECLARE v_cumule FLOAT;
  6. DECLARE v_reserve VARCHAR(40);
  7. DECLARE v_kg VARCHAR(40);
  8. DECLARE v_date DATETIME;
  9. DECLARE v_reserve_1 VARCHAR(40);
  10. DECLARE v_kg_1 VARCHAR(40);
  11. DECLARE v_date_1 DATETIME;
  12. DECLARE cur1 CURSOR FOR
  13. SELECT reserve, kg, date
  14. FROM
  15. (
  16. ( 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 )
  17. UNION
  18. ( 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 )
  19. UNION
  20. ( 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 )
  21. UNION
  22. ( 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 )
  23. UNION
  24. ( 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 )
  25. UNION
  26. ( 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 )
  27. ) as diffusion_programs
  28. ORDER BY date DESC;
  29. DECLARE cur2 CURSOR FOR
  30. SELECT reserve, kg, date
  31. FROM
  32. (
  33. ( 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 )
  34. UNION
  35. ( 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 )
  36. UNION
  37. ( 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 )
  38. UNION
  39. ( 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 )
  40. UNION
  41. ( 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 )
  42. UNION
  43. ( 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 )
  44. ) as diffusion_programs
  45. WHERE date >= p_dateFrom;
  46. AND date <= p_dateTo;
  47. ORDER BY date DESC;
  48. DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
  49. OPEN cur1;
  50. OPEN cur2;
  51. /* Create temporary table */
  52. CREATE TEMPORARY TABLE tmp
  53. (
  54. date DATE,
  55. kg FLOAT
  56. );
  57. SET v_cumule = 0;
  58. FETCH cur2 INTO v_reserve_1, v_kg_1, v_date_1;
  59. forLoop: LOOP
  60. /* Actual row */
  61. FETCH cur1 INTO v_reserve, v_kg, v_date;
  62. /* Next row */
  63. FETCH cur2 INTO v_reserve_1, v_kg_1, v_date_1;
  64. /* Reserves differents TODO */
  65. /*IF v_reserve != v_reserve_1
  66. END IF;*/
  67. IF DATE(v_date) = DATE(v_date_1) THEN SET v_cumule = v_cumule + (v_kg_1 - v_kg);
  68. ELSE
  69. INSERT INTO tmp VALUES (DATE(v_date), v_cumule);
  70. SET v_cumule = 0;
  71. END IF;
  72. IF done THEN LEAVE forLoop;
  73. END IF;
  74. END LOOP;
  75. CLOSE cur1;
  76. CLOSE cur2;
  77. END#

您可以看到p\u datefrom和p\u dateto是调用函数时要传递的参数:

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

如你所见,这是一个日期间隔。但我有个错误:
1064年-erreur de Syntax près de'和日期<=p_dateto;按日期说明订购;'声明继续处理程序'à 拉利尼53
你能帮帮我吗?

rjee0c15

rjee0c151#

“date”是mysql中的保留字。请使用其他别名。
另外,您应该考虑使用case语句来摆脱多个union语句(您可以在一个查询中生成所有union语句)。
编辑:这个错误是因为斯宾塞7593已经指出,您有多余的分号。
event_param_x列被声明为varchar列,但是您正在对这些列执行算术运算(+-)。

3hvapo4f

3hvapo4f2#

有一些假分号(语句终止符)。

  1. WHERE date >= p_dateFrom;
  2. AND date <= p_dateTo;
  3. ORDER BY date DESC;

把那些拿走

  1. WHERE date >= p_dateFrom
  2. AND date <= p_dateTo
  3. ORDER BY date DESC
  4. ;

原始(错误)答案:
这个 CONTINUE HANDLER 必须在变量声明之后,但必须在游标声明之前(我认为这在mysql参考手册中有模糊的记录。mysql存储程序非常讲究语句的顺序。)
要纠正这个错误,只需移动 DECLARE CONTINUE HANDLER 在第一个 DECLARE CURSOR .

相关问题