Tools/- SQL

[MySQL] 7์žฅ ์Šคํ† ์–ด๋“œ ํ•จ์ˆ˜ | ์ปค์„œ | ํŠธ๋ฆฌ๊ฑฐ

์Šค์œ„๋ฏผ 2024. 3. 10. 16:32

 

 ์Šคํ† ์–ด๋“œ ํ•จ์ˆ˜ 

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; -- ํ…Œ์ด๋ธ” ์ปฌ๋Ÿผ ํ™œ์šฉํ•ด์„œ ์ถœ๋ ฅ

 

 

๊ฒฐ๊ณผ)

 

 

 


 

 ์ปค์„œ 

์ฒซ ๋ฒˆ์งธ ํ–‰๋ถ€ํ„ฐ ๋งˆ์ง€๋ง‰ ํ–‰๊นŒ์ง€ ํ•œ ํ–‰์”ฉ ์ ‘๊ทผํ•ด์„œ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ

  1. ๋ณ€์ˆ˜ ์„ ์–ธ
  2. ์ปค์„œ ์„ ์–ธ
  3. ๋ฐ˜๋ณต ์กฐ๊ฑด ์„ ์–ธ
  4. ์ปค์„œ ์—ด๊ธฐ
  5. ์ปค์„œ ๋‹ซ๊ธฐ

 

์ปค์„œ๋Š” ๋ฌธ๋ฒ•์ด ๋ณต์žกํ•ด์„œ ์˜ˆ์ œ๋กœ ๋ฐ”๋กœ ์•Œ์•„๋ณด๋„๋ก ํ•˜์ž

 

์˜ˆ์ œ) ํšŒ์›์˜ ํ‰๊ท  ์ธ์› ์ˆ˜ ๊ตฌํ•˜๊ธฐ

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;

 

๊ฒฐ๊ณผ)

backup_singer ํ…Œ์ด๋ธ”