2012-02-10 11 views
1

このストアドプロシージャはマテリアル予約を処理しています。基本的な考え方は、この材料のどれがすでに雇われているかをチェックすることです。ストックにまだ材料がある場合は、新しいオーダーを挿入します。この予約IDのこの品目の予約が既にある場合は、金額を更新しています。mysqlの不思議な振る舞いのストアドプロシージャ

私は何か間違っているかもしれませんが、私は新しい予約を追加しようとすると動作します。更新プログラムは動作しません。特定の品目IDの予約が既にある場合、別の予約IDでレンタルすることはできません。

私はあなたの例を与える:

CALL aantal_besch_mat_van_tot('2007-03-13','2007-03-14',15,6,50,'procedure test lol'); 

[OK]をので、これは動作しますが、私は再びそれを実行したとき、それは100それは決してアップデートする必要がありますので、量50は50 +前回に行く必要があります。

また、別の予約IDで同じマテリアルを借りると、動作しません。 例:

CALL aantal_besch_mat_van_tot('2007-03-13','2007-03-14',15,7,50,'Im hiring this material'); 

これも機能しません。

私はすでにal value'sを印刷しており、適切な金額を得ています。

は、ここでは、私のストアドプロシージャのコードを見つけることができます。

DELIMITER $$ 
CREATE DEFINER=`root`@`localhost` PROCEDURE `fabiola`.`aantal_besch_mat_van_tot`(IN `p_datum_van` date,IN `p_datum_tot` date,IN `p_mat_id` int, IN `p_res_id` int, IN `p_nodig` int, IN `p_mat_opmerking` VARCHAR(255)) 

BEGIN 
    DECLARE aantal INT DEFAULT 0; 
    DECLARE tot INT DEFAULT 0; 
    DECLARE upda INT DEFAULT 0; 
    DECLARE nieuwa INT DEFAULT 0; 
    DECLARE voriga INT DEFAULT 0; 
    DECLARE test INT DEFAULT 0; 
    DECLARE res_van datetime; 
    DECLARE res_tot datetime; 

    -- Overeenkomstige data selecteren 
    SELECT r.incheckdatum, r.uitcheckdatum FROM reservaties r 
    WHERE r.id = p_res_id 
    INTO res_van, res_tot; 

     SELECT mpr.aantal FROM materialen_per_reservatie mpr 
     WHERE mpr.materialen_id = p_mat_id AND 
      (
      (p_datum_van >= mpr.datum_van AND p_datum_tot <= mpr.datum_tot) -- overlap: binnen 
      OR (p_datum_van <= mpr.datum_van AND p_datum_tot >= mpr.datum_van) -- overlap: voor+in 
      OR (p_datum_van <= mpr.datum_tot AND p_datum_tot >= mpr.datum_tot) -- overlap: na+in 
      OR (p_datum_van <= mpr.datum_van AND p_datum_tot >= mpr.datum_tot) -- overlap:omsluitend 
      ) 
     INTO aantal; 

     -- The total amount of materials 
     SELECT m.aantal_beschikbaar FROM materialen m 
     WHERE m.id = p_mat_id 
     INTO tot; 
     -- The test variable is holding the amount of materials that's still available 
     SELECT tot-aantal INTO test; 
     -- Checking if im not ordering more then there is available 
     IF p_nodig < test THEN 
      -- Checking if this material is already hired from this reservation id 
      SELECT mpra.id, mpra.aantal FROM materialen_per_reservatie mpra 
      WHERE (mpra.reservaties_id = p_res_id 
      AND mpra.materialen_id = p_mat_id) INTO upda, voriga; 
      -- if voriga is bigger then zero it means that there is already an reservatie for this material for this reservation so im not inserting but updating 
      IF voriga > 0 THEN 
       -- Selecting the previous amount and add it with the p_nodig amount 
       SELECT voriga+p_nodig INTO nieuwa; 
       UPDATE materialen_per_reservatie SET materialen_per_reservatie.aantal = nieuwa WHERE reservaties_id = p_res_id AND materialen_id = p_mat_id; 
      ELSE 
       -- There is no reservation for this material with this reservation id so i my insert a new row 
       INSERT INTO materialen_per_reservatie(reservaties_id, materialen_id, aantal, effectief_gebruikt, opmerking, datum_van, datum_tot) VALUES (p_res_id, p_mat_id, p_nodig, p_nodig, p_mat_opmerking, p_datum_van, p_datum_tot); 
      END IF; 
     END IF; 
END$$ 

は、私がテストした両方のINSERT/UPDATEクエリの独立した、彼らが働いています。

+0

分離レベルは何ですか?それを取引に入れようとしましたか? –

+0

これは誤字脱字して申し訳ありません。私はすでに日付のために ''を使用しています –

答えて

0

ここで、あなたの日付値の引用符はありますか?

これを試してみてください:

call aantal_besch_mat_van_tot('2007-03-13', '2007-03-14', 15, 6, 50, 'Im hiring this material'); 

注日は'2007-03-13'のようなものではなく、2007-03-13を、文字通りある数1991(すなわち2007から3 - = 1991 13)

+0

あなたはそれを釘付けにしたと思います –

+0

私は誤植でした。私はすでにあなたが上記のmysqlで言ったものを使っています –