代码之家  ›  专栏  ›  技术社区  ›  Zerg Overmind

SQL,比较varchars时出现大小写问题

  •  0
  • Zerg Overmind  · 技术社区  · 7 年前

    首先是我的代码

    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;
    

    这是一个较短的版本,我删除了Aditional When,因为它们是相同的(只是货币和汇率不同)。然而,我不理解这一点的原因,我会请求帮助理解错误。

    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 回复  |  直到 7 年前
        1
  •  2
  •   mkuligowski    7 年前

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

    建议在声明参数时使用一些前缀,因此在您的示例中 从…起 to 参数,使用 p_from p_to

    此外,删除函数参数中varchar的大小声明。 如果will看起来像:

    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;
    

    根据您的第二个问题:是的,您可以对参数和返回类型使用表类型。

        2
  •  2
  •   Nikunj    7 年前

    代码中存在的问题是,不能使用varchar(size)作为输入参数,只需使用数据类型而不指定大小。

    from是关键字,所以不能将其用作输入参数。

    下面的代码运行良好,您可以尝试一下。

    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;
    
        3
  •  2
  •   Kaushik Nayak    7 年前

    编辑 :

    其他答案已经解释了代码的错误。

    以下是如何简化 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 CASE 
               WHEN p_to = 'USD' 
                  AND p_from = 'EUR' THEN 25.49 
               ELSE 1 
    END; 
    

    然后摆脱 exchange_rate 变量