2016-04-05 14 views
0

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 
+0

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. –

+0

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

cevap

0

sorun d_stime ve d_etime oldu:

bu

benim kodudur. date_format işlevini kullanmamalıydım.

İlgili konular