如何在 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);