DJ메탈짱™의 Free Style

[ORACLE] ORA-01476: 제수가 0 입니다. 에러 발생하는 경우 대처방법. 본문

일(job)/DBMS

[ORACLE] ORA-01476: 제수가 0 입니다. 에러 발생하는 경우 대처방법.

뽀&쏭 2016. 1. 18. 16:45



나누기 연산 하는 경우거나 평균값을 구하는 경우에 분모 값이 0 인 상태에서 연산을 하면 에러(ORA-01476)가 발생하는데...

이 경우 아래와 같은 예제를 활용하시면 해결하실 수 있습니다.

    -- ORA-01476: 제수가 0 입니다.
    -- 나누기 연산을 하여 값을 구하는 경우


    select a/b result
    from (select 100 a, 0 b from dual)

 

    -- ORA-01476: 제수가 0 입니다.
    -- 두개의 값에 따라 평균값을 구하는 경우
    select avg(a/b) result
    from (select 100 a, 0 b from dual)

 

    -- NULLIF 함수를 사용하여 처리
    -- 분모가 0 인 경우에 결과값은 0
    select nvl(avg(a/nullif(b,0)),0) result 
    from (select 100 a, 0 b from dual)

 

    -- 결과값 : 2, 0.5
    select avg(200/100) result from dual
    select avg(100/200) result from dual

 

    -- DECODE 함수를 사용하여 처리.
    select decode(b,0,0,null,0, a/b) result
    from (select 100 a, 0 b from dual)

 

    -- ORA-01476: 제수가 0 입니다.
    -- AVG 함수를 사용하는 경우에는 분자/분모 모두 "0"이 아니여야 하므로
    -- 아래와 같이 DECODE, NULLIF 함수를 사용하면 해결할 수 있음.
    select decode(sum(b),0,0,null,0, avg(a/b)) result
    from (
        select 1001 a, 16 b from dual union all 
        select 2002 a, 10 b from dual
    )

 

    -- 131.38125 결과값
    -- ROUND 함수로 인한 결과값 반올림(131.4) 
    select ROUND(decode(sum(b),0,0,null,0, avg(a/b)),1) result
    from (
        select 1001 a, 16 b from dual union all 
        select 2002 a, 10 b from dual
    )

 

    -- 131.38125 결과값
    -- 지정한 소수점 단위로 절삭한다.(131.3)
    select trunc(decode(sum(b),0,0,null,0, avg(a/b)),1) result
    from (
        select 1001 a, 16 b from dual union all 
        select 2002 a, 10 b from dual
    )