【问题标题】:How do I use 'if' condition inside a 'if' condition?如何在“if”条件中使用“if”条件?
【发布时间】:2016-03-08 05:28:00
【问题描述】:

我正在尝试在“if”条件中使用“if”条件来创建函数。 我知道语法看起来有点像下面,但我无法在我的代码中做到这一点。

IF sales > (quota + 200) THEN
    bonus := (sales - quota)/4;
ELSE
    IF sales > quota THEN
        bonus := 50;
    ELSE
        bonus := 0;
    END IF;
END IF;

以下是我要完成的程序。请帮帮我。 它的功能是在给定的通话次数中查找电话账单金额 和计划类型

CREATE OR REPLACE  FUNCTION BILL(NUM_OF_CALLS NUMBER, PLAN_TYPE NUMBER) RETURN NUMBER IS :

    BILL_AMT NUMBER;
    MIN_1 NUMBER :=150;
    MIN_2 NUMBER :=1000;    

    BEGIN
    IF PLAN_TYPE:=150 THEN 
        IF NUM_OF_CALLS<150 THEN 
            BILL_AMT:=MIN_1;
            ELSIF NUM_OF_CALLS BETWEEN 151 AND 250 THEN
            BILL_AMT:=MIN_1+(NUM_OF_CALLS-150);
            ELSIF NUM_OF_CALLS BETWEEN 251 AND 400 THEN
            BILL_AMT:=MIN_1+(100*1)+(NUM_OF_CALLS-250)*0.5;
            ELSIF NUM_OF_CALLS>400 THEN
            BILL_AMT:=MIN_1+(100*1)+(150*0.5)+(NUM_OF_CALLS-400)*0.3;
        END IF;
        ELSE PLAN_TYPE:=500 THEN
            IF NUM_OF_CALLS<1000 THEN 
            BILL_AMT:=MIN_2;
            ELSIF NUM_OF_CALLS BETWEEN 1001 AND 1500 THEN
            BILL_AMT:=MIN_2+(NUM_OF_CALLS-1000)*0.50;
            ELSIF NUM_OF_CALLS>1500 THEN
            BILL_AMT:=MIN_2+(500*0.50)+(NUM_OF_CALLS-1500)*0.25;
        END IF;
    END IF;

    RETURN BILL_AMT;

END;

以下是错误

SQL> 显示错误 FUNCTION BILL 错误:

LINE/COL ERROR

11/14    PLS-00103: Encountered the symbol "=" when expecting one of the
         following:
         . ( * @ % & = - + < / > at in is mod remainder not rem then
         <an exponent (**)> <> or != or ~= >= <= <> and or like like2
         like4 likec between || multiset member submultiset
         The symbol "* was inserted before "=" to continue.

22/22    PLS-00103: Encountered the symbol "THEN" when expecting one of
         the following:
         * & = - + ; < / > at in is mod remainder not rem
         <an exponent (**)> <> or != or ~= >= <= <> and or like like2
         like4 likec between || multiset member submultiset

31/6     PLS-00103: Encountered the symbol "IF" when expecting one of the
         following:
         ; <an identifier> <a double-quoted delimited-identifier>
         current delete exists prior <a single-quoted SQL string>

【问题讨论】:

  • 这似乎是一种 Pascal 语言,但是 := 里面如果是错误的
  • 是Oracle PL SQL...
  • 你遇到了什么错误?
  • Ed:发布错误
  • @ClaudioDaffra,是的,PL/SQL 至少在语法层面受到 Ada 的严重影响,Ada 借鉴了 Pascal 以及其他影响。

标签: oracle function if-statement plsql oracle11g


【解决方案1】:

您的答案直接在错误输出中。

PLSQL 使用:= 进行赋值,使用= 进行比较。您正在混合这些运算符并导致这些错误。

仔细阅读错误,它们准确地描述了问题。

提示:一次添加少量逻辑,以便您了解问题的根源。我们每个人都会在某个时间点学到这一点:)

【讨论】:

    【解决方案2】:

    这样的东西应该适合你:

    CREATE OR REPLACE  
    FUNCTION BILL(NUM_OF_CALLS NUMBER, PLAN_TYPE NUMBER) 
       RETURN NUMBER 
    IS
    
        BILL_AMT NUMBER;
        MIN_1    NUMBER := 150;
        MIN_2    NUMBER := 1000;    
    
    BEGIN
        IF PLAN_TYPE = 150 
        THEN 
           IF NUM_OF_CALLS<150 
           THEN 
              BILL_AMT:= MIN_1;
           ELSIF NUM_OF_CALLS BETWEEN 151 AND 250 
           THEN
              BILL_AMT:=MIN_1+(NUM_OF_CALLS-150);
           ELSIF NUM_OF_CALLS BETWEEN 251 AND 400 
           THEN
              BILL_AMT:=MIN_1+(100*1)+(NUM_OF_CALLS-250)*0.5;
           ELSIF NUM_OF_CALLS>400 
           THEN
              BILL_AMT:=MIN_1+(100*1)+(150*0.5)+(NUM_OF_CALLS-400)*0.3;
           END IF;
        ELSIF PLAN_TYPE = 500 
        THEN
           IF NUM_OF_CALLS<1000 
           THEN 
              BILL_AMT:=MIN_2;
           ELSIF NUM_OF_CALLS BETWEEN 1001 AND 1500 THEN
              BILL_AMT:=MIN_2+(NUM_OF_CALLS-1000)*0.50;
           ELSIF NUM_OF_CALLS>1500 THEN
              BILL_AMT:=MIN_2+(500*0.50)+(NUM_OF_CALLS-1500)*0.25;
           END IF;
        END IF;
    
        RETURN BILL_AMT;
    
    END BILL;
    

    希望对你有帮助...

    【讨论】:

      【解决方案3】:

      你不能

         ELSE PLAN_TYPE:=500 THEN
      

      但你可以

         ELSIF PLAN_TYPE =500 THEN
      

      如果我弄清楚了你的逻辑流程

      CREATE OR REPLACE  FUNCTION BILL(NUM_OF_CALLS NUMBER, PLAN_TYPE NUMBER) RETURN NUMBER IS 
      
          BILL_AMT NUMBER;
          MIN_1    NUMBER :=150;
          MIN_2    NUMBER :=1000;    
      
       BEGIN
          IF PLAN_TYPE = 150 
          THEN 
              IF NUM_OF_CALLS<150 THEN 
                  BILL_AMT  :=MIN_1;
              ELSIF NUM_OF_CALLS BETWEEN 151 AND 250 THEN
                  BILL_AMT:=MIN_1+(NUM_OF_CALLS-150);
              ELSIF NUM_OF_CALLS BETWEEN 251 AND 400 THEN
                  BILL_AMT:=MIN_1+(100*1)+(NUM_OF_CALLS-250)*0.5;
              ELSIF NUM_OF_CALLS>400 THEN
                  BILL_AMT:=MIN_1+(100*1)+(150*0.5)+(NUM_OF_CALLS-400)*0.3;
              END IF;
          ELSIF PLAN_TYPE = 500 THEN
              IF NUM_OF_CALLS<1000 THEN 
                  BILL_AMT:=MIN_2;
              ELSIF NUM_OF_CALLS BETWEEN 1001 AND 1500 THEN
                  BILL_AMT:=MIN_2+(NUM_OF_CALLS-1000)*0.50;
              ELSIF NUM_OF_CALLS>1500 THEN
                  BILL_AMT:=MIN_2+(500*0.50)+(NUM_OF_CALLS-1500)*0.25;
              END IF;
          END IF;
      
          RETURN BILL_AMT;
      
      END;
      

      【讨论】:

      • 我很确定END IF; 关闭了IF NUM_OF_CALLS&lt;150 THEN,下面的ELSEIF PLAN_TYPE=150 THEN 相关(尽管它应该是ELSIF 而不是ELSE)跨度>
      • 是的,格式让我失望。但是你仍然不能 ELSE ...我已经相应地更新了我的答案
      猜你喜欢
      • 2020-11-02
      • 1970-01-01
      • 2019-04-25
      • 1970-01-01
      • 2020-10-02
      • 2018-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多