Сегодня столкнулся с довольно загадочной проблемой. Когда я выполнил свою функцию SQL f_interestrate()
(которая должна вызвать определенное мной исключение, когда один из параметров равен 0) со следующими параметрами:
SELECT GENERAL_FUNCTIONS.F_INTERESTRATE(2500000, 0.10, 0) FROM dual;
Дал мне следующую ошибку:
ORA-06503: PL/SQL: функция возвращена без значения
ORA-06512: в "NOAHBASE.GENERAL_FUNCTIONS", строка 73
06503. 00000 - "PL/SQL: функция возвращена без значения"
*Причина : Вызов функции PL/SQL завершен, но инструкция RETURN не выполнена.
*Действие: Перепишите функцию PL/SQL, убедившись, что она всегда возвращает значение надлежащего типа.
Но, как вы можете видеть в следующем примере кода, функция должна вместо этого вызывать форму, определенную мной как исключение ex_invalid_devisor
. Не забудьте упомянуть, что эта функция вложена в пакет.
FUNCTION f_interestrate(pn_principal NUMBER, pn_interest NUMBER, pn_years NUMBER) RETURN NUMBER IS
vn_interestrate NUMBER;
ex_invalid_devisor EXCEPTION;
BEGIN
IF pn_principal = 0 OR
pn_interest = 0 OR
pn_years = 0 THEN
RAISE ex_invalid_devisor;
ELSE
vn_interestrate := ((pn_interest/pn_principal)-1)/pn_years;
RETURN vn_interestrate;
END IF;
EXCEPTION
WHEN ex_invalid_devisor THEN
DBMS_OUTPUT.PUT_LINE('Devisor must be bigger then 0');
END;
Я делаю что-то не так?
return
на случай возникновения исключения нет. Вам нужно поставить, например. areturn null
в блок catch или повторно вызвать исключение. Ваш текущий блок молча проглатывает его - person a_horse_with_no_name   schedule 18.10.2016