如何在 Oracle 函数中处理被零除
How to handle divide by zero in Oracle function
我在使用此函数时出现被零除错误。它编译得很好。因为我没有使用 select 语句,所以我假设 NULLIF 不会起作用。
我可以使用什么来避免除以零的问题?
OPEN GET_DATA;
fetch GET_DATA into v_gpa_hsch,v_gpa_hsch_scale,v_gpa_scale,v_gpa,
v_gpa_recalc,v_gpa_hsch_recalc;
IF GET_DATA%NOTFOUND
THEN
IT_final_final_calc :=0;
ELSE
IF v_gpa_hsch_scale < v_gpa_scale
THEN IL_higher_scale_calc := v_gpa_scale;
ELSE IL_higher_scale_calc := v_gpa_hsch_scale;
END IF;
IF v_gpa_hsch < v_gpa
THEN IM_gpa_calc := v_gpa;
ELSE IM_gpa_calc := v_gpa_hsch;
END IF;
IF IM_gpa_calc > IL_higher_scale_calc
THEN IN_highest_gpa_calc := IL_higher_scale_calc;
ELSE IN_highest_gpa_calc := IM_gpa_calc;
END IF;
IO_factor_calc := (IL_higher_scale_calc/4);
--I PRESUME THE FOLLOWING LINE IS THE ISSUE:
IP_rec_calc := +(IN_highest_gpa_calc/IO_factor_calc);
当IO_factor_calc = 0时,你想要什么结果?你可以这样做
IP_rec_calc := case when IO_factor_calc=0 then 0
else +(IN_highest_gpa_calc/IO_factor_calc)
end;
您可以根据需要使用这两个选项,
使用 CASE
IP_rec_calc := CASE IO_factor_calc WHEN 0 then 0 --whatever you want
ELSE +(IN_highest_gpa_calc/IO_factor_calc)
END;
或 zero_divide
异常处理程序
EXCEPTION
WHEN zero_divide then
dbms_output.put_line('Division by Zero happened .');
IP_rec_calc := 0; --whatever you want
您正在使用一种编程语言。因此,它当然具有条件:
IF IO_factor_calc = 0 THEN
IP_rec_calc := 0;
ELSE
IP_rec_calc := IN_highest_gpa_calc / IO_factor_calc;
END IF;
您可以在 IF 和 ELSE 块中放置更多代码,以防您想要进行一些日志记录等操作。
您不需要查询即可使用 NULLIF
,您也可以在 PL/SQL 中使用它:
IP_rec_calc := IN_highest_gpa_calc / NULLIF(IO_factor_calc, 0);
这甚至是一种非常典型的处理这种情况的方法。除以零的结果未定义,因此我们将其设为空。
我习惯了这个:
IP_rec_calc := DECODE(IO_factor_calc, 0,NULL, IN_highest_gpa_calc / IO_factor_calc);
我在使用此函数时出现被零除错误。它编译得很好。因为我没有使用 select 语句,所以我假设 NULLIF 不会起作用。 我可以使用什么来避免除以零的问题?
OPEN GET_DATA;
fetch GET_DATA into v_gpa_hsch,v_gpa_hsch_scale,v_gpa_scale,v_gpa,
v_gpa_recalc,v_gpa_hsch_recalc;
IF GET_DATA%NOTFOUND
THEN
IT_final_final_calc :=0;
ELSE
IF v_gpa_hsch_scale < v_gpa_scale
THEN IL_higher_scale_calc := v_gpa_scale;
ELSE IL_higher_scale_calc := v_gpa_hsch_scale;
END IF;
IF v_gpa_hsch < v_gpa
THEN IM_gpa_calc := v_gpa;
ELSE IM_gpa_calc := v_gpa_hsch;
END IF;
IF IM_gpa_calc > IL_higher_scale_calc
THEN IN_highest_gpa_calc := IL_higher_scale_calc;
ELSE IN_highest_gpa_calc := IM_gpa_calc;
END IF;
IO_factor_calc := (IL_higher_scale_calc/4);
--I PRESUME THE FOLLOWING LINE IS THE ISSUE:
IP_rec_calc := +(IN_highest_gpa_calc/IO_factor_calc);
当IO_factor_calc = 0时,你想要什么结果?你可以这样做
IP_rec_calc := case when IO_factor_calc=0 then 0
else +(IN_highest_gpa_calc/IO_factor_calc)
end;
您可以根据需要使用这两个选项,
使用 CASE
IP_rec_calc := CASE IO_factor_calc WHEN 0 then 0 --whatever you want
ELSE +(IN_highest_gpa_calc/IO_factor_calc)
END;
或 zero_divide
异常处理程序
EXCEPTION
WHEN zero_divide then
dbms_output.put_line('Division by Zero happened .');
IP_rec_calc := 0; --whatever you want
您正在使用一种编程语言。因此,它当然具有条件:
IF IO_factor_calc = 0 THEN
IP_rec_calc := 0;
ELSE
IP_rec_calc := IN_highest_gpa_calc / IO_factor_calc;
END IF;
您可以在 IF 和 ELSE 块中放置更多代码,以防您想要进行一些日志记录等操作。
您不需要查询即可使用 NULLIF
,您也可以在 PL/SQL 中使用它:
IP_rec_calc := IN_highest_gpa_calc / NULLIF(IO_factor_calc, 0);
这甚至是一种非常典型的处理这种情况的方法。除以零的结果未定义,因此我们将其设为空。
我习惯了这个:
IP_rec_calc := DECODE(IO_factor_calc, 0,NULL, IN_highest_gpa_calc / IO_factor_calc);