Bibi's DevLog ๐ค๐
[Codesquad] ์์ ์ ๋ฆฌ - ์คํ ์ด๋ ํ๋ก์์ stored procedure ๋ณธ๋ฌธ
[Codesquad] ์์ ์ ๋ฆฌ - ์คํ ์ด๋ ํ๋ก์์ stored procedure
๋น๋น bibi 2021. 6. 2. 23:49์์ ์ ๋ฆฌ - ์คํ ์ด๋ ํ๋ก์์ stored procedure
๋ชจ๋ฅด๋ฉด ์ด์ํ์ง๋ง ๊ตณ์ด ๊ณต๋ถํ ํ์๋ ์๋..?.. ํ์ง๋ง ์ค์ํ..!!..
sql ๋ช ๋ น์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ์ธ์ (declarative) (what) ๋ช ๋ น์ด๋ค.
DB์์ '์ ์ฐจ์ ๋ช ๋ น(imperative) (how)'์ ์ํํ๊ธฐ ์ํด์๋ ์คํ ์ด๋ ํ๋ก๊ทธ๋จ์ ์ฌ์ฉํด์ผ ํ๋ค.
์คํ ์ด๋ ํ๋ก๊ทธ๋จ
- DB์ ์ ์ฅ๋ ํ๋ก๊ทธ๋จ
- ํ ๋ง๋๋ก DB์ ํ๋ก๊ทธ๋จ์ ์ ์ฅํด ์ฌ์ฉํ๋ ๊ฒ
์คํ ์ด๋ ํ๋ก์์ ๋ DB์ ์ ์ฅ๋๊ธฐ ๋๋ฌธ์ MySQL ์ข ๋ฃ ํ ๋ค์ ์คํํด๋ ๋จ์ ์๋ค.
์คํ ์ด๋ ํ๋ก๊ทธ๋จ์ ์ข ๋ฅ
- ์คํ ์ด๋ ํจ์
- ์คํ ์ด๋ ํ๋ก์์ ธ
- ํธ๋ฆฌ๊ฑฐ
- ์ด๋ฒคํธ ํธ๋ค๋ฌ
์คํ ์ด๋ ํ๋ก๊ทธ๋จ์ ์ฅ์
- ์์ฉํ๋ก๊ทธ๋จ์ ์ฑ๋ฅ ํฅ์
- ๋คํธ์ํฌ ํธ๋ํฝ ๊ฐ์
- ์ฌ๋ฌ ๋ฒ ์ฟผ๋ฆฌ ๋ ๋ ค์ผ ํ๋ ๊ฑธ ํ ๋ฒ์ผ๋ก ์ค์ผ ์ ์์
- DB์์ ์ต์ข ๊ฒฐ๊ณผ๋ฌผ๊น์ง ๋ง๋ค์ด ๊ทธ๊ฒ๋ง ๋ณด๋ด์ฃผ๊ธฐ ๋๋ฌธ
- ๋ณด์์ฑ ํฅ์
- ๊ฐ๋ฐ ์ ๋ฌด์ ๊ตฌ๋ถ - ์คํ ์ด๋ ํ๋ก๊ทธ๋จ์ DBA๊ฐ ์ง ๋ค
์คํ ์ด๋ ํ๋ก๊ทธ๋จ์ ๋จ์
- ์ ์ง๋ณด์๊ฐ ๋งค์ฐ ์ด๋ ต๋ค
- ์ฝ๋๊ฐ DB์ ๋ค์ด์๊ธฐ ๋๋ฌธ
- ๋ฌธ์ ๊ฐ ์๊ฒผ์ ๋ rollback์ ํ๊ธฐ ์ด๋ ต๋ค
- git์์ ๊ด๋ฆฌ๊ฐ ์ฝ์ง์๋ค
- DBA๊ฐ ๊น์ ์ฌ์ฉํ์ง ์๊ธฐ ๋๋ฌธ
- ๋ช ๋ น ์์ฒด์ ์ฑ๋ฅ ๊ฐ์ (์๋ฐ๋ณด๋ค ๋๋ฆผ)
์คํ ์ด๋ ํ๋ก๊ทธ๋จ ์ฌ์ฉํ๋ ๊ณณ
- ๊ฒ์ ๋ถ์ผ์์ ๋ง์ด ์ฌ์ฉ.
- ์น๋ถ์ผ๋ ์ผ๋ฐ์ผ์ง๋ง ์ฌ์ฉ์จ ๊ฐ์ ์ค
stored function vs stored procedure
ํจ์๋ ์ฟผ๋ฆฌ ๋ด์ ์ฌ์ฉํ ์ ์์. ๋์ ์ ์ฝ์ฌํญ์ด ๋ง์.
ํ๋ก์์ ธ๋ ์ฟผ๋ฆฌ ๋ด์์ ์ฌ์ฉํ ์ ์์
์ฐ๋ฆฌ๋ ํ๋ก์์ ๋ง ๋ค๋ฃฌ๋ค.
Hello World ์ฐ๊ธฐ
DROP PROCEDURE IF EXISTS SP_HELLO;
DELIMITER $$
CREATE PROCEDURE SP_HELLO()
BEGIN
DECLARE STR CHAR(20) DEFAULT 'POPI';
SET STR = 'HELLO, WORLD';
SELECT STR;
END $$
DELIMITER ;
CALL SP_HELLO();
SP_...
: ๊ดํ. ์คํ ์ด๋ ํ๋ก์์ ์ด๋ฆ ์์ ๋ถ์DELIMITER $$
: ๊ตฌ๋ถ์. ๊ตฌ๋ฌธ ๋๋ด๋ ๋ฌธ์ฅ์ ์ฌ์ฉ์๊ฐ ์ง์ ํ ์ ์์. (;
๋์ )END $$
๊น์ง$$
๋ฅผ ๋ธ๋ฆฌ๋ฏธํฐ๋ก ์ฌ์ฉํจ
DECLARE STR
: STR์ด๋ผ๋ ์ด๋ฆ์ ๋ณ์๋ฅผ ์ ์ธํจ.- DB์์๋ ๋ฌธ์์ด์ ์๋ฐ์ดํ๊ฐ ์๋ ํ๋ฐ์ดํ
'
๋ก ๊ฐ์ธ์ผ ํ๋ค!
- DB์์๋ ๋ฌธ์์ด์ ์๋ฐ์ดํ๊ฐ ์๋ ํ๋ฐ์ดํ
๊ธฐ๋ณธ ๋ณ์ ์ฌ์ฉํ๊ธฐ
๊ธฐ๋ณธ ๋ณ์ ์ ์ธ : DECLARE ๋ณ์๋ช
ํ์
[DEFAULT ๊ธฐ๋ณธ๊ฐ]
([]
๋ด์ ๊ฐ์ ์ต์
์ด๋ค)
- ๊ธฐ๋ณธ ๋ณ์๋ ํ๋ก์์ ธ ๋ด์์๋ง ์ ํจํจ!
์ธ์ ๋ณ์ ์ ์ธ ๋ฐ ์ฌ์ฉ
SET @๋ณ์๋ช
= ๊ฐ;
์ธ์ ๋ณ์๋ ๋ง ๊ทธ๋๋ก ์ธ์ ๋ด์์ ๊ณ์ ์ ํจํจ.
SET @VAR_TEST = 10;
SELECT @VAR_TEST;
๊ธฐ๋ณธ ๋ณ์์ ๊ฐ ๋ฃ๊ธฐ
SET ์ฌ์ฉ
SET A = 10;
DROP PROCEDURE IF EXISTS SP_TEST1;
DELIMITER $$
CREATE PROCEDURE SP_TEST1()
BEGIN
DECLARE A INT;
SET A = 10;
SET A = A * 2;
SELECT A;
END $$
DELIMITER ;
CALL SP_TEST1();
SELECT INTO ์ฌ์ฉ
์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๋ฅผ ๋ณ์์ ๋ฃ์ ์ ์์.
๋จ, ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๊ฐ์ด ์ค์นผ๋ผ ๊ฐ์ด ๊ฒฝ์ฐ๋ง ๊ฐ๋ฅ
DB์์ ์ค์นผ๋ผ = ๋จ์ผ๊ฐ์ ๋ปํจ. (ํ ์ด๋ธ ์ด ํ๋๊ฐ ์๋, '๊ฐ' ํ๋)
DROP PROCEDURE IF EXISTS SP_TEST2;
DELIMITER $$
CREATE PROCEDURE SP_TEST2()
BEGIN
DECLARE A ING;
SELECT COUNT(UID) INTO A FROM USER_INFO;
SELECT A;
END $$
DELIMITER ;
CALL SP_TEST2();
๊ฒฐ๊ณผ๊ฐ์ ํ ์ด๋ธ์ ๋ฃ๊ธฐ
CREATE TABLE TEST3(NUM INT);
INSERT INTO TEST3 VALUES (1);
DROP PROCEDURE IF EXISTS SP_TEST3;
DELIMITER $$
CREATE PROCEDURE SP_TEST3()
BEGIN
DECLARE A INT DEFAULT 1;
SELECT MAX(NUM) INTO A FROM TEST3;
SET A = A + 1;
INSERT INTO TEST3 VALUES(A);
SELECT * FROM TEST3;
END $$
DELIMITER ;
CALL SP_TEST3();
CALL SP_TEST3();
CALL SP_TEST3();
SELECT * FROM TEST3;
TEST3 ํ ์ด๋ธ์๋ 1,2,3,4,5๊ฐ ๋ค์ด๊ฐ๊ฒ ๋๋ค.
๋งค๊ฐ๋ณ์ ์ฌ์ฉํ๊ธฐ (IN, OUT)
IN ๋งค๊ฐ๋ณ์๋ช
.์ ๋ ฅ์ ์ฌ์ฉ
DROP TABLE IF EXISTS TEST4; CREATE TABLE TEST4 ( ID INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(20) ); INSERT INTO TEST4 VALUES (NULL, 'AA'); INSERT INTO TEST4 VALUES (NULL, 'BB'); INSERT INTO TEST4 VALUES (NULL, 'CC'); INSERT INTO TEST4 VALUES (NULL, 'DD'); DROP PROCEDURE IF EXISTS SP_TEST4; DELIMITER $$ CREATE PROCEDURE SP_TEST4(IN pname varchar(10) ) BEGIN DECLARE A INT DEFAULT 1; SELECT * FROM TEST4 WHERE NAME = pname; END $$ DELIMITER ; CALL SP_TEST4('DD');
๊ฒฐ๊ณผ๋ก ID๊ฐ 4, NAME์ด
DD
์ธ ๋ฐ์ดํฐ๊ฐ ์กฐํ๋๋ค.
OUT ๋งค๊ฐ๋ณ์๋ช
์ถ๋ ฅ์ ์ฌ์ฉ
(์๋ฐ์
return
๊ณผ ๋น์ทํ ์ฉ๋)DROP PROCEDURE IF EXISTS SP_TEST5; DELIMITER $$ CREATE PROCEDURE SP_TEST5(IN pname varchar(10), OUT pid int) BEGIN DECLARE A INT DEFAULT 1; SELECT id into pid FROM TEST4 WHERE NAME = pname; END $$ DELIMITER ; CALL SP_TEST5('DD', @var_ret); SELECT @VAR_RET;
INOUT ๋งค๊ฐ๋ณ์๋ช
- ์ ๋ ฅ, ์ถ๋ ฅ์ ๋์์ ์ฌ์ฉํ ๋ณ์
IF ์ฌ์ฉํ๊ธฐ
END IF;
๋ก ๋๋๋ค๋ ์ ์ ์ฃผ์ํด์ผ.
IF if_expression THEN commands
[ELSEIF elseif_expression THEN commands]
[ELSE commands]
END IF;
DROP TABLE IF EXISTS TEST6;
CREATE TABLE TEST6(NUM INT);
DROP PROCEDURE IF EXISTS SP_TEST6;
DELIMITER $$
CREATE PROCEDURE SP_TEST6(OUT RET INT)
BEGIN
DECLARE A INT DEFAULT 1;
SELECT MAX(NUM) INTO A FROM TEST6;
IF A IS NULL THEN
SET A = 1;
ELSE
SET A = A + 1;
END IF;
INSERT INTO TEST6 VALUES (A);
SET RET = A;
END $$
DELIMITER ;
CALL SP_TEST6(@i);
SELECT @i;
CALL SP_TEST6(@i);
SELECT @i;
CALL SP_TEST6(@i);
SELECT @i;
@i
์ ์ต์ข
๊ฒฐ๊ณผ๊ฐ : 3
DB์์์ NULL์ '๊ฐ์ ์ ๋ชจ๋ฅด๊ฒ ๋ค'๋ ์๋ฏธ์ ๊ฐ๊น๋ค.
NULL + 1 = NULL
WHILE ์ฌ์ฉํ๊ธฐ
์ญ์ END WHILE;
๋ก ๋๋๋ค๋ ๊ฒ์ ์กฐ์ฌํด์ผ.
WHILE expression DO
Statements
END WHILE
๊ธฐํ
์ด ์ธ์ CASE (switch case์ ๊ฐ์ ์ฉ๋), REPEAT_UNTIL(do while๊ณผ ๊ฐ์ ์ฉ๋)๋ ์๋ค.
์ค์ต1 - DB๋ก ๋ณ ์ฐ๊ธฐ
DROP TABLE IF EXISTS STAR;
CREATE TABLE STAR (LNO INT, LINE VARCHAR(64));
DROP PROCEDURE IF EXISTS SP_STAR;
DELIMITER $$
CREATE PROCEDURE SP_STAR(IN LNO INT)
BEGIN
DECLARE S VARCHAR(64) DEFAULT '*';
DECLARE I INT DEFAULT 1;
DELETE FROM STAR WHERE LNO >= 1;
WHILE I <= LNO DO // WHILE๋ฌธ
INSERT INTO STAR VALUES(I, S);
SET S = CONCAT(S, '*');
SET I = I + 1;
END WHILE;
SELECT * FROM STAR;
END $$
DELIMITER ;
CONCAT(a, b);
: ๋ด์ฅํจ์. ๋ ๋ฌธ์์ด์ ํฉ์น๋ ํจ์โ
DECLARE
๊ฐ ์๋ค๋ฉด ๋ฐ๋์ ๊ทธ ๊ตฌ๋ฌธ์ ๋งจ ์์ ์์ด์ผ ํ๋ค.
'๐ฅ BE ๋ฐฑ์๋ > Database' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[MySQL] function does not exist ์ค๋ฅ ๋ฐ์ ์ ํด๊ฒฐ๋ฒ / ์ค๋ณต๋๋ ๋ ์ง๊ฐ ์๋๋ก ๋ ์ง ์กฐํํ๊ธฐ (0) | 2021.05.28 |
---|---|
[DB] ํค, ๊ธฐ๋ณธ ํค(Primary Key, PK)์ ์ธ๋ ํค(Foreign Key, FK) (0) | 2021.04.30 |
[DB] 1:1, 1:N, N:M ๊ด๊ณ (0) | 2021.04.30 |
[MySQL] CRUD - INSERT, SELECT, UPDATE, DELETE / JOIN (0) | 2021.01.28 |
[MySQL] ํ ์ด๋ธ ์์ฑํ๊ธฐ (0) | 2021.01.28 |