SQL存储过程:If语句的行为不符合预期



正在尝试为MySQL创建存储进程。它包含一个基本的if语句。当前脚本如下:

DROP PROCEDURE IF EXISTS sp_pay_raise;
DELIMITER @@
CREATE PROCEDURE sp_pay_raise
(IN inEmpId INT,
IN inPercentageRaise DOUBLE(4,2),
OUT outErrorCode INT)
BEGIN
IF (@inPercentageRaise <= 0.0) THEN
SELECT -3 INTO errorCode
ELSE
SELECT -2 INTO errorCode
END IF;
END @@
DELIMITER ;

以上内容并没有如预期的那样起作用。如果我提供小于零的inPercentageRaise,例如

CALL sp_pay_raise(0,-1.0, @out)
SELECT @out;

数据库显示@out=-2。if语句是否写错了?

@用于会话变量。在存储过程中,输入参数不需要使用@。否则,MySQL将查找类似名称的预定义会话变量。既然它找不到它;它假定其值为Null

还有其他错误。你有一个打字错误;不是使用outErrorCode参数,而是使用不同的未定义变量errorCode

DROP PROCEDURE IF EXISTS sp_pay_raise;
DELIMITER @@
CREATE PROCEDURE sp_pay_raise
(IN inEmpId INT,
IN inPercentageRaise DOUBLE(4,2),
OUT outErrorCode INT)
BEGIN
IF (inPercentageRaise <= 0.0) THEN  -- Remove @ from here.
SELECT -3 INTO outErrorCode  -- It should be outErrorCode instead of errorCode
ELSE
SELECT -2 INTO outErrorCode  -- It should be outErrorCode instead of errorCode
END IF;
END @@
DELIMITER ;

最新更新