IF,THEN语句在MySQL中有多个语句

问题描述:

我对SQL相当陌生,所以如果我的代码和/或解释不清楚,请致信我澄清,如果有些事情不清楚,我请道歉。IF,THEN语句在MySQL中有多个语句

基本上我有一个程序,它使用两个游标根据一些条件将一个分段值赋值给一个flight_times表。在这些条件下,我将1)分配一个segmentID,然后从段游标中获取下一条记录,2)分配一个空值,然后从flight_times光标读取下一行,或者3)如果flightdate和flight number不匹配,从段游标中获取下一行。

我遇到的问题是我不能让IF语句接受多个语句,而不会说我有语法错误。例如,在我尝试分配空值后,我无法从时间光标中获取另一条记录。我很感谢任何人可能提供的帮助我在这里做错了什么。我已阅读MySQL手册,它确实表明,允许我有多个语句

CREATE PROCEDURE write_flight_times(OUT f_date DATE, OUT f_no VARCHAR(20), OUT s_segid INT, OUT s_iataid CHAR(3), 
OUT ft_date DATE, OUT ft_no VARCHAR(20), OUT ft_iataid CHAR(3)) 

BEGIN 

DECLARE var_no_more_rows BOOLEAN DEFAULT FALSE; 
DECLARE var_no_more_rows1 BOOLEAN DEFAULT FALSE; 

DECLARE cur_segments CURSOR FOR 
    SELECT flightdate, flightno, segmentid, iataid 
    FROM flights f JOIN segments s ON f.flightid = s.flights_flightid 
    ORDER BY flightdate, flightno, segmentid; 

DECLARE cur_times CURSOR FOR 
    SELECT flights_flightdate, flights_flightno, a.iataid 
    FROM temp_flight_times tft JOIN airports a ON a.icaoid = tft.airports_icaoid 
    ORDER BY flights_flightdate, flights_flightno, depttime; 

DECLARE CONTINUE HANDLER FOR NOT FOUND 

SET var_no_more_rows := TRUE; 
SET var_no_more_rows1 := TRUE; 

OPEN cur_segments; 

loop_segments: 
LOOP 
    FETCH cur_segments INTO f_date, f_no, s_segid, s_iataid; 
    IF var_no_more_rows THEN 
     CLOSE cur_segments; 
     LEAVE loop_segments; 
    END IF; 

    OPEN cur_times; 

    loop_times: 
    LOOP 
     FETCH cur_times INTO ft_date, ft_no, ft_iataid; 
      IF var_no_more_rows1 THEN 
       CLOSE cur_times; 
       LEAVE loop_times; 
      END IF; 

      IF (f_date = ft_date AND f_no = ft_no) THEN 
       IF s_iataid = ft_iataid THEN 
        s_segid; 
       ELSE 
        NULL; 
        FETCH cur_times INTO ft_date, ft_no, ft_iataid; 
       END IF 
      ELSE 
       FETCH cur_segments INTO f_date, f_no, s_segid, s_iataid; 
      END IF) AS segmentid 
    END LOOP loop_times; 
    END LOOP loop_segments; 
    END$$ 
+0

您提供的代码是否给出错误? – wallyk 2012-04-16 00:46:54

+0

对不起,错误1064语法错误。它是在if语句中的分号之后的s_segid – Jason 2012-04-16 00:53:52

的问题是,你不能有多个“未找到”处理器在存储的过程,所以当内环得到一个“not found”条件,外层循环的“no rows found”变量也被设置为true,终止外层循环。

解决的办法是将逻辑分成两个存储过程 - 每个游标一个 - 并从外部调用内部存储的过程。

+0

谢谢你的答案,我会分裂他们,但现在我的错误是在if语句本身 - 见上面的错误评论 – Jason 2012-04-16 01:06:09