存储过程错误1064

Error 1064 in stored procedure

我不是 MySQL 方面的专家,而且我对这个存储过程有疑问。 我正在尝试使用条件进行 SP,但我不知道这里出了什么问题,我有一个错误:

Error Code: 1064. You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'declare done int default 0; declare continue handler for sqlstate '02000' set' at line 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 ;

问题出在下面指出的部分,您试图在 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

A 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 ;

或将它们放在 BEGIN 语句之后 REPEAT 语句之前:

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 ;

我修复我的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 ;