0

私は SQL にかなり慣れていないので、コードや説明が明確でない場合は申し訳ありませんが、不明な点がある場合は明確化を求めてください。

基本的に、いくつかの条件に基づいて、2 つのカーソルを使用して、segmentid 値を flight_times テーブルに割り当てる手順があります。これらの条件では、1) セグメント ID を割り当ててからセグメント カーソルから次のレコードをフェッチする、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$$
4

1 に答える 1

0

問題は、ストアド プロシージャに複数の "not found" ハンドラーを含めることができないため、内側のループが "not found" 状態になると、外側のループの "no rows found" 変数も true に設定され、処理が終了することです。外側のループ。

解決策は、ロジックを 2 つのストアド プロシージャ (カーソルごとに 1 つ) に分割し、外側のストアド プロシージャから内側のストアド プロシージャを呼び出すことです。

于 2012-04-16T00:51:09.947 に答える