Как обрабатывать деление на ноль в функции Oracle - PullRequest
0 голосов
/ 29 января 2019

Я получаю ошибку деления на ноль при использовании этой функции.Компилируется нормально.Поскольку я не использую оператор выбора, я предполагаю, что 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);

Ответы [ 5 ]

0 голосов
/ 29 января 2019

Я привык к этому:

IP_rec_calc := DECODE(IO_factor_calc, 0,NULL, IN_highest_gpa_calc / IO_factor_calc);
0 голосов
/ 29 января 2019

Вам не нужен запрос для работы с NULLIF, вы также можете использовать его в PL / SQL:

IP_rec_calc := IN_highest_gpa_calc / NULLIF(IO_factor_calc, 0);

Это даже очень типичный способ решения этой проблемы.ситуация.Результат деления на ноль не определен, поэтому мы делаем его нулевым.

0 голосов
/ 29 января 2019

Вы можете использовать эти два параметра в зависимости от ваших требований,

использовать 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 
0 голосов
/ 29 января 2019

Вы используете язык программирования.Как таковая, она, конечно, имеет следующие условия:

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 на случай, если вы захотите сделать какую-нибудь запись и т.д.

0 голосов
/ 29 января 2019

Какой результат вы хотите, когда IO_factor_calc = 0?Вы можете сделать, например,

IP_rec_calc := case when IO_factor_calc=0 then 0
                    else +(IN_highest_gpa_calc/IO_factor_calc) 
                    end;
...