SQL,比较varchars时的情况问题

时间:2018-04-27 06:00:45

标签: sql oracle plsql

首先是我的代码

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”,我为此道歉,原始代码有不同的名称(有点太随机)

3 个答案:

答案 0 :(得分:2)

您不能将from用作参数名称,因为它是关键字。

建议在声明参数时使用一些前缀,因此在您的示例中,使用fromto而不是p_fromp_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;