반응형

 

SQL을 하면서, Table / Stored Procedure(SP)는 많이 사용해봤다.

하지만, 함수(Function)는 그닥...많이 사용하지 않았는데 이번에 사용해보면서 정리해보려고 한다.

 

함수(Function) 문법

1
2
3
4
5
6
7
8
CREATE FUNCTION 함수이름 (
   INPUT 파라미터
) RETURNS 리턴타입
AS
BEGIN
    QUERY
    RETURN 리턴값;
END
cs

함수를 만들때 유의해야 할 점이 몇 가지 있다.

Stored Procedure (SP)와 달리, INPUT 파라미터는 사용할 수 있지만 OUTPUT 파라미터는 사용할 수 없다.

그리고 RETURNS 이후에 리턴타입에는 데이터타입(INT, VARCHAR등)과 TABLE을 리턴해줄 수 있다.

BEGIN END 으로 함수의 시작과 끝을 정의할 수 있고,

RETURN 이후에 우리는 반드시 값을 리턴해주어야 한다.

 

유의해야할 사항을 잊지말고, 아래 예제를 살펴보면 더 쉽게 함수(Function)에 대해 이해할 수 있을 것이다.

그전에 샘플 테이블/데이터를 만들었다. 함수(Function)에서는 임시테이블을 사용할 수 없으므로 이점도 알고있자.

 

샘플 테이블/데이터

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
-- 테스트 테이블 생성
CREATE TABLE TEST (
    num            INT IDENTITY PRIMARY KEY,
    name        NVARCHAR(50),
    age            INT,
    job            NVARCHAR(100),
    reg_date    DATETIME
)
 
-- 테스트 데이터 추가
INSERT INTO TEST (name, age, job, reg_date)
        VALUES ('홍길동'20'도적', GETDATE());
INSERT INTO TEST (name, age, job, reg_date)
        VALUES ('마동석'40'배우', GETDATE());
INSERT INTO TEST (name, age, job, reg_date)
        VALUES ('이승엽'32'야구선수', GETDATE());
INSERT INTO TEST (name, age, job, reg_date)
        VALUES ('이순신'74'장군', GETDATE());
INSERT INTO TEST (name, age, job, reg_date)
        VALUES ('박정민'34'배우', GETDATE());
INSERT INTO TEST (name, age, job, reg_date)
        VALUES ('박지성'39'축구선수', GETDATE());
cs

 

 

 

함수(Function) 예제 (스칼라 반환 함수)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
CREATE FUNCTION GET_JOB_COUNT (
    @job    NVARCHAR(50)
) RETURNS INT
AS
 
BEGIN
    DECLARE @count INT;
 
    SELECT @count = ISNULL(COUNT(1), 0)
    FROM TEST
    WHERE job = @job
 
    RETURN @count;
END
cs

GET_JOB_COUNT 라는 함수명을 가진 함수(Function)을 만들었다.

@job 이라는 INPUT 파라미터를 설정, 리턴값은 INT 데이터 타입을 설정해주었다.

그리고 SQL를 수행하여, 테이블에 해당 job이 몇명인지 리턴해주었다.

 

함수(Function) 예제 (테이블 반환 함수)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
CREATE FUNCTION GET_JOB_NAME (
    @job    NVARCHAR(50)
) RETURNS @rst TABLE (
   num     INT,
    name    NVARCHAR(50)
)
AS
 
BEGIN
 
    INSERT INTO @rst (num, name)
    SELECT num, name
    FROM TEST
    WHERE job = @job;
 
    RETURN
END
cs

위에 있는 스칼라 반환 함수와 조금 다르다.

함수명과 INPUT 파라미터는 동일하지만, 리턴은 TABLE을 미리 만들어주었다. 해당 TABLE인 @rst에 값을 설정해주면 그 값을 리턴해주겠다는 것을 의미한다.

@rst에 데이터를 넣어주고 RETURN문을 적어주면 끝난다. 스칼라 반환 함수와 조금씩 다르니 이점을 유념하자.

 

 

반응형

+ Recent posts