본문 바로가기

Database/PLSQL

030 - [Oracle PL/SQL] Exceptions - Group Functions and Blocks

<샘플코드에서 사용한 데이터는 HR 스키마이고, 오라클 설치시 생성할 수 있는 기본 스키마 입니다>

 

 

# 아래와 같은 경우, 입력창에서 '1'을 입력하면 데이터가 없지만 오류가 발생하지는 않는다.
# 그래서 원하는 결과가 안 나올수도 있다.

Declare
    v_sum_sal number;
begin
   
   select sum(salary) into v_sum_sal
   from employees
   where DEPARTMENT_ID=&dno;

   DBMS_OUTPUT.PUT_LINE('the sum is: ['||v_sum_sal||']');
   DBMS_OUTPUT.PUT_LINE(sql%rowcount);
   
   EXCEPTION 
       when no_data_found then
       DBMS_OUTPUT.PUT_LINE('no data found');

end;



# 아래와 같은 경우, 입력창에서 '1'을 입력하면 조건문에서 결과를 확인해서 데이터가 없으면 예외처리를 발생시킨다

Declare
    v_sum_sal number;
    v_er exception;
begin
   
   select sum(salary) into v_sum_sal
   from employees
   where DEPARTMENT_ID=&dno;
   
   if v_sum_sal is not null then 
       DBMS_OUTPUT.PUT_LINE('the sum is: ['||v_sum_sal||']');
       DBMS_OUTPUT.PUT_LINE(sql%rowcount);
   else
       raise v_er;
   end if;
  
   EXCEPTION 
       when v_er then
       DBMS_OUTPUT.PUT_LINE('no data found');

end;

 

 

 

예외처리가 발생할때 해당 block 에서 처리할수 없다면 상위 block의 예외처리에서 처리가능하다.

 

# 변수 사이즈를 2자리로 제한하여 예외사항이 발생하게 설정하였다.
# 내부 block에서 발생한 오류를 외부 block에서 처리한다.

Declare
    v_sum_sal number(2); --number is smaller
    v_er exception;
begin
    --오류는 아래 블록에서 발생하지만 예외처리를 못해서 외부 블록에서 예외처리함.
    begin
        select sum(salary) into v_sum_sal
        from employees
        where DEPARTMENT_ID=&dno;
        
        if v_sum_sal is not null then 
            DBMS_OUTPUT.PUT_LINE('the sum is '||v_sum_sal);
            DBMS_OUTPUT.PUT_LINE(sql%rowcount);
        else
            raise v_er;
        end if;
        
        EXCEPTION 
            when v_er then
            DBMS_OUTPUT.PUT_LINE('no data found');
            
--            when others then
--            DBMS_OUTPUT.PUT_LINE('others.....');
--            dbms_output.put_line(sqlcode);
--            dbms_output.put_line(sqlerrm);
    end;
   
EXCEPTION    
    when others then 
    dbms_output.put_line(sqlcode);
    dbms_output.put_line(sqlerrm);

end;



# '1'을 입력한 출력 결과
no data found

# '10'을 입력한 출력 결과
-6502
ORA-06502: PL/SQL: numeric or value error: number precision too large