我创建了一个触发器,但是它不起作用
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;
/