Post

프로시저(Procedure)

프로시저(Procedure)

1절. 프로시저

프로시저(Procedure)

  • 프로그래밍 일반 용어
  • 이름을 붙여 놓은 호출 가능한 일련의 처리 절차

함수와 프로시저

구분영문반환값목적
함수FunctionO값을 계산한 뒤 return
프로시저ProcedureX작업 수행(출력, 저장, 갱신 등)
  • 위 구분은 언어 설계 상의 전통적인 분류
  • SQL Server 저장 프로시저는 OUTPUT 파라미터·RETURN·결과 집합으로 값 반환 가능

2절. 저장 프로시저

저장 프로시저(Stored Procedure)

  • 대부분의 RDBMS가 제공하는 기능
    • 본 문서는 SQL Server 기준
  • 쿼리문 집합
  • DB 서버에 저장되어 DB 엔진이 실행
  • 어떤 동작을 일괄 처리하는 용도
  • 개발자가 짜놓은 쿼리문을 메서드 형식으로 관리

사용 이유

이유설명
재사용같은 조회 로직을 여러 프로그램이 공유
보안- 원본 테이블에 접근 권한을 주지 않고 실행 권한만 존재
- 정해진 방식으로만 사용자의 데이터 접근 가능
변경 용이쿼리가 변경될 때 프로시저만 수정 가능
성능- 실행 계획이 캐시되어 재사용
- 긴 쿼리문 대신 프로시저명만 전송해 네트워크 부하 감소

명명 규칙

접두사용도
usp_사용자 정의 프로시저(user stored procedure)
sp_생성 금지
- 시스템 프로시저 전용 접두사
- master DB를 먼저 탐색해 성능 저하 및 이름 충돌 발생

파라미터 방향

구분키워드설명
입력(기본)호출부 → 프로시저
출력OUTPUT프로시저 → 호출부, 호출 시에도 OUTPUT 명시

RETURN & OUTPUT

구분반환 타입용도
RETURNINT 타입만성공/실패 상태코드
OUTPUT모든 타입실제 값 전달

테이블 정의 예제

1
2
3
4
5
6
7
CREATE TABLE TBL_NAME(
    SEQ         INT IDENTITY(1, 1) PRIMARY KEY,
    NAME_A      NVARCHAR(20),
    NAME_B      NVARCHAR(20),
    NAME_C      NVARCHAR(20),
    REG_DATE    DATETIME2(7)
);

프로시저 생성 구문

1
2
3
4
5
CREATE PROCEDURE [프로시저명] ([파라미터])
AS
BEGIN
    [쿼리문];
END

프로시저 생성 예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
CREATE PROCEDURE ALPHA_NAME (
    @NAME_A     NVARCHAR(20),
    @NAME_B     NVARCHAR(20),
    @NAME_C     NVARCHAR(20),
    @DATE       DATETIME2(7)    OUTPUT,
    @RESULT     INT             OUTPUT
)
AS
BEGIN
    -- 결과 적용 행의 개수 미표시 옵션
    SET NOCOUNT ON;
    -- 실행 시점 고정(INSERT 값 == OUTPUT 값)
    SET @DATE = SYSDATETIME();
    BEGIN TRY
        -- 트랜잭션
        BEGIN TRAN;
        INSERT INTO TBL_NAME (NAME_A, NAME_B, NAME_C, REG_DATE)
        VALUES (@NAME_A, @NAME_B, @NAME_C, @DATE);
        -- 커밋
        COMMIT TRAN;
        -- 성공 시 0
        SET @RESULT = 0;
    END TRY
    BEGIN CATCH
        -- 트랜잭션이 살아있는 경우 롤백
        IF XACT_STATE() <> 0
            ROLLBACK TRAN;
        -- 실패
        SET @RESULT = -1;
        SET @DATE = NULL;
    END CATCH
    SET NOCOUNT OFF;
END;

프로시저 호출 구문

1
EXEC [프로시저명] [파라미터];

프로시저 호출 예제

1
2
3
4
5
6
7
8
9
10
11
DECLARE @OUT_DATE       DATETIME2(7);
DECLARE @OUT_RESULT     INT;

EXEC ALPHA_NAME
    @NAME_A = N'방'
   , @NAME_B = N'윤'
   , @NAME_C = N'서'
   , @DATE   = @OUT_DATE   OUTPUT
   , @RESULT = @OUT_RESULT OUTPUT;
    
SELECT @OUT_DATE AS REG_DATE, @OUT_RESULT AS RESULT;

프로시저 삭제 구문

1
DROP PROCEDURE [프로시저명];

프로시저 삭제 예제

1
DROP PROCEDURE ALPHA_NAME;

프로시저 조회

1
2
3
4
5
6
7
8
9
10
-- 원본 정의 확인
sp_helptext [프로시저명];

-- 파라미터 및 속성 확인
sp_help [프로시저명];

-- 전체 프로시저 목록
SELECT name, create_date, modify_date
FROM sys.procedures
ORDER BY name;
This post is licensed under CC BY 4.0 by the author.