1. Srored Procedure -> ์๋ฐ์ ๋ฉ์๋ ๊ธฐ๋ฅ๊ณผ ๊ฐ์ด ์์ฃผ ์ฌ์ฉ๋๋ ๊ธฐ๋ฅ์ ๋น ๋ฅด๊ฒ ์ฒ๋ฆฌํ๊ธฐ ์ํ ์ฉ๋๋ก ์ฌ์ฉ๋๋ค.
-> MariaDB์ ์ฑ๋ฅ์ด ํฅ์๋ ์ ์์
CALL userProc1('์กฐ๊ด์ฐ'); ์์ ๊ฐ์ด ํธ์ถํจ. (CALL ํ๋ก์์ _์ด๋ฆ())
2. Stored Function -> Maria DB์์ ๋ชจ๋ ํ์ํ ํจ์๋ฅผ ์ ๊ณตํด์ค ์๋ ์๊ธฐ์ ์ฌ์ฉ์๊ฐ ์ง์ ๋ง๋ค์ด์ ์ฌ์ฉํ๋ ํจ์
2.1 ์คํ ์ด๋ ํจ์์ ์คํ ์ด๋ ํ๋ก์์ ์ ์ฐจ์ด์ :
1. ์คํ ์ด๋ ํจ์๋ IN, OUT ๋ฑ์ ์ฌ์ฉํ ์ ์์
2.RETRUNS ๋ฌธ์ผ๋ก ๋ฐํํ ๊ฐ์ ๋ฐ์ดํฐ ํ์ ์ง์
3. Stored Procedure๋ CALL๋ก ํธ์ถํ๋ค.
3. ์ปค์๋ ? -> ํ ์ด๋ธ์์ ์ฌ๋ฌ ๊ฐ ํ์ ์ฟผ๋ฆฌํ ํ, ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ์ธ ํ์ ์งํฉ์ ํ ํ์ฉ ๋๋ฉด์ ์ฒ๋ฆฌํ๊ธฐ ์ํ ๋ฐฉ์์ด๋ค.
์ปค์๋ ์ ์ธ -> ๋ฐ๋ณต ์กฐ๊ฑด ์ ์ธ -> ์ปค์ ์ด๊ธฐ (OPEN) -> ์ปค์์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ธฐ (FETCH) -> ์ํ๋ ์์ -> ์ปค์ ๋ซ๊ธฐ (CLOSE) ์์ผ๋ก ์ฒ๋ฆฌ๊ฐ ๋๋ค.
1 2 3 4 5 6 7 8 9 10 | delimiter $$ CREATE PROCEDURE userPrco1(IN userName VARCHAR(10)) BEGIN SELECT * FROM usertbl WHERE NAME = '๋ฐ๋นํด'; END $$ delimiter ; CALL userPrco1('์กฐ๊ด์ฐ'); | cs |
ํ๋ก์์ ์ ๊ฐ๋จํ ์์ ์ด๋ค. delimiter $$๋ ;๋ก ๋๋๋ sql๋ฌธ์ ๊ท์น์ $$๋ก ๋๋๊ฒ ๋ฐ๊ฟ๋๋ ๊ฒ์ด๋ค. ํผ๋์ ํผํ๊ธฐ ์ํด ์ด์ ๊ฐ์ด ์ฌ์ฉํ๋ค. BEGIN๊ณผ END ์ฌ์ด์ ์คํํ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํด์ฃผ๋ฉด ๋๋ค. ๊ทธ๋ฆฌ๊ณ CALL userPrco1('์กฐ๊ด์ฐ');์ ๊ฐ์ด ํธ์ถํด์ฃผ๋ฉด ๋๋ค.
1 2 3 4 5 6 7 8 9 10 | delimiter $$ CREATE PROCEDURE userProc2(IN userBirth INT, IN userHeight INT) BEGIN SELECT * FROM usertbl WHERE birthyear > userBirth AND height > userHeight; END $$ delimiter ; CALL userProc2(1970,178); | cs |
๋งค๊ฐ๋ณ์๋ก ๋ค์ด๊ฐ IN์ ๋ป์ ์ธ๋ถ์์ ์ ๋ ฅ์ ๋ฐ๊ฒ ๋ค๋ ๋ป์ด๋ค. userBIrth๋ ๋ณ์์ด๋ฆ, INT๋ ์๋ฃํ์ด๋ค.
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 | delimiter $$ CREATE PROCEDURE whileProc() BEGIN DECLARE str VARCHAR(100); -- ๊ฒฐ๊ณผ ์ ์ฅํ ๋ณ์ DECLARE i INT ; -- ์์๋ฆฌ DECLARE k INT ; -- ๋ท์๋ฆฌ SET i = 2; while (i < 10) DO SET str = ''; -- ์ด๊ธฐํ' SET k = 1; -- ๋๋๋ฉด ๊ณ์ 1๋ก ์ด๊ธฐํ ํด์ผ ํ๊ธฐ ๋๋ฌธ์ while ๋ฌธ ์์ชฝ์ ์ค์ while(K < 10) DO SET str = CONCAT(str, ' ', i, 'x', k, '=', i*k); SET k = k +1; END while; SET i = i +1; INSERT INTO guguTBL VALUES(str); END while; END $$ delimiter ; CALL whileProc(); | cs |
ํ๋ก์์ ๋ฅผ ์ด์ฉํด ๊ตฌ๊ตฌ๋จ์ ๋ง๋ค์ด๋ณผ ์๋ ์๋ค.
1 2 | SHOW CREATE PROCEDURE sqldb.userProc3; | cs |
์ ์ฝ๋๋ก userProc3์ด๋ผ๋ ํ๋ก์์ ์ ์ํ๋ฅผ ๋ณผ ์๋ ์๋ค.
1 2 3 4 5 6 7 8 9 10 11 12 13 | CREATE FUNCTION userFunc(VALUE1 INT, VALUE2 INT) RETURNS INT BEGIN RETURN VALUE1 + VALUE2; END $$ delimiter ; SELECT userFunc(100,200); | cs |
Stored Function์ ๊ธฐ๋ณธ์ ์ธ ํํ์ด๋ค. Proceduer๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก 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 | delimiter $$ CREATE FUNCTION getAgeFunc(bYear INT) RETURNS INT BEGIN DECLARE age INT; SET age = YEAR(CURDATE()) - bYear; -- curdate -ํ์ฌ ๋ ์ง ์ถ๋ ฅ , year - ์ฐ๋๋ง ์ถ๋ ฅ RETURN age; END $$ delimiter ; SELECT getAgeFunc(1979); SELECT getAgeFunc(1979) INTO @age1979; SELECT getAgeFunc(1997) INTO @age1997; SELECT CONCAT('1997๊ณผ 1979์ ๋์ด์ฐจ -->', @age1979-@age1997; SELECT userID, NAME, getAgeFunc(birthYear) AS '๋ง ๋์ด' FROM usertbl; SHOW CREATE FUNCTION getAgeFunc; | cs |
Stored Function์ผ๋ก ๋์ด๋ฅผ ๊ณ์ฐํ ์ ์๋ ๊ฐ๋จํ ๊ธฐ๋ฅ๋ ๊ตฌํ์ ํด๋ณผ ์๊ฐ ์๋ค.
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 34 35 36 37 | -- ์ปค์ ์ฌ์ฉํ๊ธฐ delimiter $$ CREATE PROCEDURE cursorProc() BEGIN DECLARE userHeight INT; DECLARE cnt INT DEFAULT 0; -- ๊ณ ๊ฐ์ ์ธ์์ DECLARE totalHeight INT DEFAULT 0; -- ํค์ ์ดํฉ DECLARE endofRows BOOLEAN DEFAULT FALSE; DECLARE userCursor CURSOR FOR SELECT height FROM usertbl; DECLARE CONTINUE handler FOR NOT FOUND SET endofRows = TRUE; OPEN userCursor; cursor_loop:Loop fetch userCursor INTO userHeight; if endOfRows then leave cursor_loop; END if; SET cnt = cnt + 1; SET totalHeight = totalHeight + userHeight; END loop cursor_loop; CLOSE userCursor; END $$ delimiter ; | cs |
์ปค์๋ฅผ ์ฌ์ฉํด์ ๊ณ ๊ฐ์ ํ๊ท ํค๋ฅผ ๊ตฌํ ์ ์๋ procedure์ด๋ค.
DECLARE CONTINUE handler
FOR NOT FOUND SET endofRows = TRUE; ์ด ๋ถ๋ถ์ ์ปค์๊ฐ ๋ฐ์ดํฐ๋ฅผ ๋ค ๋์์ ๋ endofRows๋ฅผ true๋ก ๋ง๋ค์ด์ฃผ์ด ๋ฃจํ๋ฅผ ๋์ฌ ์ ์๊ฒ ํ๊ธฐ ์ํจ์ด๋ค.
์ ์ธ -> ๋ฐ๋ณต ์กฐ๊ฑด ์ ์ธ -> ์ปค์ ์ด๊ธฐ (OPEN) -> ์ปค์์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ธฐ (FETCH) -> ์ํ๋ ์์ -> ์ปค์ ๋ซ๊ธฐ (CLOSE) ์์ผ๋ก ์ฒ๋ฆฌ๊ฐ ๋๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | delimiter // CREATE TRIGGER backUserTbl_DeleteTrg AFTER DELETE ON userTbl FOR EACH ROW BEGIN INSERT INTO backup_userTBL VALUES(OLD.userid, OLD.name, OLD.birthyear, OLD.addr, OLD.mobile1, OLD.mobile2, OLD.height, OLD.mdate, '์ญ์ ', CURDATE(), CURRENT_USER()); END // delimiter ; | cs |
AFTER ~ ROW ๋ถ๋ถ์ ํธ๋ฆฌ๊ฑฐ์ ๋ฐ๋ ์กฐ๊ฑด์ด๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค . ๊ฐ๊ฐ์ ํ์ด ์ญ์ ๊ฐ ๋ ํ์ ํธ๋ฆฌ๊ฑฐ๊ฐ ๋ฐ๋ํ๋ ๊ฒ์ด๋ค. OLD. ~ ๋ถ๋ถ์ ์์ ์ ๋ฐ์ดํฐ๋ฅผ ๋งํ๋ ๊ฒ์ธ๋ฐ ๋ณ๊ฒฝ ์ ์, ์ฆ ์ด ํธ๋ฆฌ๊ฑฐ์์๋ ์ญ์ ์ ์ ๋ฐ์ดํฐ๋ฅผ ๋งํ๋ ๊ฒ์ด๋ค. ์ด ๋ฐ์ดํฐ๋ฅผ backup_userTBL๋ผ๋ ํ ์ด๋ธ์ ๋ฐฑ์ ์ ํด๋๋ ๊ฒ์ด๋ค. ํธ๋ฆฌ๊ฑฐ๋ ์ ๋ฐ์ดํธ, ์ญ์ , ์ฝ์ ๋ฑ์ DML ๋ฌธ์์๋ง ์ฌ์ฉ์ ํ ์ ์๋ค. ์ด ๋ถ๋ถ์์๋ DELETE๋ฅผ ์ฌ์ฉํด ์์๋ฅผ ๋ค์๋ค.
'MySQL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
ํ๋ก๊ทธ๋๋จธ์ค NULL ๊ฐ ์ฒ๋ฆฌํ๊ธฐ (0) | 2025.04.12 |
---|---|
Foreign KEY, VIEW (2) | 2024.08.06 |
DB ์ค์ต [1] { dbForge Studio for MySQL, Heidi SQL } (0) | 2024.07.31 |