Функция в PL SQL (Oracle) Ошибка

CREATE OR REPLACE FUNCTION ComputeFreight(subtotal NUMBER)
RETURN NUMBER
IS
freightCharge NUMBER;
BEGIN
    IF subtotal <= 15000 THEN
    freightCharge := (subtotal * .10);
    ELSIF subtotal > 15000 THEN 
    freightCharge := (subtotal * .15);
    RETURN(freightCharge);
    END IF;
END;

DECLARE
  subtotal NUMBER := 15000;
BEGIN
  DBMS_OUTPUT.PUT_LINE( ComputeFreight(subtotal) );
END;

Я не знаю, что не так с моим кодом, но он всегда показывает эту ошибку:

Неверное заявление

Неверное заявление

ORA-06503: PL/SQL: функция возвращена без значения ORA-06512: в "SQL_JQQXUMCMKFMRHRPZCYFNBEVTN.COMPUTEFREIGHT", строка 12 ORA-06512: в строке 4 ORA-06512: в "SYS.DBMS_SQL", строка 1721

2 ответа

Оператор возврата должен быть вне if-else:

CREATE OR REPLACE FUNCTION ComputeFreight(subtotal NUMBER)
RETURN NUMBER
IS
freightCharge NUMBER;
BEGIN
    IF subtotal <= 15000 THEN
        freightCharge := (subtotal * .10);
    ELSIF subtotal > 15000 THEN 
        freightCharge := (subtotal * .15);
    END IF;
    RETURN(freightCharge);    -- here
END;

Если это является практикой для оператора IF, это нормально (с учетом предложенного GurV размещения оператора RETURN). Однако, если вам это действительно нужно в каком-то производственном процессе, вы можете упростить функцию и сделать ее более эффективной. Что-то вроде этого:

CREATE OR REPLACE FUNCTION ComputeFreight(subtotal NUMBER)
RETURN NUMBER
IS
BEGIN
    RETURN subtotal * (CASE WHEN subtotal <= 15000 THEN 0.1 ELSE 0.15 END);
END;
Другие вопросы по тегам