我对SQL很新,所以如果我的代码和/或解释不明确,我会道歉但是如果有些不清楚的话请向我澄清。
基本上我有一个程序使用两个游标根据某些条件将segmentid值分配给flight_times表。在这些条件下,我将1)分配一个segmentID,然后从segment游标中获取下一条记录,2)分配一个空值然后从flight_times游标中获取下一行,或3)如果flightdate和航班号不匹配,从段光标中获取下一行。
我遇到的问题是,我不能让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 :(得分:0)
问题是你不能在存储过程中有多个“未找到”处理程序,所以当内循环得到“未找到”条件时,外循环的“找不到行”变量也设置为true ,终止外循环。
解决方案是将逻辑拆分为两个存储过程 - 每个游标一个 - 并从外部过程调用内部存储过程。