Oracle PL SQL。处理除以零异常

时间:2014-03-14 02:21:26

标签: oracle plsql

我创建了一个触发器,但它无效。

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

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

5 个答案:

答案 0 :(得分:2)

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

v_height始终为0。如果除以零,则会产生溢出。你需要避免这种情况。

答案 1 :(得分:2)

最好的解决方案是首先不要将零除以零,例如:

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;
/

此外,除了调试输出之外,不要处理意外的异常 - 要么防止它们,要么以有意义的方式处理它们,要么允许它们传播给调用者。

答案 2 :(得分:2)

使用预定义的异常除以零,ZERO_DIVIDE

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

答案 3 :(得分:1)

您可以创建用户定义的异常除以零错误(错误代码= -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;
/

答案 4 :(得分:-3)

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

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;
/
祝你好运!