2 minute read

PROCEDURE

  • PL/SQL문을 저장하는 객체
  • 필요할 때마다 호출하여 사용
  • 결과값을 반환하지 않고 로직 처리만 가능
CREATE  OR REPLACE PROCEDURE 프로시저명
(
    매개변수명1 [IN | OUT | INOUT] 데이터 타입 [:= DEFAULT 값],
    매개변수명1 [IN | OUT | INOUT] 데이터 타입 [:= DEFAULT 값],
    ...
)
IS(선언부) 
    ...
BEGIN(실행부)
    ...
EXCEPTION(예외처리부)
    ...
END [프로시저명];
/

실행

EXECUTE 프로시저명(매개값1, 매개값2, ...);
EXEC 프로시저명(매개값1, 매개값2, ...);

수업 시간에 했던 예제.

-- 테스트용 테이블 생성
CREATE TABLE EMP_DUP
AS SELECT * FROM EMPLOYEE;

SELECT * FROM EMP_DUP;

-- 테이블의 데이터를 모두 삭제하는 프로시저 작성
CREATE OR REPLACE PROCEDURE DEL_ALL_EMP
IS    -- 선언부
BEGIN -- 실행부
    DELETE FROM EMP_DUP;
    
    COMMIT;
END;
/

-- 실행 필수
EXECUTE DEL_ALL_EMP;

-- 프로시저 작성 구문 라인 별로 저장된 것 확인
SELECT * FROM USER_SOURCE;


DROP TABLE EMP_DUP;
DROP PROCEDURE DEL_ALL_EMP;

테스트 용으로 테이블을 만들었다.
오라클 나름 쉬운 줄 알았는데 뒤로 갈수록 개념이 점점 복잡한 것들이 등장…
수업 땐 이해했다고 생각했지만.. 혼자 하려면 절대 안 되는 것…

매개변수가 있는 프로시저

  • 프로시저 실행 시 매개변수로 값 전달
-- 
CREATE OR REPLACE PROCEDURE DEL_EMP_ID
(
    P_EMP_ID EMPLOYEE.EMP_ID%TYPE
)
IS
BEGIN
    DELETE FROM EMPLOYEE
    WHERE EMP_ID = P_EMP_ID;
    
    -- COMMIT 생략
END;
/

-- 실행 필수
EXECUTE DEL_EMP_ID('&사번');

이번엔 사번을 매개변수로 받아서 그 사번의 데이터들만 출력했다.
P_EMP_ID EMPLOYEE.EMP_ID%TYPE 이 부분 확인.


IN/OUT매개변수가 있는 프로시저

  • IN : 프로시저 내부에서 사용
  • OUT : 프로시저 호출 시 외부에서 사용

FUNCTION

  • 프로시저와 유사한 용도
  • 실행결과를 되돌려 받을 수 있다는 점이 프로시저와 상이
    • RETURN 키워드 사용
CREATE OR REPLACE FUNCTION 함수명
(
    매개변수1 타입,
    매개변수2 타입,
    ...
)
RETURN 데이터타입
IS
    ...
BEGIN
    ...
    RETURN 반환값;
EXCEPTION
    ...
END [함수명];
/
CREATE OR REPLACE FUNCTION BONUS_CALC
(
    V_EMP_ID EMPLOYEE.EMP_ID%TYPE -- 매개변수
)

RETURN NUMBER

IS
    V_SAL EMPLOYEE.SALARY%TYPE;
    V_BONUS EMPLOYEE.BONUS%TYPE;
    
BEGIN
    SELECT SALARY, NVL(BONUS, 0)
    INTO V_SAL, V_BONUS
    FROM EMPLOYEE
    WHERE EMP_ID = V_EMP_ID;
    
    RETURN (V_SAL + (V_SAL * V_BONUS)) * 12 ;
END;
/

이번에는 사번을 입력 받아 해당 사원의
연봉(보너스 포함)을 계산하고 리턴하는 함수 생성했다.
작성한 걸 보면 맨 처음 오라클 배웠을 떄랑은 정말 많이 다르다.
있는 데이터를 조회만 했었는데
이제 원하는 정보를 입력하고 해당 데이터만을 가져올 수 있다.


cursor

  • 다중 행의 조회 결과를 담고 있는 객체(단일 행일 때는 INTO)
  • 조회 결과에 순차적으로 접근 가능
  • 묵시적 / 명시적
  • 속성
    • NOTFOUND : 커서 영역에 남아있는 행이 없을 경우 TRUE, 아니면 FALSE
    • FOUND : 커서 영역에 남아있는 행이 한 개 이상일 경우 TRUE, 아니면 FALSE
    • ISOPEN : 커서가 OPEN 상태인 경우 TRUE(묵시적 커서는 항상 FALSE)
    • ROWCOUNT : 조회된 행의 개수
    • 커서명%NOTFOUND
    • SQL%NOTFOUND(묵시적 커서)

Categories:

Updated: