본문 바로가기
웹개발/데이터베이스

오라클 프로시저

by 지구별 여행자 임탱 2024. 4. 7.
728x90

오라클에서 프로시저는 특정 작업을 수행하는 PL/SQL 블록으로, 반복적으로 사용될 수 있는 코드를 모듈화하여 저장합니다.

프로시저는 데이터베이스에 저장되며, 필요할 때마다 호출하여 사용할 수 있습니다. 

 

프로시저의 기본 구조

CREATE [OR REPLACE] PROCEDURE 프로시저명
[ (파라미터1 [IN | OUT | INOUT] 타입 [, 파라미터2 [IN | OUT | INOUT] 타입 ...]) ]
IS
[지역 변수 선언;]
BEGIN
  -- 실행할 SQL 문장 및 PL/SQL 코드
[EXCEPTION
  -- 예외 처리 코드]
END;

 

프로시저 작성 및 실행 예시

CREATE OR REPLACE PROCEDURE add_employee(
  p_name IN VARCHAR2,
  p_salary IN NUMBER,
  p_department_id IN NUMBER)
IS
BEGIN
  INSERT INTO employees (name, salary, department_id)
  VALUES (p_name, p_salary, p_department_id);
END;

 

프로시저 실행(호출) 방법

EXECUTE add_employee('홍길동', 5000000, 101);

EXECUTE 또는 EXEC 명령어를 사용하여 프로시저를 실행할 수 있습니다. 

 

프로시저 예외처리 예시

CREATE OR REPLACE PROCEDURE PROC_TEST
IS
  v_num NUMBER := 0;
BEGIN
  v_num := 10/0; -- 0으로 나누기 시도, 예외 발생
EXCEPTION
  WHEN ZERO_DIVIDE THEN -- 0으로 나누는 예외 처리
    dbms_output.put_line('0으로 나눌 수 없습니다!');
  WHEN OTHERS THEN -- 그 외 모든 예외 처리
    dbms_output.put_line('오류가 발생했습니다!');
    dbms_output.put_line('에러코드 : ' || SQLCODE);
    dbms_output.put_line('에러메시지 : ' || SQLERRM);
END;

 

주요 시스템 예외 목록
 * ZERO_DIVIDE: 0으로 나누려고 할 때 발생
 * NO_DATA_FOUND: 쿼리 결과가 없을 때 발생
 * TOO_MANY_ROWS: 단일 행 쿼리가 여러 행을 반환할 때 발생
 * VALUE_ERROR: 변수 타입과 할당된 값이 일치하지 않을 때 발생

 

프로시저 패키지

패키지는 프로시저(Procedure)와 함수(Function)의 집합으로, 관련된 프로시저와 함수를 그룹화하여 관리할 수 있게 해줍니다. 패키지를 사용함으로써 코드의 모듈화, 재사용성 향상, 유지 보수의 용이성 등 여러 가지 장점을 얻을 수 있습니다.

-- 패키지 선언부
CREATE OR REPLACE PACKAGE my_package AS
  PROCEDURE my_procedure(param1 IN NUMBER);
  FUNCTION my_function(param1 IN NUMBER) RETURN NUMBER;
END my_package;
/

-- 패키지 본체
CREATE OR REPLACE PACKAGE BODY my_package AS
  PROCEDURE my_procedure(param1 IN NUMBER) IS
  BEGIN
    -- 구현 로직
  END my_procedure;

  FUNCTION my_function(param1 IN NUMBER) RETURN NUMBER IS
  BEGIN
    -- 구현 로직
    RETURN param1;
  END my_function;
END my_package;
/