2016-04-05 17 views
0

私はライブラリシート予約システムを持っています。特定のルールに従って学生の時間数を減らすストアドプロシージャを作成しています。毎日午前7時にそれを繰り返す必要があります。学生が留保することができる時間数は、彼または彼女が持っている評判に依存します。評判に加えて、1日前に予約した時間を考慮に入れ、学生がこの日に予約できる時間数から減少させる必要があります。例:評判が5の生徒は1日8時間を予約できますが、この学生が1日2時間を予約した場合、残っている時間数は8-2 = 6になります。ストアドプロシージャは、生徒が予約をしていないときに動作するはずですが、生徒がその日に予約をしている場合、発生する予定のない時間数を0に設定します。私は問題を指摘できず、使用するデバッガもありません。mysqlの予約時間を短縮するためのストアドプロシージャ

これは私のコードです:

CREATE DEFINER=`root`@`localhost` PROCEDURE `UpdateHours`() 
BEGIN 

DECLARE v_finished1 INTEGER DEFAULT 0; 

DECLARE v_email1 varchar(255) DEFAULT ""; 
DECLARE v_reputation int(11) default 0; 

DECLARE v_email2 varchar(255) DEFAULT ""; 
DECLARE v_stime varchar(255) DEFAULT ""; 
DECLARE v_etime varchar(255) DEFAULT ""; 
DECLARE v_priority tinyint(1) DEFAULT 0; 
DECLARE v_hours double DEFAULT 0; 
DECLARE d_stime datetime; 
DECLARE d_etime datetime; 
DECLARE checkDate bool DEFAULT false; 

DECLARE student cursor for select Email, reputation from students; 
DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_finished1 = 1; 

OPEN student; 

get_email1: LOOP 

set v_hours=0; 
FETCH student INTO v_email1, v_reputation; 
IF v_finished1 = 1 THEN 
LEAVE get_email1; 
END IF; 
block2: 
begin 

DECLARE v_finished2 INTEGER DEFAULT 0; 
DECLARE reservation cursor for select student_email, stime, etime, priority from reservations where str_to_date(stime,'%H:%i:%s %d/%m/%Y') between CURRENT_TIMESTAMP and (CURRENT_TIMESTAMP + interval 1 DAY); 
DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_finished2 = 1; 

OPEN reservation; 
get_reservation: LOOP 
FETCH reservation INTO v_email2, v_stime, v_etime, v_priority; 
IF v_finished2 = 1 THEN 
LEAVE get_reservation; 
END IF; 

set d_stime = date_format(str_to_date(v_stime,'%H:%i:%s %d/%m/%Y'),'%H:%i:%s %d/%m/%Y'); 
set d_etime = date_format(str_to_date(v_etime,'%H:%i:%s %d/%m/%Y'),'%H:%i:%s %d/%m/%Y'); 
if (v_email2 = v_email1 and v_priority = 0) then 
set v_hours = v_hours + TIMESTAMPDIFF(HOUR, d_stime, d_etime); 
end if; 
END LOOP get_reservation; 
CLOSE reservation; 
end block2; 
If (v_reputation= 5) then 
    update students set ReservationHrsLeft = (8-v_hours) where Email = v_email1; 

elseif (v_reputation= 4) then 
if 6>=v_hours then 
    update students set ReservationHrsLeft = (6-v_hours) where Email = v_email1; 
else 
    update students set ReservationHrsLeft = 0 where Email = v_email1; 
    end if; 
elseif (v_reputation= 3) then 
if 4>=v_hours then 
    update students set ReservationHrsLeft = (4-v_hours) where Email = v_email1; 
else 
    update students set ReservationHrsLeft = 0 where Email = v_email1; 
    end if; 
elseif (v_reputation= 2) then 
if 2>=v_hours then 
    update students set ReservationHrsLeft = (2-v_hours) where Email = v_email1; 
else 
    update students set ReservationHrsLeft = 0 where Email = v_email1; 
    end if; 
elseif v_reputation= 1 then 
update students set ReservationHrsLeft = 1 where Email = v_email1; 
END if; 
END LOOP get_email1; 

CLOSE student; 
END 
+0

ツールが不足しているため、ストアドプロシージャはデバッグやテストが非常に困難です。しかし、そのようなMySQLデバッガは実際に存在します。例えば、dbForgeです。また、プロシージャを複数の小さなプロシージャに分割することをお勧めします。 'GREATEST'と' LEAST'関数を使って、2つの値の最大値と最小値を求めます。 –

+0

あなたが私に言ったようにしてくれました。問題はd_stimeとd_etimeにありました。私はdate_format関数を使うべきではありません。 – sosnas

答えて

0

問題がd_stimeとd_etimeにありました。私はdate_format関数を使用すべきではありません。

関連する問題