[Oracle] 프로시저(Procedure)

후니·2023년 8월 24일

Oracle

목록 보기
2/4

📖 프로시저(Procedure)란?

개발자가 자주 실행해야 하는 특정 작업이 필요할 때 호출하기 위해 절차적인 언어를 이용하여 작성한 이름이 있는 프로그램 모듈(Block)을 의미

프로시저의 특징

  • 매개변수를 받을 수 있는 PL/SQL BLOCK

PL/SQL BLOCK이란?

  • 프로시저 내의 변수는 Scalar 변수로 임시 데이터 1개만 저장할 수 있는 변수이며, 모든 형태의 데이터 유형 지정이 가능
  • PL/SQL의 대입연산자는 ':=' 이다. (↔️ T-SQL은 일반적인 '='이다.)
  • PL/SQL에서 사용하는 프로시저 내의 SELECT 문장은 반드시 결괏값이 있어야 하며, 그 결과는 반드시 1개여야 한다.
  • 조회 결과가 없거나 2개 이상인 경우에는 에러가 발생한다. 그러나 특정한 로직을 처리하면서 결과는 있어야 하지만 그 결괏값을 함수 (사용자 정의 함수)처럼 반환(return)하지는 않는다.

✏️ 프로시저(Procedure) 문법

CREATE [OR REPLACE] Procedure "Procedure_name"( argument1 [MODE] data_type1, argument2 [MODE] data_type2, ...)
IS[AS]
...
BEGIN
...
EXCEPTION
...
END;
/

  • CREATE [OR REPLACE] 구문을 이용하여 생성
  • OR REPLACE: 같은 프로시저가 있을 때, 기존의 프로시저를 무시하고 새로운 내용으로 덮어쓰겠다는 의미
  • MODE: mode는 매개변수의 역할을 결정하는 자리, mode에 들어가는 변수는 3가지로 IN, OUT, INOUT이 있다.
    • IN: 운영체제에서 프로시저로 전달될 변수의 모드
    • OUT: 프로시저에서 처리된 결과로 운영체제로 전달
    • INOUT: IN과 OUT 두 가지 기능 모두 수행
  • IS: PL/SQL의 Block을 시작한다는 의미로, 프로시저 내에서 사용할 변수를 선언하는 곳, Local 변수는 IS와 Begin 사이에 선언해서 사용
  • EXCEPTION: Begin ~ end 사이에서 실행되는 SQL문 도중 발생한 에러를 처리하는 예외 처리부
  • END: 실행문의 종료
  • /: end; 뒤에 위치하는 슬러시(/)는 데이터베이스에게 프로시저를 컴파일하라는 명령

✏️ 프로시저(Procedure) 예제

CREATE OR REPLACE Procedure p_DEPT_insert (
v_DEPTNO in number,
v_dname in varchar2,
v_loc in varchar2,
v_result out varchar2)

IS cnt number := 0;

BEGIN
SELECT COUNT(*) INTO CNT FROM DEPT WHERE DEPTNO = v_DEPTNO AND ROWNUM = 1;
if cnt > 0 then v_result := '이미 등록된 부서번호';
else INSERT INTO DEPT(DEPTNO, DNAME, LOC) VALUES (v_DEPTNO, v_dname, v_loc);
COMMIT;
v_result := '입력 완료';
end if;

EXCEPTION
WHEN OTHERS
THEN ROLLBACK; v_result := 'ERROR 발생';

END;
/

여기서 SELECT INTO를 볼 수 있는데 COUNT(*)의 값을 변수 CNT에 삽입한다는 의미

✨ SELECT INTO 예제

DECLARE
	AGE NUMBER; // 초기 변수 선언
    
    BEGIN
    	SELECT T_AGE
        	INTO AGE -- 컬럼 데이터 값을 AGE 변수에 삽입
        FROM TEST_USER
        	WHERE T_NAME = ''
		DBMS_OUTPUT.PUT_LINE(AGE);
	END;
    
    /*=======================*/
    [결과 출력]
    
	> 41 
    into - 데이터를 삽입한다.
    /*=======================*/

✏️ 프로시저(Procedure) 실행 예제

SQL> EXCUTE p_DEPT_insert(10, 'dev', 'jeonju', :rslt);
PL/SQL 처리가 정상적으로 완료되었습니다.

SQL> print rslt;

1) EXECUTE 구문을 이용하여 정의한 프로시저(Procedure) 실행
2) 프로시저의 OUT 변수 rslt를 print할 때, DEPTNO(10)가 이미 존재한다면 '이미 등록된 부서번호'가 출력될 것이다. 없을 경우 '입력 완료'가 출력된다.

profile
Developer

0개의 댓글