我创建了一个触发器,但它无效。
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
我无法调试它。我需要以正确的方式处理它,所有异常都应该处理。
答案 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;
/
祝你好运!