MySQL中的自定义函数

时间:2014-01-09 16:29:32

标签: mysql

我试图在MySQL中创建一个简单的自定义函数,它接受2个值(id int,currencyValue double),根据id查找另一个表中的值并返回currencyValue * rate。

这是我的伪代码,不会让我接近这个。 Google上还有一个令人惊讶的缺乏例子。

DROP FUNCTION IF EXISTS ConvertCurrency
DROP FUNCTION IF EXISTS F_ConvertCurrency //
CREATE FUNCTION F_ConvertCurrency(PID INT, C_VALUE DOUBLE) 
RETURNS DOUBLE
BEGIN

  DECLARE Currency_Rate DOUBLE;

  SET Currency_Rate = SELECT `Rate` FROM `Currencies` WHERE `ID` = PID;
  RETURN Currency_Rate*C_VALUE;
END;//

我收到'你的代码附近有错误......'这对我毫无帮助。 我已经看到了使用DELMITER关键字的其他函数示例,但不知道这意味着什么。

2 个答案:

答案 0 :(得分:2)

您应该将DELIMITER暂时设置为分号以外的其他内容(我使用$$),以便在存储的函数定义的正文中使用分号。

您可以使用SELECT ... INTO ...来设置本地Currency_Rate变量。我建议在变量名前加上v_前缀,以表示它是一个局部变量,而不是表列。

以下是使用您的代码的示例:

DELIMITER $$

DROP FUNCTION IF EXISTS ConvertCurrency $$
DROP FUNCTION IF EXISTS F_ConvertCurrency $$
CREATE FUNCTION F_ConvertCurrency(PID INT, C_VALUE DOUBLE) 
RETURNS DOUBLE
BEGIN

  DECLARE v_Currency_Rate DOUBLE;

  SELECT `Rate` 
  INTO v_Currency_Rate
  FROM `Currencies` 
  WHERE `ID` = PID;

  RETURN v_Currency_Rate*C_VALUE;
END $$

DELIMITER ;

答案 1 :(得分:0)

首先,当你创建一个函数时,你使用了很多次标准指令终止符;,因此你必须告诉MySQL在你完成之前忽略它。

所以,你需要编写这样的程序:

delimiter $$
drop function if exists F_ConvertCurrency $$
create function F_ConvertCurrency(PID INT, C_VALUE DOUBLE) returns DOUBLE
BEGIN
    declare Currency_Rate DOUBLE;
    set Currency_Rate = (SELECT `Rate` from `Currencies` WHERE `ID`=PID);
    return Currency_Rate * C_VALUE;
END $$
delimiter ;

要记住的事情:

  • 如果要为select查询分配变量,请将查询括在括号中。一种替代方法是使用select column into variable from yourTable where...
  • 在过程(或函数)声明结束时,不要使用;,而是使用您之前定义的自定义分隔符。
  • 始终记得恢复默认分隔符(使用:delimiter ;

希望这有帮助