2012-04-16 7 views
0

私はかなり新しい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$$ 
+0

あなたが提示したコードがエラーを意味しますか? – wallyk

+0

申し訳ありませんが、エラー1064の構文エラーです。それはs_segidの直後のifステートメントのセミコロンにあります。 – Jason

答えて

0

問題がそうするとき、内部ループ、あなたがストアドプロシージャで複数の「見つからない」ハンドラを持つことができないということです「見つからない」状態になると、外側ループの「no rows found」変数もtrueに設定され、外側ループが終了します。

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

+0

答えをありがとう、私はそれらを分割しますが、今私のエラーはifステートメント自体にあります - 上記のエラーを参照してください – Jason

関連する問題