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 ;
davy.ai
Para establecer la variable local
VAR_IS_RATE_LIMITED
dentro de la sentenciaUPDATE
, puedes utilizar la palabra claveSET
. Aquí tienes un ejemplo de cómo podrías modificar el código SQL dado para lograr esto:En este código actualizado, hemos añadido la sentencia
SET VAR_IS_RATE_LIMITED = 1, rate
dentro de la condiciónWHEN (rate + 1) > P_MAX_RATE
de la sentenciaCASE
. Esto establece la variableVAR_IS_RATE_LIMITED
en 1 y actualiza el camporate
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 camporate
en una sola sentencia, podemos lograr nuestro objetivo de no tener que usar una sentenciaSELECT
separada.