[MSSQL] 사용자 정의 함수, 테이블 반환 함수, 스칼라 함수
도움이 되셨다면 광고 한 번 클릭 부탁드립니다. 한 번의 클릭이 제게 큰 힘이 된답니다!^^
사용자 정의 함수
- 사용자가 직접 함수를 정의한 함수
- 일반적인 프로그래밍 언어에서 사용되는 함수같이 복잡한 프로그래밍이 가능하다.
- return문을 사용하여 특정한 값을 반환할 수 있다.
- 저장 프로시저는 'EXECUTE' or 'EXEC'에 키워드로 실행되지만, 함수는 주로 'SELECT' 문에 포함되어 실행(호출)된다.
(스칼라 함수의 경우 저장 프로시저처럼 EXECUTE로 실행할 수 있다.)
사용자 정의 함수
사용자 정의 함수는 다음과 같이 정의한다.
CREATE FUNCTION [ schema_name. ] function_name
( [ { @parameter_name [ AS ] [ type_schema_name. ] parameter_data_type
[ = default ] [ READONLY ] }
[ , ...n ]
]
)
RETURNS return_data_type
[ WITH <finction_option> [ , ...n ] ]
[ AS ]
BEGIN
function_body
RETURN scalar_expression
END
사용자 정의 함수 예제
1. 출생년도를 입력하면 나이가 출력되는 함수를 생성해 보자.
CREATE FUNCTION fn_getAge_test(@byear INT) -- 매개 변수를 정수로 받음
RETURNS INT -- 리턴값은 정수형
AS
BEGIN
DECLARE @AGE INT
SET @AGE = YEAR(GETDATE()) - @byear
RETURN(@AGE)
END
GO
※ 설명 ※
CREATE FUNTION fn_getAge_test(@byear INT)
└▶ 함수를 fn_getAge_test명으로 하고, 매개 변수를 1개, 매개 변수 이름은 @byear 자료형은 INT로 한다.
RETURNS INT
└▶ 반환 타입은 INT이다. 함수에서 return할 때 INT를 반환한다.
AS BEGIN ~ END
└▶함수가 정의되는 시작점, 끝점
DECLARE @AGE INT
└▶INT 타입의 @AGE라는 변수 이름을 선언한다.
SET @AGE = YEAR(GETDATE()) - @byear
└▶ GETDATE() 현재날짜를 구하는 함수를 사용해서, YEAR() 함수를 사용해 년도를 구하고, @byear 에 입력된 매개 변수 값을 빼주어 @AGE 변수에 값을 세팅한다.
RETURN(@AGE)
└▶ @AGE 값을 반환한다.
현재의 연도(YEAR(GETDATE()) 에서 입력된 출생년도를 뺀 값(즉, 나이)을 돌려주는 함수다.
2. 함수를 호출해 보자.
1) 함수를 정의할 때 스키마 이름을 지정하지 않았으므로 디폴트 스키마인 dbo를 붙여줘야 한다.
SELECT dbo.fn_getAge_test(1991);
2) EXECUTE 문을 사용해서 저장 프로시저를 실행하듯이 사용할 수도 있다. 하지만 좀 불편하다.
DECLARE @retVal INT;
EXEC @retVal = dbo.fn_getAge_test 1991;
PRINT @retVal;
3. 함수를 수정할 땐 CREATE 키워드 대신 ALTER 키워드를 사용한다.
우리나라 나이로 계산되도록 수정한다.
ALTER FUNCTION fn_getAge_test(@byear INT) -- 매개 변수를 정수로 받음
RETURNS INT -- 리턴값은 정수형
AS
BEGIN
DECLARE @AGE INT
SET @AGE = YEAR(GETDATE()) - @byear + 1
RETURN(@AGE)
END
GO
실행
4. 함수 삭제 키워드 DROP
함수를 삭제한다.
DROP FUNCTION fn_getAge_test;
함수의 종류
1. 사용자 정의 스칼라 함수 : 사용자 정의 스칼라 함수 RETURN 문에 의해서 하나의 단일값을 돌려주는 함수
└▶ 지금까지 위에서 살펴본 함수
2. 사용자 정의 테이블 반환 함수 : 그냥 '테이블 함수'라고도 한다. 반환하는 값이 하나가 아닌 '테이블'인 함수
테이블 함수에는 2가지 종류가 있다.
- 인 라인 테이블 반환 함수(Inline Table-valued Function)
- 다중 문 테이블 반환 함수(Multistatement Table-valued Function)
1) 인 라인 테이블 반환 함수
간단히 테이블을 돌려주는 함수이며, 매개 변수가 있는 뷰와 비슷한 역할을 한다. 인 라인 테이블 반환 함수에는 별도의 내용이 없으며 단지 SELECT 문만 사용되어 그 결과 집합을 리턴할 뿐이다.
CREATE FUNCTION 함수이름(매개 변수)
RETURNS TABLE
AS
RETURN (
단일 SEELCT 문장;
)
GO
예시)
인 라인 테이블 반환 함수의 예시이다. 다음과 같은 테이블이 있다.
함수의 매개 변수에 입력하는 숫자 보다 큰 사람들의 정보를 띄우는 함수를 만든다.
함수 생성
CREATE FUNCTION fn_getUser(@ht INT)
RETURNS TABLE
AS
RETURN (
SELECT id AS 아이디, name AS 이름, height AS 키
FROM user_t_tb
WHERE height > @ht
)
GO
함수 호출
키가 175 보다 크던 이승기, 강호동의 데이터 행만 검색한 것을 볼 수 있다.
2) 다중 문 테이블 반환 함수
다중 문 테이블 반환 함수의 내용은 BEGIN - END 로 정의되며, 그 내부에 일련의 T-SQL을 이용해서 반환될 테이블에 행 값을 INSERT 하는 형식을 가진다.
CREATE FUNCTION 함수이름 (매개 변수)
RETURNS @테이블변수 TABLE
( 열이름과 데이터 형식 정의 ... )
AS
BEGIN
위 (헤더)에서 정의한 테이블에 행을 INSERT시키는 작업들 ...
RETURN;
END
다중 문 테이블 반환 함수는 간단한 예시로 보자.
ALTER FUNCTION fn_getUser()
RETURNS @TABLE TABLE
(
NAME VARCHAR(10),
AGE INT
)
AS
BEGIN
INSERT INTO @TABLE VALUES ('박지성' , 35)
INSERT INTO @TABLE VALUES ('이영표' , 40)
INSERT INTO @TABLE VALUES ('안정환' , 40)
INSERT INTO @TABLE VALUES ('이천수' , 34)
INSERT INTO @TABLE VALUES ('호날두' , 37)
RETURN
END
GO
select * from dbo.fn_getUser()
반환하려고 하는 테이블에(@TABLE) 값을 넣어서(INSERT 문...) 리턴한다고 보면 된다.
결과를 보자.
빠른 이해를 돕기 위해 간단한 예제로 나타냈다.
도움이 되셨다면 광고 한 번 클릭 부탁드립니다. 한 번의 클릭이 제게 큰 힘이 된답니다!^^
'DB, SQL' 카테고리의 다른 글
MariaDB root 비밀번호 재설정, root password 변경하기 (0) | 2021.05.09 |
---|---|
MariaDB 계정 생성 및 권한 부여하기(권한 주기) (1) | 2021.05.09 |
GCP cloud ubuntu에 mariadb 설치하기 & 기본 사용법 (0) | 2021.05.09 |
[MSSQL] 테이블 스키마 컬럼 정보 조회하기 (0) | 2021.03.19 |
[MS SQL] DDL 트리거 (Trigger) (0) | 2021.03.12 |