2015-12-03 2 views
-2

Я пытаюсь использовать условие «если» внутри условия «если», чтобы создать функцию. Я знаю, что синтаксис выглядит примерно так, как показано ниже, но я не могу сделать это в своем коде.Как использовать условие «если» в состоянии «если»?

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

Ниже представлена ​​программа, которую я пытаюсь завершить. Пожалуйста, помогите мне с этим. Ее функция, чтобы найти телефонный счет сумму WRT заданное число вызовов и план Тип

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> показать ошибки ошибки для функции СЧЕТ:

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> 
+0

это кажется Pascal языка, но: = внутри, если есть неправды –

+0

Это Oracle PL SQL ... –

+0

Каких ошибки вы получаете? – KevinDTimm

ответ

0

Ваш ответ прямо на выходе ошибки.

PLSQL использует := для назначения и = для сравнения. Вы смешиваете эти операторы и вызываете эти ошибки.

Внимательно прочитайте ошибки, они точно описывают проблему.

Подсказка: добавьте небольшое количество логики за раз, чтобы вы знали, где возникают ваши проблемы. Каждый из нас узнает, это в какой-то момент времени :)

0

Вы не можете

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; 
+0

Я уверен, что 'END IF;' закрывает 'IF NUM_OF_CALLS <150 THEN', а следующая' ELSE' связана с 'IF PLAN_TYPE = 150 THEN' (хотя это должно быть' ELSIF' не 'ELSE') – KevinDTimm

+0

Да, форматирование меня бросило. Но вы все еще не можете ELSE ... Я обновил свой ответ соответственно –

+0

:) Я отвечал вам, как вы исправляли - все хорошо сейчас – KevinDTimm

0

Что-то вроде этого должно работать на вас:

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; 

Надеется, что это помогает ...