Обновление не работает в хранимой процедуре

У меня есть хранимая процедура для обновления столбца( LiveStatus) до ‘N’ перед вставкой новой строки данных и установкой его столбца( LiveStatus) в ‘Y’, если DeviceIDновые значения уже есть, и его LiveSTatus «Y».

Он вставляет новые значения, но livestatusиз предыдущей строки с тем же DeviceIDпо-прежнему «Y».

Хранимая процедура:

    DELIMITER $$

CREATE DEFINER=`testmysql`@`%` PROCEDURE `PDADeviceAssign`(

IN DeviceID varchar(50),
IN EmpID varchar(50),
IN PlazaID varchar(50),
IN LaneID varchar(50),
IN AssignDateTime varchar(50),
IN AssignTranID varchar(50),
IN AssignedBy varchar(50),
IN Start_at varchar(50),
IN End_at varchar(50),
IN IsNextDay varchar(50),
IN ClientID varchar(50),
IN Description varchar(50)
)
BEGIN

    declare Sno int; 

    set Sno=(SELECT MAX(Sno) FROM posassignment WHERE DeviceID=DeviceID);    
    update posassignment set LiveStatus ='N' where Sno=Sno;

Insert into posassignment(DeviceID,EmpId,PlazaID,LaneID,AssignDateTime,AssignTranID,AssignedBy,LiveStatus,Start_at,End_at,IsNextDay,ClientId,Description)
   values (DeviceID,EmpID,PlazaID,LaneID,AssignDateTime,AssignTranID,AssignedBy,'Y',Start_at,End_at,IsNextDay,ClientId,Description); 
END

1 ответ

  1. Это ваш код:

    declare Sno int; 
    
    set Sno=(SELECT MAX(Sno) FROM posassignment WHERE DeviceID=DeviceID);    
    update posassignment set LiveStatus ='N' where Sno=Sno;
    

    updateЭквивалентно:

    update posassignment set LiveStatus = 'N' where Sno is not null;
    

    То есть ни snoодна из ссылок не относится к параметру. У вас та же проблема с DeviceID:

    CREATE DEFINER=`testmysql`@`%` PROCEDURE `PDADeviceAssign`(
        IN in_DeviceID varchar(50),
        IN in_EmpID varchar(50),
        . . .
    )
    BEGIN
        declare v_Sno int; 
    
        set v_Sno = (SELECT MAX(Sno)
                     FROM posassignment
                     WHERE DeviceID = in_DeviceID
                    );  
    
        update posassignment
            set LiveStatus = 'N'
            where Sno = v_Sno;