【发布时间】:2017-11-13 13:26:53
【问题描述】:
这真的让我很困惑。我正在将一个简单的过程从informix 转换为mysql。它的基本作用是告诉我事件表和日历表中的下一个事件是什么。在informix中,过程很简单。
FOREACH
SELECT date,weekno,event
INTO l_date,l_week,l_event
FROM event,calendar
WHERE dayno = dayno
AND date = l_today
AND start >= l_now
UNION
SELECT date,weekno,event
FROM event,calendar
WHERE dayno = dayno
AND date > l_today
UNION
SELECT TODAY,9999,9999
FROM event,calendar
WHERE dayno = dayno
AND event = (SELECT MAX(event) FROM event)
ORDER BY 3
if l_event = 9999 then <error> end if;
EXIT FOREACH
END FOREACH
所以基本上查询会找到下一个事件并返回它。 l_today 和 l_event 是传递的参数。等到mysql版本。
looper: BEGIN
DECLARE curs1 CURSOR FOR
SELECT CONCAT("SELECT date, weekno, event FROM event INNER JOIN calendar ON dayno = dayno",
" WHERE date = '", lv_today ,"' AND start >= '", lv_time ,"'",
" UNION SELECT date, weekno, event FROM event INNER JOIN calendar ON dayno = dayno WHERE date > '", lv_today ,"'",
" UNION SELECT DATE(NOW()) AS date, 9999 AS weekno, 9999 AS event FROM event INNER JOIN calendar ON dayno = dayno",
" WHERE (SELECT MAX(event) FROM event) ORDER BY event ");
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done := TRUE;
OPEN curs1;
loop1: LOOP
FETCH curs1 INTO ldate, lweek, levent;
SELECT ldate, lweek, levent;
LEAVE looper;
END LOOP loop1;
END;
我没有检查其余的方法是否有效,因为我收到了这个错误:
- FETCH 变量的数量不正确。
这是否意味着我为每个查询返回声明了不同的变量?我是mysql的新手。如果是这种情况,解决这个难题的最佳方法是什么?我也更改了列名和表名。
非常感谢
【问题讨论】:
-
SELECT CONCAT('SELECT 1, 2, 3 FROM DUAL');和SELECT 1, 2, 3 FROM DUAL;是有区别的,见db-fiddle。 -
你在循环中有
SELECT ldate, lweek, levent;。这些选定的值存储在哪里?或者那是在做什么?从 Informix 的角度来看,这对我来说似乎是最奇特的。
标签: mysql stored-procedures informix