2015-06-19 71 views
-1

我不是MySQL的專家,我在這個存儲過程中遇到問題。 我試圖做的條件的SP,但我不知道什麼是錯在這裏,我有一個錯誤:存儲過程中的錯誤1064

錯誤代碼:1064您的SQL語法錯誤;檢查 手冊,對應於您的MySQL服務器版本的右邊 語法使用附近'declare done int default 0;申報繼續 處理程序SQLSTATE「02000」在列16

delimiter $$ 
create procedure getListPrsn(IN idEquipo INT, IN tipo char, IN Puesto INT) 
begin 
declare varJefe int; 
declare eqpSupJefe int; 
declare jefeONo cursor for select tblpuesto.PtoLiderEqp from tblequipo 
    inner join tblpuesto on (tblequipo.EqpID=tblpuesto.PtoEqp) 
    inner join tblplaza on (tblpuesto.PtoID=tblplaza.PzaPto) 
    inner join tblpersona on (tblplaza.PzaPrsn=tblpersona.PrsnID) 
    where tblequipo.EqpID=idEquipo and tblpuesto.PtoID=Puesto; 
declare equipoSuperiorDeMiJefe cursor for select tblequipo.EqpEqpSup 
    from tblequipo 
    inner join tblpuesto on(tblequipo.EqpID=tblpuesto.PtoEqp) 
    where tblpuesto.PtoID=Puesto; 
if tipo="jefe" 
    then 
     declare done int default 0; 
     declare continue handler for sqlstate '02000' set done=1; 
     open jefeONo; 
      begin 
       repeat 
        fetch jefeONo into varJefe; 
       until done end repeat; 
      end; 
     close jefeONo; 
     if varJefe=1 
      then 
       declare done int default 0; 
       declare continue handler for sqlstate '02000' set done=1; 
       open equipoSuperiorDeMiJefe; 
        begin 
         repeat 
          fetch equipoSuperiorDeMiJefe into eqpSupJefe; 
         until done end repeat; 
        end; 
       close equipoSuperiorDeMiJefe; 
       call getLider(eqpSupJefe); 
     else 
      if varJefe=0 
       then 
        call getLider(idEquipo); 
      end if; 
     end if; 
end if; 
end $$ 
delimiter ; 

回答

0

我解決我的SP 我們要檢查的聲明順序 1.-變量 2:條件 3.-光標 4.-處理

delimiter $$ 
create procedure getListPrsn(IN idEquipo INT, IN tipo CHAR, IN Puesto INT) 
begin 
declare varJefe int; 
declare eqpSupJefe int; 
declare done int default 0; 
case tipo 
    when "jefe" then 
     begin 
      declare jefeONo cursor for select tblpuesto.PtoLiderEqp from tblequipo 
       inner join tblpuesto on (tblequipo.EqpID=tblpuesto.PtoEqp) 
       inner join tblplaza on (tblpuesto.PtoID=tblplaza.PzaPto) 
       inner join tblpersona on (tblplaza.PzaPrsn=tblpersona.PrsnID) 
       where tblequipo.EqpID=idEquipo and tblpuesto.PtoID=Puesto; 
      declare continue handler for sqlstate '02000' set done=1; 
      open jefeONo; 
       repeat 
        fetch jefeONo into varJefe; 
       until done end repeat; 
      close jefeONo; 
      set done=0; 
      if varJefe=1 
       then 
        begin 
         declare equipoSuperiorDeMiJefe cursor for select tblequipo.EqpEqpSup 
          from tblequipo 
          inner join tblpuesto on(tblequipo.EqpID=tblpuesto.PtoEqp) 
          where tblpuesto.PtoID=Puesto; 
         declare continue handler for sqlstate '02000' set done=1; 
         open equipoSuperiorDeMiJefe; 
          repeat 
           fetch equipoSuperiorDeMiJefe into eqpSupJefe; 
          until done end repeat; 
         close equipoSuperiorDeMiJefe; 
         call getLider(eqpSupJefe); 
        end;#begin del if varJefe=1 
      else 
       if varJefe=0 
        then 
         call getLider(idEquipo); 
       end if; 
      end if; 
     end;#begin del case JEFE 
end case; 
end $$ 
delimiter ; 
0

問題是在部分如下指出的,在那裏你試圖聲明內IF .. ELSE塊的局部變量設置」。您可以設置變量中if .. else塊,但你應該在一開始宣佈他們

if varJefe=1 
     then 
      declare done int default 0; <-- Here 

你應該在一開始聲明變量像

create procedure getListPrsn(IN idEquipo INT, IN tipo char, IN Puesto INT) 
begin 
declare varJefe int; 
declare eqpSupJefe int; 
declare done int default 0; <-- declare it here 
0

一個DECLARE必須在BEGIN ... END的開始塊。你可以將它們移動到過程的開始(變量聲明必須是光標之前,該處理程序聲明必須是在他們之後):

delimiter $$ 
create procedure getListPrsn(IN idEquipo INT, IN tipo char, IN Puesto INT) 
begin 
declare varJefe int; 
declare eqpSupJefe int; 
declare done int default 0; 
declare jefeONo cursor for select tblpuesto.PtoLiderEqp from tblequipo 
    inner join tblpuesto on (tblequipo.EqpID=tblpuesto.PtoEqp) 
    inner join tblplaza on (tblpuesto.PtoID=tblplaza.PzaPto) 
    inner join tblpersona on (tblplaza.PzaPrsn=tblpersona.PrsnID) 
    where tblequipo.EqpID=idEquipo and tblpuesto.PtoID=Puesto; 
declare equipoSuperiorDeMiJefe cursor for select tblequipo.EqpEqpSup 
    from tblequipo 
    inner join tblpuesto on(tblequipo.EqpID=tblpuesto.PtoEqp) 
    where tblpuesto.PtoID=Puesto; 
declare continue handler for sqlstate '02000' set done=1; 

if tipo="jefe" 
    then 
     open jefeONo; 
      begin 
       repeat 
        fetch jefeONo into varJefe; 
       until done end repeat; 
      end; 
     close jefeONo; 
     if varJefe=1 
      then 
       open equipoSuperiorDeMiJefe; 
        begin 
         set done = 0; 
         repeat 
          fetch equipoSuperiorDeMiJefe into eqpSupJefe; 
         until done end repeat; 
        end; 
       close equipoSuperiorDeMiJefe; 
       call getLider(eqpSupJefe); 
     else 
      if varJefe=0 
       then 
        call getLider(idEquipo); 
      end if; 
     end if; 
end if; 
end $$ 
delimiter ; 

或把他們的REPEAT語句之前的BEGIN報表後:

delimiter $$ 
create procedure getListPrsn(IN idEquipo INT, IN tipo char, IN Puesto INT) 
begin 
declare varJefe int; 
declare eqpSupJefe int; 
declare jefeONo cursor for select tblpuesto.PtoLiderEqp from tblequipo 
    inner join tblpuesto on (tblequipo.EqpID=tblpuesto.PtoEqp) 
    inner join tblplaza on (tblpuesto.PtoID=tblplaza.PzaPto) 
    inner join tblpersona on (tblplaza.PzaPrsn=tblpersona.PrsnID) 
    where tblequipo.EqpID=idEquipo and tblpuesto.PtoID=Puesto; 
declare equipoSuperiorDeMiJefe cursor for select tblequipo.EqpEqpSup 
    from tblequipo 
    inner join tblpuesto on(tblequipo.EqpID=tblpuesto.PtoEqp) 
    where tblpuesto.PtoID=Puesto; 
if tipo="jefe" 
    then 
     open jefeONo; 
      begin 
       declare done int default 0; 
       declare continue handler for sqlstate '02000' set done=1; 
       repeat 
        fetch jefeONo into varJefe; 
       until done end repeat; 
      end; 
     close jefeONo; 
     if varJefe=1 
      then 
       open equipoSuperiorDeMiJefe; 
        begin 
         declare done int default 0; 
         declare continue handler for sqlstate '02000' set done=1; 
         repeat 
          fetch equipoSuperiorDeMiJefe into eqpSupJefe; 
         until done end repeat; 
        end; 
       close equipoSuperiorDeMiJefe; 
       call getLider(eqpSupJefe); 
     else 
      if varJefe=0 
       then 
        call getLider(idEquipo); 
      end if; 
     end if; 
end if; 
end $$ 
delimiter ;