私はかなり新しいSQLですので、コードや説明が不明な場合はお詫び申し上げますが、不明な点があれば私に尋ねてください。複数のステートメントを使用しているMySQLの構文
基本的には、いくつかの条件に基づいてsegmentid値をflight_timesテーブルに割り当てるために2つのカーソルを使用するプロシージャがあります。これらの条件では、1)segmentIDを割り当ててセグメントカーソルから次のレコードをフェッチする、2)null値を割り当ててからflight_timesカーソルから次の行をフェッチする、3)飛行時間とフライト番号が一致しない場合、セグメントカーソルから次の行をフェッチします。
私が抱えている問題は、構文エラーがあると言っていなくても、複数の文を受け入れるためにIF文を取得できないということです。たとえば、null値を代入しようとすると、timesカーソルから別のレコードを取得できません。私がここで間違っていることに誰かが提供してくれるような援助は感謝しています。私は、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$$
あなたが提示したコードがエラーを意味しますか? – wallyk
申し訳ありませんが、エラー1064の構文エラーです。それはs_segidの直後のifステートメントのセミコロンにあります。 – Jason