์คํ ์ด๋ ํจ์
MySQL์์ ์ ๊ณตํ๋ ํจ์ ์ธ์ ์ง์ ๋ง๋ค์ด์ ์ฌ์ฉํ๋ ํจ์
- ์ ๋ ฅ๋งค๊ฐ๋ณ์์ ๋ฐํ๊ฐ์ ๋ฐ๋ก ์ค์ ํ๋ค
์คํ ์ด๋ ํจ์ ๋ฌธ๋ฒ
DELIMITER $$
CREATE FUNCTION ํจ์_์ด๋ฆ ( ๋งค๊ฐ๋ณ์ )
RETURNS ๋ฐํํ์
BEGIN
ํ๋ก๊ทธ๋๋ฐ ์ฝ๋ฉ
RETURN ๋ฐํ๊ฐ;
END $$
DELIMITER ;
SELECT ํจ์_์ด๋ฆ();
์์ 1) ๊ณฑํ๊ธฐ
SET GLOBAL log_bin_trust_function_creators = 1; -- ์คํ ์ด๋ ํจ์ ์์ฑ ๊ถํ ํ์ฉ (ํ ๋ฒ๋ง ์ค์ ํด์ฃผ๋ฉด ๋๋ค)
USE market_db;
DROP FUNCTION IF EXISTS sumFunc;
DELIMITER $$
CREATE FUNCTION sumFunc(number1 INT, number2 INT)
RETURNS INT
BEGIN
RETURN number1 + number2;
END $$
DELIMITER ;
SELECT sumFunc(100, 200) AS 'ํฉ๊ณ';
์์ 2) ํ์ฌ ๋ ์ง์์ ๋ฐ๋ท ๋ ์ง๋ฅผ ๋นผ์ ํ๋ ํ์ ๊ตฌํ๊ธฐ
DROP FUNCTION IF EXISTS calcYearFunc;
DELIMITER $$
CREATE FUNCTION calcYearFunc(dYear INT)
RETURNS INT
BEGIN
DECLARE runYear INT; -- ํ๋๊ธฐ๊ฐ(์ฐ๋)
SET runYear = YEAR(CURDATE()) - dYear; -- CURDATE() : ํ์ฌ ๋ ์ง
RETURN runYear;
END $$
DELIMITER ;
SELECT calcYearFunc(2010) AS 'ํ๋ํ์';
SELECT calcYearFunc(2007) INTO @debut2007;
SELECT calcYearFunc(2013) INTO @debut2013;
SELECT @debut2007 - @debut2013 AS '2007๊ณผ 2013 ์ฐจ์ด';
SELECT mem_id, mem_name, calcYearFunc(YEAR(debut_date)) AS 'ํ๋ ํ์'
FROM member; -- ํ
์ด๋ธ ์ปฌ๋ผ ํ์ฉํด์ ์ถ๋ ฅ
๊ฒฐ๊ณผ)

์ปค์
์ฒซ ๋ฒ์งธ ํ๋ถํฐ ๋ง์ง๋ง ํ๊น์ง ํ ํ์ฉ ์ ๊ทผํด์ ์ฒ๋ฆฌํ๋ ๊ฒ
- ๋ณ์ ์ ์ธ
- ์ปค์ ์ ์ธ
- ๋ฐ๋ณต ์กฐ๊ฑด ์ ์ธ
- ์ปค์ ์ด๊ธฐ
- ์ปค์ ๋ซ๊ธฐ
์ปค์๋ ๋ฌธ๋ฒ์ด ๋ณต์กํด์ ์์ ๋ก ๋ฐ๋ก ์์๋ณด๋๋ก ํ์
์์ ) ํ์์ ํ๊ท ์ธ์ ์ ๊ตฌํ๊ธฐ
USE market_db;
DROP PROCEDURE IF EXISTS cursor_proc;
DELIMITER $$
CREATE PROCEDURE cursor_proc() -- ์ปค์๋ ํ๋ก์์ ์์ ๋ค์ด๊ฐ๋ ๊ฐ๋
์ด๋ค
BEGIN
-- 1. ๋ณ์ ์ ์ธ
DECLARE memNumber INT;
DECLARE cnt INT DEFAULT 0;
DECLARE totNumber INT DEFAULT 0;
DECLARE endOfRow BOOLEAN DEFAULT FALSE; -- ํ์ ๋ ์ฌ๋ถ (๊ธฐ๋ณธ FALSE)
-- 2. ์ปค์ ์ ์ธ
DECLARE memberCursor CURSOR FOR
SELECT mem_number FROM member;
-- 3. ๋ฐ๋ณต ์กฐ๊ฑด ์ ์ธํ๊ธฐ
DECLARE CONTINUE HANDLER
FOR NOT FOUND SET endOfRow = TRUE; -- ๋ฐ๋ณต์กฐ๊ฑด : ํ์ ๋์ด๋ฉด endOfRow๋ฅผ TRUE๋ก ๋ณํ
-- 4. ์ปค์ ์ด๊ธฐ
OPEN memberCursor;
cursor_loop : LOOP
FETCH memberCursor INTO memNumber; -- ํ ํ์ฉ ์ฝ์ด์ค๊ธฐ
IF endOfRow THEN
LEAVE cursor_loop; -- endOfRow๊ฐ TRUE๋ฉด loop ํ์ถ
END IF;
SET cnt = cnt + 1;
SET totNumber = totNumber + memNumber;
END LOOP cursor_loop;
SELECT (totNumber/cnt) AS 'ํ์์ ํ๊ท ์ธ์ ์';
-- 5. ์ปค์ ๋ซ๊ธฐ
CLOSE memberCursor;
END $$
DELIMITER ;
CALL cursor_proc();
๊ฒฐ๊ณผ)

ํธ๋ฆฌ๊ฑฐ
INSERT, UPDATE, DELETE ์์ ์ด ์ผ์ด๋ ๊ฒฝ์ฐ ํด๋น ๋ฐ์ดํฐ๊ฐ ์ญ์ ๋๊ธฐ ์ ์ ๋ค๋ฅธ ๊ณณ์ ์๋์ผ๋ก ์ ์ฅํด์ฃผ๋ ๊ธฐ๋ฅ
์์ 1) ๋ฐ์ดํฐ ์ญ์ ์ ๋ฉ์ธ์ง ๋ํ๋ด๊ธฐ
# ํธ๋ฆฌ๊ฑฐ ์ฝ๋
DROP TRIGGER IF EXISTS myTrigger;
DELIMITER $$
CREATE TRIGGER myTrigger -- ํธ๋ฆฌ๊ฑฐ ์ด๋ฆ
AFTER DELETE -- ์ญ์ ํ์ ์๋ํ๋๋ก ์ง์ (Delete trigger)
ON trigger_table -- ํธ๋ฆฌ๊ฑฐ๋ฅผ ๋ถ์ฐฉํ ํ
์ด๋ธ
FOR EACH ROW -- ๊ฐ ํ๋ง๋ค ์ ์ฉ
BEGIN
SET @msg = '๊ฐ์ ๊ทธ๋ฃน์ด ์ญ์ ๋จ'; -- ํธ๋ฆฌ๊ฑฐ ์คํ ์ ์๋๋๋ ์ฝ๋
END $$
DELIMITER ;
# ์คํ ์ฝ๋
SET @msg = '';
INSERT INTO trigger_table VALUES(4, '๋ง๋ง๋ฌด');
SELECT @msg; -- ๊ฒฐ๊ณผ X
UPDATE trigger_table SET txt = '๋ธํ' WHERE id = 3;
SELECT @msg; -- ๊ฒฐ๊ณผ X
DELETE FROM trigger_table WHERE id = 4;
SELECT @msg;
-- ๊ฒฐ๊ณผ : '๊ฐ์๊ทธ๋ฃน์ด ์ญ์ ๋จ'
์์ 2) ๋ฐ์ดํฐ ์์ ์ ๋ค๋ฅธ ํ ์ด๋ธ์ ์ ์ฅ
DROP TABLE IF EXISTS backup_singer;
CREATE TABLE backup_singer -- ๋ฐ์ดํฐ ๋ฐฑ์
์ฉ ํ
์ด๋ธ ์์ฑ
( mem_id CHAR(8) NOT NULL,
mem_name VARCHAR(10) NOT NULL,
mem_number INT NOT NULL,
addr CHAR(2) NOT NULL,
modType CHAR(2), -- ๋ณ๊ฒฝ๋ ํ์
, '์์ ' ๋๋ '์ญ์ '
modDate DATE, -- ๋ณ๊ฒฝ๋ ๋ ์ง
modUser VARCHAR(30) -- ๋ณ๊ฒฝํ ์ฌ์ฉ์
);
DROP TRIGGER IF EXISTS singer_updateTrg;
DELIMITER $$
CREATE TRIGGER singer_updateTrg -- ํธ๋ฆฌ๊ฑฐ ์ด๋ฆ
AFTER UPDATE -- UPDATE ๋ฐ์ดํฐ๋ฅผ backup_singer ํ
์ด๋ธ์ ์ ์ฅ
ON singer
FOR EACH ROW
BEGIN
INSERT INTO backup_singer VALUES ( OLD.mem_id, OLD.mem_name, OLD.mem_number, OLD.addr,
'์์ ', CURDATE(), CURRENT_USER() ); -- OLD : ์์คํ
ํ
์ด๋ธ, ๋ฐ์ดํฐ ์์ /์ญ์ ๋๊ธฐ ์ ์ ์ ์ ๋จธ๋ฌด๋ ๊ณณ
END $$
DELIMITER ;
OLD๋?
- MySQL์ ์์คํ ํ ์ด๋ธ๋ก ๋ฐ์ดํฐ๋ค์ด ์์ /์ญ์ ๋๊ธฐ ์ ์ ์ ์ ๋จธ๋ฌด๋ ๊ณณ์ด๋ค.
์์ 3) ๋ฐ์ดํฐ ์ญ์ ์ ๋ค๋ฅธ ํ ์ด๋ธ์ ์ ์ฅ
DROP TRIGGER IF EXISTS singer_deleteTrg;
DELIMITER $$
CREATE TRIGGER singer_deleteTrg -- ํธ๋ฆฌ๊ฑฐ ์ด๋ฆ
AFTER DELETE -- ๋ฐ์ดํฐ DELETE ์ trigger ์คํ
ON singer
FOR EACH ROW
BEGIN
INSERT INTO backup_singer VALUES ( OLD.mem_id, OLD.mem_name, OLD.mem_number, OLD.addr,
'์ญ์ ', CURDATE(), CURRENT_USER() ); -- OLD : ์์คํ
ํ
์ด๋ธ, ์์ /์ญ์ ๋๊ธฐ ์ ์
END $$
DELIMITER ;
- modType (๋ณ๊ฒฝ๋ ํ์ )์ UPDATE๋ '์์ ', DELETE๋ '์ญ์ '๋ก ์ค์ ํ๋ค
ํธ๋ฆฌ๊ฑฐ ์คํ ์ฝ๋)
UPDATE singer SET addr = '์๊ตญ' WHERE mem_id = 'BLK';
DELETE FROM singer WHERE mem_number >= 6;
๊ฒฐ๊ณผ)
