Oracle PL SQL.处理除法等于零的异常



我创建了一个触发器,但是它不起作用

DECLARE
  v_width INTEGER;
  v_height INTEGER := 0;
  v_area INTEGER := 6;
BEGIN
  v_width := v_area / v_height;
  DBMS_OUTPUT.PUT_LINE('v_width = ' || v_width);
EXCEPTION
  WHEN NO_DATA_FOUND THEN
    DBMS_OUTPUT.PUT_LINE('Division by zero');
END;
/

但是我总是得到这个错误

ERROR at line 1:
ORA-01476: divisor is equal to zero
ORA-06512: at line 7

我不能调试它。我需要以正确的方式处理它,所有的异常都应该处理。

v_height INTEGER := 0;
v_width := v_area / v_height;

v_height总是0。如果除以0,就会产生溢出。

最好的解决方案是一开始就不要除以0,例如:

DECLARE
  v_width INTEGER;
  v_height INTEGER := 0; /*presumably this gets assigned in some other way*/
  v_area INTEGER := 6;
BEGIN
  IF v_height > 0 THEN
    v_width := v_area / v_height;
    DBMS_OUTPUT.PUT_LINE('v_width = ' || v_width);
  ELSE
    DBMS_OUTPUT.put_line('v_width is undetermined');
  END IF;
END;
/

此外,不要处理意外异常,除了调试输出之外什么都没有——要么保护它们,以有意义的方式处理它们,要么允许它们传播给调用者。

使用预设的除零异常,ZERO_DIVIDE:

declare
    v_test number;
begin
    v_test := 1/0;
exception when zero_divide then
    dbms_output.put_line('Divide by zero.');
end;

您可以为除零错误(错误码= -01476)创建一个用户定义的异常,并在您的代码中使用它:

declare
  v_width  integer;
  v_height integer := 0;
  v_area   integer := 6;
  e_div_by_0 exception;
  pragma exception_init(e_div_by_0, -01476);
begin
  v_width := v_area / v_height;
  DBMS_OUTPUT.PUT_LINE ( 'v_width = ' || v_width ) ;
exception
  when e_div_by_0 then
    dbms_output.put_line ( 'Divide by Zero' ) ;
  when no_data_found then
    dbms_output.put_line ( 'No data' ) ;
end;
/

我同意我同事的看法,但是,我猜你有一点打字错误。试试这个:

DECLARE
v_width INTEGER;
v_height INTEGER := 0;
v_area INTEGER := 6;
BEGIN
v_width := v_area / v_height;
DBMS_OUTPUT.PUT_LINE('v_width = ' || v_width);
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('Division by zero');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Division by zero in others exception');
END;
/

最新更新