Kütüphane koltuk rezervasyon sistemim var ve belirli kurallara göre öğrencilerin saat sayısını azaltmak için saklı bir prosedür yazıyorum ve her gün saat 7'de tekrarlamalı. Bir öğrencinin alabileceği saat sayısı, sahip olduğu itibara bağlıdır. ancak ününe ek olarak, gün için önceden ayrılmış olan saatlerin hesaba katılması ve öğrencinin bu gün rezerve edebileceği saat sayısından düşmesi gerekir. Örnek: ünlü bir öğrenci = 5 günde 8 saat ayırabilir, ancak bu öğrenci 2 saat için ayrılmışsa, kalan saat sayısı 8-2 = 6 olacaktır. Saklı yordam, öğrencinin herhangi bir rezervasyonu olmadığında çalışacağı şekilde çalışır, ancak bir öğrencinin o gün için bir rezervasyonu olduğunda, gerçekleşmesi gerekmeyen saat sayısını saat olarak ayarlar. Sorunu işaret edemiyorum ve kullanmak için hata ayıklayıcı yok.Mysql'de rezervasyon süresini azaltmak için saklı yordam
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
Saklı yordamlar, araç eksikliğinden dolayı hata ayıklamak ve sınamak için oldukça zordur. Ama böyle MySQL hata ayıklayıcıları aslında var: dbForge, örneğin. Ayrıca, prosedürü birkaç küçük kısma ayırmanızı tavsiye ederim. İki değerin maksimumu ve minimini bulmak için 'GREATEST' ve' LEAST' fonksiyonlarını kullanın. –
Bana söylediğin gibi yaptım ve çok yardımcı oldu, teşekkürler! Sorun d_stime ve d_etime idi, date_format işlevini kullanmamalıydım. – sosnas