我正在尝试编写一个Mysql函数,如果根据提供的参数存在记录,则返回contactID,如果记录不存在,我将添加记录,然后返回新记录的contactID。 但该函数抛出 1048 错误,您能否检查并纠正我是否写错了。
DELIMITER $$
CREATE DEFINER=`root`@`%` FUNCTION `GetContactID`(accountNumber CHAR(45),UserID INT(11)) RETURNS char(1) CHARSET latin1
DETERMINISTIC
BEGIN
DECLARE ContactID INT DEFAULT 0;
SELECT ContactID INTO @ContactID FROM Contact WHERE AccountNumber = @accountNumber AND UserID = @UserID AND Status =1;
IF ContactID = 0 or ContactID is null THEN
INSERT INTO Contact(AccountNumber,UserID) VALUES (@accountNumber,@UserID);
SELECT ContactID INTO @ContactID FROM Contact WHERE AccountNumber = @accountNumber AND UserID = @UserID;
END IF;
RETURN ContactID;
END
有人可以帮我解决我出错的地方吗? 谢谢
最佳答案
该问题是由用户变量、局部变量和参数混合造成的。
@UserId
与 UserId
不同 - 它们是不同的变量。
UserId
也是表中列的名称。
- 用户定义变量写为
@var_name
,存储在用户 session 中,可用于在引用它们的不同存储例程之间传递值,请参阅此链接详情:http://dev.mysql.com/doc/refman/5.7/en/user-variables.html - 局部变量使用
DECLARE
关键字在存储例程中声明,它们的作用域在存储例程内是本地的,有关详细信息,请参阅此链接:http://dev.mysql.com/doc/refman/5.7/en/declare-local-variable.html - 函数/过程的参数 - 它们在过程/函数声明中声明,用于将参数从调用者传递到存储的例程,也可用于从例程返回结果给调用者(如果声明为 OUT 或 INOUT)。它们的作用域类似于局部变量。详情请见此链接:http://dev.mysql.com/doc/refman/5.7/en/create-procedure.html
试试这个代码:
DELIMITER $$
CREATE DEFINER=`root`@`%` FUNCTION `GetContactID`(p_accountNumber CHAR(45),p_UserID INT(11)) RETURNS char(1) CHARSET latin1
DETERMINISTIC
BEGIN
DECLARE v_ContactID INT DEFAULT 0;
SELECT ContactID INTO v_ContactID
FROM Contact
WHERE AccountNumber = p_accountNumber AND UserID = p_UserID AND Status =1;
IF v_ContactID = 0 or v_ContactID is null THEN
INSERT INTO Contact(AccountNumber,UserID)
VALUES (p_accountNumber,p_UserID);
SELECT ContactID INTO v_ContactID FROM Contact
WHERE AccountNumber = p_accountNumber AND UserID = p_UserID;
END IF;
RETURN v_ContactID;
END;
请注意:
- 函数参数以前缀
p_
声明 - 局部变量以前缀
v_
声明 - 该函数不使用任何用户变量(以 @ 为前缀)
这些前缀有助于避免歧义 - 我们知道 p_UserID
是一个参数,v_UserId
是一个局部变量,UserID
是一个列表中的名称(如果我们使用@UserId
,我们就知道这是用户变量)。
关于Mysql UDF 返回记录 id(如果存在),否则插入并返回 recordid`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20956001/