es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Actualizar un valor y establecer una variable local en una declaración de caso

Estoy intentando actualizar un valor en la base de datos pero también quiero establecer una variable local VAR_IS_RATE_LIMITED. La razón de esto es porque no quiero usar una instrucción select y quiero ejecutarla dentro de una. ¿Cómo puedo establecer la variable VAR_IS_RATE_LIMITED? Miré otras preguntas pero sus declaraciones CASE no estaban integradas en una instrucción update.

DELIMITER //
CREATE FUNCTION F_RATE_LIMITED(P_IP varchar(45),
                               P_MAX_RATE int unsigned
                            )
RETURNS INT UNSIGNED
BEGIN

    DECLARE VAR_IS_RATE_LIMITED INT UNSIGNED DEFAULT 0;

    INSERT INTO rate_limit (ip, rate)
        VALUES (P_IP, 1)
    ON DUPLICATE KEY UPDATE 
        rate = 
            CASE
                WHEN (rate + 1) > P_MAX_RATE THEN
                    SET VAR_IS_RATE_LIMITED = 1;
                    rate
                ELSE
                    rate + 1
            END;

    RETURN VAR_IS_RATE_LIMITED;
END; //
DELIMITER ;
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para establecer la variable local VAR_IS_RATE_LIMITED dentro de la sentencia UPDATE, puedes utilizar la palabra clave SET. Aquí tienes un ejemplo de cómo podrías modificar el código SQL dado para lograr esto:

    DELIMITER //
    CREATE FUNCTION F_RATE_LIMITED(P_IP varchar(45),
                                   P_MAX_RATE int unsigned
                                )
    RETURNS INT UNSIGNED
    BEGIN
    
        DECLARE VAR_IS_RATE_LIMITED INT UNSIGNED DEFAULT 0;
    
        INSERT INTO rate_limit (ip, rate)
            VALUES (P_IP, 1)
        ON DUPLICATE KEY UPDATE 
            rate = 
                CASE
                    WHEN (rate + 1) > P_MAX_RATE THEN
                        SET VAR_IS_RATE_LIMITED = 1, rate;
                        -- Establece la variable en 1 y actualiza el valor actual de la tasa
                    ELSE
                        rate + 1
                END;
    
        RETURN VAR_IS_RATE_LIMITED;
    END; //
    DELIMITER ;
    

    En este código actualizado, hemos añadido la sentencia SET VAR_IS_RATE_LIMITED = 1, rate dentro de la condición WHEN (rate + 1) > P_MAX_RATE de la sentencia CASE. Esto establece la variable VAR_IS_RATE_LIMITED en 1 y actualiza el campo rate a su valor actual (es decir, sin cambios) cuando se haya superado el límite de tasa. Al incluir tanto la asignación de la variable como la actualización del campo rate en una sola sentencia, podemos lograr nuestro objetivo de no tener que usar una sentencia SELECT separada.

Comments are closed.