PL/SQL 기본 문법

  • 변수 선언: var_name data_type
  • %TYPE Attribute
    : 테이블 컬럼과 같은 데이터 타입으로 설정할 경우 사용
    - 사용법: TABLE__NAME.COLUME_NAME%TYPE
    - ex) v_name emp.name%TYPE -- 데이터 타입을 가져오겠다.
  • %ROWTYPE Attribute
    : 테이블 컬럼명과 데이터 타입을 그대로 가져올 경우 사용
    - ex) v_emp emp%ROWTYPE; -- v_emp.empno 로 데이터 접근
  • IF Statement: 아래 소스 참고
  • FOR LOOP Statement
CREATE OR REPLACE PROCEDURE Table_Test2
IS
  -- dept 테이블의 속성을 테이블 타입으로 설정
  TYPE dept_table_type  IS TABLE OF dept%ROWTYPE INDEX BY BINARY_INTEGER;
  
  -- 테이블 타입으로 변수를 선언해서 사용
  dept_table    dept_table_type;
  i             BINARY_INTEGER := 0;
BEGIN
  DBMS_OUTPUT.ENABLE;
  
  /* dept_list 는 자동선언되는 BINARY_INTEGER형 변수로 1씩 증가한다.
     dept_list 대신 다른 문자열 사용 가능 */
  FOR dept_list IN (SELECT *
                    FROM   dept)
  LOOP
    dept_table(i).deptno  := dept_list.deptno;
    dept_table(i).dname   := dept_list.dname;
    dept_table(i).loc     := dept_list.loc;
    i := i +1;
  END LOOP;
  
  FOR cnt IN 0..i-1 LOOP
    DBMS_OUTPUT.PUT_LINE('부서번호 : ' || dept_table(cnt).deptno || '  부서명 : ' || dept_table(cnt).dname
                          || '  위치 : ' || dept_table(cnt).loc);
  END LOOP;
  
END;

 

 

PL/SQL 에러 처리 방법

1. Predefined Exception - 미리 정의된 에러

: NO_DATA_FOUND, TOO_MANY_ROWS, INVALID_CURSOR, ZERO_DIVIDE, DUP_VAL_ON_INDEX ...

CREATE OR REPLACE PROCEDURE Show_emp
( p_sal   IN  emp.sal%TYPE)
IS
  v_ename   emp.ename%TYPE;
  v_sal     emp.sal%TYPE;
  v_job     emp.job%TYPE;
  
BEGIN
  DBMS_OUTPUT.ENABLE;
  
  SELECT ename,   sal,    job
  INTO   v_ename, v_sal,  v_job
  FROM   emp
  WHERE  sal = p_sal;
 
 DBMS_OUTPUT.PUT_LINE('이름  ' || '급여  ' || '직책 ');
 DBMS_OUTPUT.PUT_LINE('---------------------------');
 DBMS_OUTPUT.PUT_LINE(v_ename || '  ' || v_sal || '  ' || v_job);

EXCEPTION
  WHEN NO_DATA_FOUND THEN
    DBMS_OUTPUT.PUT_LINE('해당 급여 받는 사람 없음, 다시 조사하세요');
  WHEN TOO_MANY_ROWS THEN
    DBMS_OUTPUT.PUT_LINE('해당 급여 받는 사람 하나 이상, CURSOR 문 전환 필요');
END;

 

2. Non-Predefined Exception

: Oracle server error 중 미리 정의되지 않은 error를 명시적으로 사용자가 선언하여 사용

CREATE OR REPLACE PROCEDURE DEL_DEPT
(   p_deptno    dept.deptno%TYPE)
IS  
    -- exception 타입인 변수 선언
    FK_ERR      EXCEPTION;    			
    -- Oracle server에서 제공하는 error번호를 EXCEPTION_INIT을 이용하여 연결
    PRAGMA      EXCEPTION_INIT(FK_ERR, -2292);
BEGIN
    DBMS_OUTPUT.ENABLE;
    
    DELETE FROM DEPT
    WHERE  deptno = p_deptno;
    COMMIT;

-- 이 Section에서 error 처리
EXCEPTION
    WHEN FK_ERR THEN
      ROLLBACK;
      DBMS_OUTPUT.PUT_LINE('참조되는 emp가 있어 삭제불가하오니 양해바랍니다.');
END;

 

3. User Defined Exception

: business error - 이런 것들을 log table에 넣어서 업무 프로세스를 개선할 수 있다.

: RAISE문을 사용하여 에러 발생 시킴

----------------------------------------------------------
-- 오라클 저장함수 RAISE_APPLICATION_ERROR를 사용하여 
-- 오류코드 -20000부터 -20999의 범위 내에서 사용자
-- 정의 예외를 만들수 있다.
-- STEP 1 : 예외의 이름을 선언 (선언절)
-- STEP 2 : RAISE문을 사용하여 직접적으로 예외를 발생시킨다(실행절)
-- STEP 3 : 예외가 발생할 경우 해당 예외를 참조한다(예외절)
----------------------------------------------------------
CREATE OR REPLACE PROCEDURE User_Exception
(v_deptno IN emp.deptno%TYPE)
IS
user_define_error EXCEPTION;  -- step 1: 예외 이름 선언
cnt NUMBER;
BEGIN
  DBMS_OUTPUT.ENABLE;
  
  SELECT COUNT(empno)
  INTO cnt
  FROM emp
  WHERE deptno = v_deptno;
  
  IF cnt < 5 THEN
    RAISE user_define_error; -- step 2: RAISE문을 사용하여 직접적으로 예외 발생
  ELSE
    DBMS_OUTPUT.PUT_LINE('조직의 직무 향상 필요');
  END IF;
EXCEPTION
  -- 예외 발생할 경우 해당 예외참조
  WHEN user_define_error THEN
    RAISE_APPLICATION_ERROR(-20001, '부서에 인원 충원 필요');
END;

 

 

'Database' 카테고리의 다른 글

[PL/SQL] 패키지 (Package)  (0) 2019.09.16
[PL/SQL] 커서 (CURSOR)  (0) 2019.09.16
[PL/SQL] Function, Procedure  (0) 2019.09.11
[Oracle] 조건 검색 - WHERE 절  (0) 2019.09.10
[Oracle] ERROR: ORA-00937  (0) 2019.09.10

+ Recent posts