codice:
DELIMITER $$
DROP PROCEDURE IF EXISTS `hotel_progetto`.`test10` $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `test10`(arrivo DATE, partenza DATE)
BEGIN
DECLARE varData DATE;
DECLARE outData DATE DEFAULT DATE_ADD(varData,INTERVAL 1 day);
DECLARE q INT;
DECLARE r INT;
DECLARE s INT;
DECLARE ind DAte;
DECLARE outd DAte;
DECLARE conta INT DEFAULT 0;
DECLARE x INT;
DECLARE cur1 CURSOR FOR SELECT ID FROM hotel ;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET conta = 1;
CREATE TEMPORARY TABLE IF NOT EXISTS temptable1 (a INT,ID3 INT,test DAte,test1 Date,id2 INT,id4 INT,data1 DAte,data2 Date) ENGINE=MEMORY;
SET varData = arrivo;
SET outData = DATE_ADD(arrivo,INTERVAL 1 day);
OPEN cur1;
FETCH cur1 INTO x;
ciclo1: WHILE conta != 1 DO
WHILE varData < partenza DO
SELECT quantita,id,id_htl,dal,al INTO q,r,s,ind,outd FROM allottment WHERE dal < varData and outData < al AND ID_HTL = x limit 1;
SET varData = DATE_ADD(varData,INTERVAL 1 day);
SET outData = DATE_ADD(varData,INTERVAL 1 day);
INSERT INTO temptable1 (a,ID3,ID2,test,test1,data1,data2) VALUES (q,r,s,ind,outd,vardata,outdata);
END WHILE;
FETCH cur1 INTO x;
END WHILE;
select * from temptable1 ;
DROP TEMPORARY TABLE IF EXISTS temptable1;
END $$
DELIMITER ;
Il problema è il seguente:
con il ciclo 1 ottengo un ciclo composto da due id 25 e 26
dentro allottment ho questo:
id_htl dal al quantita
25 2007-01-07 00:00:00 2007-01-20 00:00:00 30
25 2007-01-20 00:00:00 2007-01-31 00:00:00 15
25 2007-02-01 00:00:00 2007-02-15 00:00:00 10
25 2007-02-15 00:00:00 2007-02-25 00:00:00 2
26 2007-02-09 00:00:00 2007-02-26 00:00:00 2
26 2007-02-05 00:00:00 2007-02-09 00:00:00 5
QUindi per come la SP è strutturata dovrei avere 4 righe come risultato con queste date:
CALL test10('2007-01-25','2007-01-27')
invece me ne trovo solo 2 riferite a ID 25
se invece cambio ordine del cursore cur1 in questo modo:
DECLARE cur1 CURSOR FOR SELECT ID FROM hotel order by id desc;
Ottengo le 2 righe dell ID 26 anche se vuote...
quindi... sembra che la SP si blocchi sul primo ciclo...
come posso ovviare ?