我试图在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关键字的其他函数示例,但不知道这意味着什么。
答案 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 ;
)希望这有帮助