Missing END - Mysql Stored Procedure -
i used writing in tsql , mysql taking adjusting think getting of it. have 1 stored procedure not budge, have read , re-read 100 times, read can find on error , still no luck.
on line 11 , end of statement:
create temporary table returnavalrooms (roomid int);
i error "missing end" though @ beginning of query. have checked , double checked declared , set appropriate ; can't figure out why getting error.
below full copy of stored procedure.
create procedure `get_availrooms` (in startdate datetime, in enddate datetime, in roomtype int) begin declare pstartdate datetime; declare penddate datetime; declare proomtype int; set pstartdate = startdate; set penddate = enddate; set proomtype = roomtype; create temporary table avaliablenowrooms (select idrooms rooms roomnextavail < pstartdate , roomtypeid = proomtype); create temporary table returnavalrooms (roomid int); declare availrooms cursor select * avaliablenowrooms; declare continue handler not found set done = true; declare roomid int; open availrooms; read_loop: loop fetch availrooms roomid; if done leave read_loop; end if; declare bookings cursor select bookingstartdate, bookingenddate, bookingroomid booking bookingroomid = roomid , bookingenddate < pstartdate; declare pbookingstartdate datetime; declare pbookingenddate datetime; declare pbookingroomid, open bookings booking_read: loop fetch bookings pbookingstartdate, pbookingenddate, pbookingroomid; if done leave booking_read; end if; if pbookingstartdate between pstartdate , penddate leave booking_read; else if pbookingenddate between pstartdate , penddate leave booking_read; else insert returnavalrooms (id) values (pbookingroomid); end loop; close bookings; end end loop; close availrooms; end select * returnavalrooms end
mysql particular order of declare statements. within block, have appear first. , (i believe) handlers have last declarations.
i'm confused procedure intending return. seems you'd want return rooms of specified type there isn't booking overlaps specified period.
but looking @ logic in procedure, seems if there no rows in booking given room, room won't returned. , seems odd. , has me puzzled supposed return. specification obfuscated lot of unnecessary clutter.
the whole rigmarole accomplished single sql statement simpler, clearer, , more efficient boot.
delimiter $$ create procedure `get_availrooms` (in pstartdate datetime, in penddate datetime, in proomtype int) begin -- rooms of specified type "available" -- specified period. room considered not available if -- roomnextavail col has date value later beginning -- of specified period, or there 1 or more bookings -- overlap period. if specified startdate later -- specified enddate, no rooms available. -- -- query uses "anti-join" pattern return rows -- in rooms don't have overlapping booking select r.idrooms rooms r left join booking b on b.bookingroomid = r.idrooms , b.bookingenddate >= pstartdate , b.bookingstartdate <= penddate b.idrooms null , r.roomtypeid = proomtype , r.roomnextavail < pstartdate , pstartdate < penddate order r.idrooms; end$$ delimiter ;
that's first cut; it's not tested. might want change <=
, >=
<
, >
, depending on whether or not consider booking ends @ 10am overlaps period starting right @ 10am.
Comments
Post a Comment