가랑비에 옷 젖는 줄 모른다 💻/SQL & DB

프로시저와 비슷한 function 문법

잔뜩 2023. 8. 12. 14:10

https://codingapple.com/course/sql-and-database/

 

한 번에 끝내는 SQL & Database - 코딩애플 온라인 강좌

SQL은 관계형 데이터베이스에서 데이터를 입출력할 때 사용하는 언어입니다.  관계형 데이터베이스를 다루는 곳에서 백엔드 개발 잘하고 싶다면 SQL을 잘 알아두도록 합시다.  실은 SQL을 개발자

codingapple.com


프로시저란?  긴 쿼리문을 재사용 하고 싶을 때

function은? 계산과정,수식을 재사용하고 싶을 때

(부가세,배송비,환율 등등)


DBeaver에서 function 만들기

프로시저 있는 곳에 만드는데 type을 function으로 해주기

CREATE FUNCTION DB이름.함수이름(구멍 INT) 
RETURNS INT
DETERMINISTIC
BEGIN
    RETURN 100;
END

1. CREATE FUNCTION 뒤에 이름 작명하고 소괄호 안에 파라미터 넣을 수 있는건 procedure와 비슷하고

 

2. RETURNS 뒤에 RETURN할 자료의 데이터타입 넣기

 

3. DETERMINISTIC 도 넣어둬야하는데

    1. 구멍에 뭘 넣어도 항상 같은 값을 RETURN 하면 DETERMINISTIC

    2. SQL 문법을 사용안하면 NO SQL 표기해야하고

    3. 안에 SELECT를 사용하면 READS SQL DATA

    4. 안에 INSERT DELETE를 사용하면 MODIFIES SQL DATA

         를 표기해둬야합니다. 

 

4. RETURN 뒤에 function 사용 후에 뱉을 값 또는 코드를 기입해줘야합니다.

 

무조건 어떤 데이터를 RETURN 해야한다는게 procedure와 가장 큰 차이점입니다. 

 

 

부가세 function

어떤 숫자를 집어 넣으면 부가세를 남겨주는 funtion을 만들어보자

CREATE FUNCTION mart.vat(구멍 INT) 
RETURNS INT
DETERMINISTIC
BEGIN
    RETURN 구멍 * 0.1;
END 
SELECT mart.vat(가격)

부가세가 자동으로 계산이 되서 나온다!

자주쓰는 계산식을 편리하게 재사용하려고 function 만들어쓰는 것 -> 이게 포인트다

 

procedure vs function 비교 정리

 

- 둘 다 SQL 코드를 저장해두고 재사용하는 용도입니다.

- procedure는 CALL 문법으로 소환해야함, function은 CALL 문법 필요없음 

- procedure는 RETURN (그니까 OUT 파라미터) 없어도 됩니다. function은 무조건 RETURN 있어야함 

- procedure는 쿼리문 중간에 갑자기 사용불가능, function은 자유롭게 거의 아무데서나 사용가능 

 

그래서 그냥 SQL 쿼리문 재사용 용이면 procedure, 계산기 만들고 싶으면 function 쓰셈 

 

function 문법 주의사항 

 

MySQL의 function 안에서는 SELECT 문법으로 출력하는건 금지되어있습니다. 

SELECT한걸 변수에 집어넣어주는 SELECT INTO 문법 이런건 허용되고 

서브쿼리용도로 쓰는 (SELECT 어쩌구) 이런 것도 허용됩니다. 

테이블 출력만 금지임 


숙제🍎

1. 문자 하나를 집어넣으면 '안녕하세요' 를 앞에 붙여서 뱉어주는 함수를 만들어서 사용까지 해봅시다. 

 

CREATE FUNCTION mart.안녕(구멍 varchar(100))
RETURNS varchar(100)
DETERMINISTIC
BEGIN
	RETURN concat('안녕하세요',구멍);
END

2. 입대날짜를 입력하면 전역날짜를 뱉어주는 함수를 만들어봅시다. 복무일은 545일로 합시다.

CREATE FUNCTION mart.dp(구멍 date)
RETURNS varchar(100)
DETERMINISTIC
BEGIN
	DECLARE 전역일 date;
    SET 전역일 = date_add(구멍, INTERVAL 545 DAY);
    RETURN date_format(전역일, '%Y년 %m월 %d일');
END

declare 전역일 을 통해 변수 선언,

이 변수는 함수 내에서 사용되며, date_add 함수를 통해 구멍 변수(인자로 전달된 날짜)에 545일을 더한 값을 할당합니다.

728x90