๐ฉ์ ์ฅํ๋ก์์ ์ ์ ์
- DB๋ด๋ถ์ ์ ์ฅ๋ ์ผ๋ จ์ SQL ๋ช ๋ น๋ฌธ๋ค์ ํ๋์ ํจ์์ฒ๋ผ ์คํํ๊ธฐ ์ํ ์ฟผ๋ฆฌ์ ์งํฉ
- ์ผ๋ จ์ ์ฟผ๋ฆฌ๋ฅผ ๋ง์น ํ๋์ ํจ์์ฒ๋ผ ์คํํ๊ธฐ ์ํ ์ฟผ๋ฆฌ๋ฌธ๋ค์ ์งํฉ
- DB๋ด๋ถ์ ์ ์ฅ๋ ์ผ๋ จ์ SQL ๋ช ๋ น๋ฌธ๋ค์ ํ๋์ ํจ์์ฒ๋ผ ์คํํ๊ธฐ ์ํ ์ฟผ๋ฆฌ์ ์งํฉ
- ์ฟผ๋ฆฌ๋ฌธ๋ค์ ์งํฉ์ผ๋ก, ์ด๋ค ๋์์ ์ฌ๋ฌ ์ฟผ๋ฆฌ๋ฅผ ๊ฑฐ์ณ์ ์ผ๊ด์ ์ผ๋ก ์ฒ๋ฆฌํ ๋ ์ฌ์ฉ
- ์ฌ๋ฌ ์ฟผ๋ฆฌ๋ฅผ ํ ๋ฒ์ ์ํํ๋ ๊ฒ. ๋ง์น SQL๋ฌธ๋ฒ์ ํจ์์ ์ ์ฌํ ๋๋
์ฌ๋ฌ ๋ธ๋ก๊ทธ์์ ์ฐพ์๋ณด๋ ๋น์ทํ ์ค๋ช
๋ค์ด๋ค.
์ ์ฅํ๋ก์์ ๋ '์ฌ๋ฌ ์ฟผ๋ฆฌ๋ฅผ ํ๋์ ํจ์์ฒ๋ผ ์คํํ๊ธฐ ์ํ ์ฟผ๋ฆฌ์ ์งํฉ'์ด๋ผ๊ณ ์ค๋ช
ํ๊ณ ์๋ค.
๊ทธ๋ ๋ค๋ฉด ์ฟผ๋ฆฌ๋ค์ด ํจ์์ฒ๋ผ ์คํ๋๋ค๋ ์๋ฏธ๋ ๋ฌด์์ผ๊น? ์๋ฏธ๋ฅผ ์๊ธฐ ์ํด SQL์ ํจ์๊ฐ ๋ฌด์์ธ์ง๋ถํฐ ์์๋ณด์.
SQL์ ํจ์๋?
์ฐ๋ฆฌ๊ฐ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์ ์ฌ์ฉํ๋ ๊ฒ๊ณผ ๋น์ทํ๋ค.
์๋ฐ์์ ๋ฌธ์์ด์ ๊ธธ์ด๋ฅผ ์๊ณ ์ถ์ ๋. lengh๋ฅผ ์ฌ์ฉํด์ ๊ธธ์ด๋ฅผ ์ฐพ์๋ด๊ณ ๋ ๋ฌธ์์ด์ ํฌํจ์ด ๋๋ ๋ฌธ์๋ฅผ ์ฐพ๊ณ ์ถ์ ๋
indexOf๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ฒ๋ผ ๊ฐ์ ๋ฃ์ผ๋ฉด ๋ฆฌํด๊ฐ์ด ์๋ ์ด๋ฐ ๊ฒ ํจ์์๋ค.
๋ง์ฐฌ๊ฐ์ง๋ก SQL์ ํจ์ ๋ํ ๊ฐ์ ์๋ฏธ์ด๋ค.
๋ค์ ์์ ๋งํ๋ฏ์ด ์ฟผ๋ฆฌ๋ค์ด ํจ์์ฒ๋ผ ์คํ๋๋ค
๋ ์๋ฏธ์์
๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฌ์ฉ์๊ฐ ์ํ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒ = ์ฟผ๋ฆฌ,
์ฟผ๋ฆฌ๋ค์ด ํจ์์ฒ๋ผ ์คํ๋๋ค. ์ฆ, ์ฌ๋ฌ ์ง์์ด๊ฐ ํ ๋ฒ์ ์คํ์ผ๋ก ๋ฆฌํด๊ฐ์ ์ป๋๋ค๋ผ๊ณ ํ ์ ์๋ค.
๊ทธ๋ ๋ค๋ฉด ํจ์๋ ๋ฆฌํด๊ฐ์ด ํ๋๋ง ์๋๋ฐ
์ ์ฅ ํ๋ก์์ ๋ ์ฌ๋ฌ ์ฟผ๋ฆฌ๋ฅผ ํ ๋ฒ์ ์คํํ๋ฉด ์ฌ๋ฌ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ๋๋ค๊ณ ํ๋๋ฐ ์ด๋ป๊ฒ ๋์ํ๋ ๊ฑธ๊น?
์๋์ ํ๋ก์์ ์์๋ฅผ ๋ณด๋ฉด์ ์์๋ณด์
DELIMITER @@
CREATE PROCEDURE 'TEST_PROC' (
-- ํ๋ผ๋ฏธํฐ ์ ์ธ
PARAM_NAME VARCHAR(20),
PARAM_AGE INT
)
BEGIN
-- ๋ณ์ ์ ์ธ
DECLARE PARAM_NUM INTEGER;
-- ์ฟผ๋ฆฌ๋ฌธ 1
SELECT COUNT(*) + 1
INTO PARAM_NUM
FROM table1;
-- ์ฟผ๋ฆฌ๋ฌธ 2
INSERT INTO table1(total_count, user_name, user_age) VALUES(PARAM_NUM, PARAM_NAME, PARAM_AGE);
END @@
DELIMITER ;
ํ๋ผ๋ฏธํฐ ์ ์ธ์ ํ๋ก์์ ๋ช
() ์์์ ์ ์ธํ๊ณ SQL๋ฌธ๊ณผ ๋ณ์ ์ ์ธ์ BEGIN ~ END ์ฌ์ด์ ์์ฑํ๋ค.
๊ทธ๋ฆฌ๊ณ SELECT ์ฌ์ฉ ์์๋ ์กฐํํ ์นผ๋ผ(๋ฐ์ดํฐ)์ ๋ฐ๋์ INTO๋ก ๋ณ์ ์์ ๋ฃ์ด์ค์ผ ํ๋ฉฐ,
ํ๋ก์์ ๋ด๋ถ์์ ์ฌ์ฉํ๋ SQL๋ฌธ์ ์ผ๋ฐ SQL๋ฌธ์ด๊ธฐ ๋๋ฌธ์ ์ธ๋ฏธ์ฝ๋ก (;)์ผ๋ก ๋ฌธ์ฅ์ ๋๋งบ์ด์ผ ํ๋ค.
์ฒซ ๋ฒ์งธ์ ๋ง์ง๋ง ๋ผ์ธ์ DELIMITER
๋ ํ๋ก์์ ์์ฑ์ด ์๋ฃ๋์ง ์์๋๋ฐ ๊ตฌ๋ถ์(;)๋ก SQL๋ฌธ์ด ์คํ๋๋ ๊ฒ์ ๋ง๊ธฐ ์ํด ์ ์ ๋ค๋ฅธ ๋ฌธ์๋ก ๋ฐ๊พผ ๊ฒ์ด๋ค. ๊ทธ๋ฆฌ๊ณ ํ๋ก์์ ์์ฑ์ด ๋๋๋ฉด ๋ค์ ๊ตฌ๋ถ์๋ฅผ ์๋๋๋ก ๋๋๋ฆฐ๋ค.
CALL TEST_PROC('ํ
์คํธ',21);
์ด๋ ๊ฒ ํธ์ถํ์ฌ ํจ์์ฒ๋ผ ์ฝ๊ฒ ์ฌ์ฉํ ์ ์๋ค.
ํ๋ก์์ ๋ฅผ ํธ์ถํ๋ฉด MySQL์ DataBase์นดํ๋ก๊ทธ์์ ํ๋ก์์ ์ด๋ฆ์ ์ฐพ์ SQL๋ฌธ์ ์ปดํ์ผํ๊ณ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ(Cache)์ ์ ์ฅํ ๋ค ํ๋ก์์ ๋ฅผ ์คํ์ํจ๋ค. ( DB์นดํ๋ก๊ทธ -> SQL์ปดํ์ผ -> ๋ฉ๋ชจ๋ฆฌ์ ์ฅ -> ์คํ )
DELIMITER @@
CREATE PROCEDURE 'TEST_PROC2' (
IN loopCount1 INT, --input : 10
IN loopCount2 INT, --input : 20
OUT rst1 INT,
OUT rst2 INT,
INOUT rst3 INT
)
BEGIN
DECLARE NUM1 INREGER DEFAULT 0; -- DEFAULT : ์ด๊ธฐ๊ฐ ์ค์
DECLARE NUM2 INTEGER DEFAULT 0;
DECLARE NUM3 INTEGER DEFAULT 0;
WHILE NUM1<loopCount1 DO -- NUM1์ 0~9๊น์ง 10๋ฒ๋ฐ๋ณต
WHILE NUM2<loopCount2 DO -- NUM2๋ 0~19๊น์ง 20๋ฒ๋ฐ๋ณต
SET NUM3 = NUM3 + 1;
SET NUM2 = NUM2 + 1;
END WHILE; -- NUM2๊ฐ 19๊ฐ ๋๋ฉด ๋์ด
SET rst1 = NUM1;
SET rst2 = NUM3;
SET rst3 = rst1 + rst2 + rst3
END @@
DELIMITER ;
ํ๋ผ๋ฏธํฐ์ IN, OUT์ ์ฌ์ฉํ๊ณ ํ๋ก์์ ๋ด๋ถ์์ ๋ฐ๋ณต๋ฌธ๋ ์ฌ์ฉํ๋ค.
๐IN?
- ํ๋ก์์ ์ ๊ฐ์ ์ ๋ฌ
- ํ๋ก์์ ๋ด๋ถ์์ ๊ฐ์ ์์ ํ ์๋ ์์ง๋ง ํ๋ก์์ ๊ฐ ๋ฐํ๋๊ณ ๋์ ํธ์ถ์๊ฐ ์์ ์ ๋ถ๊ฐ๋ฅ. ์ฆ, ์๋ณธ ๊ฐ์ ํ๋ก์์ ๊ฐ ๋๋ ํ์๋ ์ ์ง๋๋ฉฐ, ํ๋ก์์ ๋ IN ํ๋ผ๋ฏธํฐ์ ๋ณต์ฌ๋ณธ์ ์ฌ์ฉํ๋ค.
๐OUT?
- ํ๋ก์์ ์ ๊ฐ์ ํธ์ถ์์๊ฒ ๋ค์ Return ํ๋ค. ์ด๊ธฐ๊ฐ์ ํ๋ก์์ ๋ด์์ NULL์ด๋ฉฐ ํ๋ก์์ ๊ฐ ๋ฐํ๋ ๋ ์๋ก์ด ๊ฐ์ด ํธ์ถ์์๊ฒ Return ๋๊ณ ํ๋ก๊ทธ๋จ์ด ์์๋ ๋, OUT ํ๋ผ๋ฏธํฐ์ ์ด๊ธฐ๊ฐ์ ์ ๊ทผํ ์ ์๋ค.
๐INOUT?
- ํธ์ถ์์ ์ํด ํ๋์ ๋ณ์๊ฐ ์ด๊ธฐํ๋๊ณ ํ๋ก์์ ์ ์ํด ์์ ๋๋ค. ๊ฐ๋จํ๊ฒ IN+OUT์ด๋ผ๊ณ ์๊ฐํ๋ฉด ๋ ๊ฒ ๊ฐ๋ค. ํ๋ก์์ ๊ฐ Return ๋ ๋ ํ๋ก์์ ๊ฐ ๋ณ๊ฒฝํ ์ฌํญ์ ํธ์ถ์์๊ฒ Return ๋๋ค.
-- ๋ณ์ ์ด๊ธฐํ
DECLARE @NUM1 = 0;
DECLARE @NUM2 = 0;
DECLARE @NUM3 = 0;
-- NUM3์ ๊ฐ 30 ํ ๋น(@๋ ์ ์ญ๋ณ์, ํ๋ก์์ ๊ฐ ๋๋๋ ๊ณ์ ์ ์ง๋๋ ๊ฐ)
SET @NUM3 = 30;
-- (10(IN), 20(IN), Return๋ฐ์ ๋ณ์(OUT), Return๋ฐ์ ๋ณ์(OUT), Return๋ ๋ฐ๊ณ ๊ฐ๋ ๊ฐ์ง๊ณ ์๋ ๋ณ์(INOUT))
CALL TEST_PROC2(10, 20M, @NUM1, @NUM2, @NUM3);
SELECT @NUM1, @NUM2, @NUM3;
-- RESULT => @NUM1 : 10, @NUM2 : 200, @NUM3 : 240
์ถ๊ฐ๋ก ํ๋ผ๋ฏธํฐ๋ ํญ์ ํ์๋ ์๋๋ค.
๊ทธ๋ ๋ค๋ฉด ์ผ๋ฐ ์ฟผ๋ฆฌ๋ฌธ๊ณผ ์๋ํ๋ ๋ฐฉ์์๋ ์ด๋ค ์ฐจ์ด๊ฐ ์์๊น?
์ผ๋ฐ ์ฟผ๋ฆฌ๋ฌธ์ `ํ์ฑ -> ์ต์ ํ -> ์ปดํ์ผ ๋ฐ ์คํ๊ณํ ๋ฑ๋ก(์คํ๊ณํ ๊ฒฐ๊ณผ๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ๋ฑ๋ก) -> ์คํ`ํ๋ ๊ณผ์ ์ ๋ง์ ์ ์ฐจ๋ฅผ ๊ฑฐ์น๋ค.
์ต์ ํ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํ์ผ๋ก ์ปดํ์ผ ๋ฐ ์คํ ๊ณํ ๋ฑ๋ก ๋จ๊ณ์์ ์คํ๊ณํ ๊ฒฐ๊ณผ๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ๋ฑ๋กํ๋ค.
์ ์ฅํ๋ก์์ ๋ `๊ตฌ๋ฌธ๋ถ์ -> ์ง์ฐ๋ ์ด๋ฆ ํ์ธ-> ์์ฑ๊ถํ ํ์ธ-> ์์คํ ํ ์ด๋ธ`์ ๋ฑ๋ก
ํ๋์ฉ ์ค๋ช ํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
๊ตฌ๋ฌธ ๋ถ์
: ๊ตฌ๋ฌธ์ ์ค๋ฅํ์
์ง์ฐ๋ ์ด๋ฆ ํ์ธ
: ์ ์ฅ ํ๋ก์์ ๋ฅผ ์ ํ๋ ์์ ์์ ํด๋น ๊ฐ์ฒด๊ฐ ์กด์ฌํ์ง ์์๋ ์๊ด์๋ค. ํ๋ก์์ ์คํ ๋น์์ ํ
์ด๋ธ ์กด์ฌ ์ฌ๋ถ ํ์ธํ๋ค.(๊ฐ์ฒด์ด๋ฆ ํ์ธ)
์์ฑ๊ถํ
: ํ์ฌ ์ฌ์ฉ์๊ฐ ์ ์ฅ ํ๋ก์์ ๋ฅผ ์์ฑํ ๊ถํ์ด ์๋์ง ํ์ธ
์์คํ
ํ
์ด๋ธ ๋ฑ๋ก
: ์ ์ฅ ํ๋ก์์ ์ ์ด๋ฆ ๋ฐ ์ฝ๋๊ฐ ์์คํ
ํ
์ด๋ธ์ ๋ฑ๋ก
๋ฐฉ์์ ๋ง์ ์ฐจ์ด๊ฐ ์์ด ๋ณด์ด์ง๋ง ์ฐจ์ด๋ ๋ถ๋ช ํ ์๋ค. ๋ฐ๋ก ์คํ ํ์์ด๋ค. ์ ์ฅํ๋ก์์ ๋ ๋ ๋ฒ์งธ ์คํ๋ถํฐ๋ ๋ฉ๋ชจ๋ฆฌ์ ์๋ ๊ฒ์ ๊ทธ๋๋ก ๊ฐ์ ธ์ ์ฌ์ฌ์ฉํ๊ฒ ๋์ด ์ํ์๊ฐ์ ๋ง์ด ๋จ์ถํ๋ค.
๐์ ์ฅํ๋ก์์ ์ฅ์
- SQL Server์ ์ฑ๋ฅ์ ํฅ์ํ ์ ์๋ค.
- ์ ์ฅํ๋ก์์ ์ ๋ ๋ฒ์งธ ์คํ๋ถํฐ๋ ์บ๋ฆฌ(๋ฉ๋ชจ๋ฆฌ)์ ์๋ ๊ฒ์ ๊ฐ์ ธ์์ ์ฌ์ฉํ๋ฏ๋ก ์๋๊ฐ ๋นจ๋ผ์ง๋ค. ๋ํ, ์ฌ๋ฌ ๊ฐ์ ์ฟผ๋ฆฌ๋ฅผ ํ ๋ฒ์ ์คํํ ์ ์๋ค.
- ์ ์ง๋ณด์ ๋ฐ ์ฌํ์ฉ ์ธก๋ฉด์์ ์ข๋ค.
- ๋ณด์์ ๊ฐํํ ์ ์๋ค.
- ๋คํธ์ํฌ ๋ถํ๋ฅผ ์ค์ผ ์ ์๋ค.
๐์ ์ฅํ๋ก์์ ๋จ์
- DB ํ์ฅ์ด ์ด๋ ต๋ค
- ๋ฐ์ดํฐ ๋ถ์์ด ์ด๋ ต๋ค
- ๋ฎ์ ์ฒ๋ฆฌ ์ฑ๋ฅ
- ๋ฌธ์ ์ซ์์ด ์ฐ์ฐ์ ์ ์ฅํ๋ก์์ ๋ฅผ ์ฌ์ฉํ๋ฉด ์คํ๋ ค c, java๋ณด๋ค ๋๋ฆฐ ์ฑ๋ฅ์ ๋ณด์ผ ์ ์๋ค.
์ถ์ฒ
- https://velog.io/@sweet_sumin/%EC%A0%80%EC%9E%A5-%ED%94%84%EB%A1%9C%EC%8B%9C%EC%A0%80-Stored-Procedure
- https://spiderwebcoding.tistory.com/7
'๐์คํฐ๋ > ๋ฐ์ดํฐ๋ฒ ์ด์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐ์ดํฐ๋ฒ ์ด์ค] - ํธ๋ฆฌ๊ฑฐ (0) | 2024.03.27 |
---|---|
[๋ฐ์ดํฐ ๋ฒ ์ด์ค] - Key (0) | 2024.03.27 |
[๋ฐ์ดํฐ ๋ฒ ์ด์ค] - ์ ๊ทํ (0) | 2024.03.27 |