存储过程中的错误1064

时间:2015-06-19 20:51:44

标签: mysql sql stored-procedures

我不是MySQL的专家,而且我对此存储过程存在问题。 我试图用条件做SP,但我不知道这里有什么问题,我有一个错误:

  

错误代码:1064。您的SQL语法有错误;检查   手册,对应右边的MySQL服务器版本   语法使用near' 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 ;

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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 ;

或将它们放在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 ;

答案 2 :(得分: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 ;