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

Popular posts from this blog

c# - How Configure Devart dotConnect for SQLite Code First? -

java - Copying object fields -

c++ - Clear the memory after returning a vector in a function -