首先是我的代码
CREATE OR REPLACE FUNCTION exchangeRate(from_in VARCHAR2(5), to_in VARCHAR2(5)) RETURN NUMBER IS
exchange_rate NUMBER;
BEGIN
CASE
WHEN to = 'USD' THEN
CASE
WHEN from = 'EUR' THEN exchange_rate := 25.49;
ELSE exchange_rate := 1;
END CASE;
ELSE exchange_rate := 1;
END CASE;
RETURN exchange_rate;
END;
这是较短的版本,我删除了adittional whens,因为它们是相同的(只有货币和费率不同)。但是我不明白这个的原因,我会请求帮助理解错误。
CREATE OR REPLACE FUNCTION exchangeRate(from_in table.currency%TYPE, to_in table.currency%TYPE) RETURN table.price%TYPE IS
exchange_rate table.price%TYPE;
BEGIN
CASE
WHEN to = 'USD' THEN
CASE
WHEN from = 'EUR' THEN exchange_rate := 25.49;
ELSE exchange_rate := 1;
END CASE;
ELSE exchange_rate := 1;
END CASE;
RETURN exchange_rate;
END;
由于我不确定这有什么问题,我还想问一下我是否可以使用table.row%TYPE
来声明参数和返回类型
编辑:我只在这里将其重命名为“from”和“to”,我为此道歉,原始代码有不同的名称(有点太随机)
答案 0 :(得分:2)
您不能将from
用作参数名称,因为它是关键字。
建议在声明参数时使用一些前缀,因此在您的示例中,使用from
和to
而不是p_from
和p_to
参数。
此外,删除函数参数中varchars的大小声明。 如果看起来如下,您的程序将编译:
CREATE OR REPLACE FUNCTION exchangeRate(p_from VARCHAR2, p_to VARCHAR2) RETURN NUMBER IS
exchange_rate NUMBER;
BEGIN
CASE
WHEN p_to = 'USD' THEN
CASE
WHEN p_from = 'EUR' THEN exchange_rate := 25.49;
ELSE exchange_rate := 1;
END CASE;
ELSE exchange_rate := 1;
END CASE;
RETURN exchange_rate;
END;
根据您的第二个问题:是的,您可以将表类型用于参数和返回类型。
答案 1 :(得分:2)
修改强>:
其他答案已经解释了您的代码有什么问题。
以下是您如何简化CASE
声明。
CREATE OR replace FUNCTION Exchangerate(p_from VARCHAR2,
p_to VARCHAR2)
RETURN NUMBER
IS
exchange_rate NUMBER;
BEGIN
exchange_rate := CASE p_to
WHEN 'USD' THEN CASE p_from
WHEN 'EUR' THEN 25.49
ELSE 1
END
ELSE 1
END;
RETURN exchange_rate;
END;
或者这个return语句应该是等价的
RETURN CASE
WHEN p_to = 'USD'
AND p_from = 'EUR' THEN 25.49
ELSE 1
END;
并删除exchange_rate
变量
答案 2 :(得分:1)
您的代码存在问题,即您无法使用varchar(size)作为输入参数,只需使用数据类型而不指定大小。
来自is关键字,因此您无法将其用作输入参数。
下面的代码工作正常,你可以试试。
CREATE OR REPLACE FUNCTION exchangeRate(from_in VARCHAR2, to_in VARCHAR2) RETURN NUMBER IS
exchange_rate NUMBER;
BEGIN
CASE
WHEN to_in = 'USD' THEN
CASE
WHEN from_in = 'EUR' THEN exchange_rate := 25.49;
ELSE exchange_rate := 1;
END CASE;
ELSE exchange_rate := 1;
END CASE;
RETURN exchange_rate;
END;