Mysql UDF返回记录id,如果存在,则插入并返回recordid`

时间:2014-01-06 17:46:09

标签: mysql

我正在尝试编写一个Mysql函数,如果根据提供的参数存在记录,则返回contactID。如果记录不存在,我将添加记录,然后返回新记录的contactID。 但是这个函数丢了1048error,如果我写错了,你可以检查并纠正我。

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

有人可以在我出错的地方帮助我。 感谢

1 个答案:

答案 0 :(得分:0)

混淆用户变量,局部变量和参数会导致问题
@UserIdUserId不同 - 它们是不同的变量 UserId也是表格中列的名称。

  • 用户定义的变量被称为@var_name,存储在用户会话中,可用于在引用它们的不同存储例程之间传递值,有关详细信息,请参阅此链接:{ {3}}
  • 使用DECLARE关键字在存储例程中声明
  • 局部变量,其范围在存储例程中是本地的,有关详细信息,请参阅此链接:http://dev.mysql.com/doc/refman/5.7/en/user-variables.html
  • 函数/过程的参数 - 它们在过程/函数声明中声明,它们用于将参数传递给来自调用者的存储例程,也可用于返回例程中的结果到调用者(如果声明为OUT或INOUT)。它们的范围类似于局部变量。有关详细信息,请参阅此链接:http://dev.mysql.com/doc/refman/5.7/en/declare-local-variable.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,我们知道这是用户变量。