MySQL的。存储过程错误1328

时间:2017-11-13 13:26:54

标签: mysql stored-procedures informix

这真令人困惑。我正在将一个简单的过程从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;

我还没有检查过其余的方法是否有效,因为我收到了这个错误:

  
      
  1. FETCH变量数量不正确。
  2.   

这是否意味着我为每个查询返回声明了一个不同的变量?我是mysql的新手。如果是这种情况,什么是解决这个难题的最佳方法?我还改为列和表名。

非常感谢

2 个答案:

答案 0 :(得分:1)

looper: BEGIN
DECLARE curs1 CURSOR FOR
SELECT eve_date, dia_weekno, eve_event 
FROM game_event 
INNER JOIN stan_calendar ON eve_abs_dayno = dia_abs_dayno
WHERE eve_date = lv_today
AND eve_start >= lv_time
UNION 
SELECT eve_date, dia_weekno, eve_event 
FROM game_event 
INNER JOIN stan_calendar ON eve_abs_dayno = dia_abs_dayno 
WHERE eve_date > lv_today
UNION SELECT DATE(NOW()) AS eve_date, 9999 AS dia_weekno, 9999 AS eve_event 
FROM game_event 
INNER JOIN stan_calendar ON eve_abs_dayno = dia_abs_dayno
WHERE (SELECT MAX(eve_event) FROM game_event) ORDER BY eve_event;

DECLARE CONTINUE HANDLER FOR NOT FOUND SET done := TRUE;

OPEN curs1;

curs_loop: LOOP
    FETCH curs1 INTO lv_date, lv_week, lv_event;

    SELECT lv_date, lv_week, lv_event;
    LEAVE looper;

    CLOSE curs1;
END LOOP curs_loop;

感谢您回答我的问题,我已经把它重新回到了我的想法......它现在有效了。这是完整的循环。

答案 1 :(得分:0)

https://dev.mysql.com/doc/refman/5.7/en/fetch.html SELECT语句检索的列数必须与FETCH语句中指定的输出变量数匹配,所以是的,但事实上你只选择了1个连接字符串--I认为你的第一个问题是选择语法,它不需要concat,括号或引号(除非你因某种原因试图创建一个准备好的语句 - 即使你是我怀疑代码是否会正确的)

简单光标

DROP PROCEDURE IF EXISTS EC;
DELIMITER $$

CREATE  PROCEDURE `EC`(
    IN `inemp_no` varchar(255)

)
LANGUAGE SQL
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
LOOPER:begin
DECLARE done INT DEFAULT FALSE;
declare ename varchar(20);
declare esalary int default 0;
declare emp_cursor CURSOR FOR 
 SELECT last_name,salary FROM employees where emp_no= inemp_no ;

DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

open emp_cursor;
read_loop: loop
        fetch emp_cursor into ename,esalary;
        if done then leave read_loop; end if;
        insert into debug_table (msg) values(concat('employee:',ename,' earns:',esalary));
end loop;
close emp_cursor;
end $$

DELIMITER ;



MariaDB [sandbox]> truncate table debug_table;
Query OK, 0 rows affected (0.22 sec)

MariaDB [sandbox]> call ec(2);
Query OK, 0 rows affected (0.03 sec)

MariaDB [sandbox]> select * from debug_table;
+----+--------------------------+------+
| id | msg                      | MSG2 |
+----+--------------------------+------+
|  1 | employee:BBB earns:39500 | NULL |
+----+--------------------------+------+
1 row in set (0.00 sec)