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
ツールが不足しているため、ストアドプロシージャはデバッグやテストが非常に困難です。しかし、そのようなMySQLデバッガは実際に存在します。例えば、dbForgeです。また、プロシージャを複数の小さなプロシージャに分割することをお勧めします。 'GREATEST'と' LEAST'関数を使って、2つの値の最大値と最小値を求めます。 –
あなたが私に言ったようにしてくれました。問題はd_stimeとd_etimeにありました。私はdate_format関数を使うべきではありません。 – sosnas