Today
DROP TABLE TMP_tbl_member;
CREATE TEMPORARY TABLE TMP_tbl_member (
memberId VARCHAR(20) NULL,
NAME VARCHAR(20) NULL,
regDate DATETIME NULL DEFAULT NOW()
)
COLLATE = 'utf8mb4_general_ci'
ENGINE = INNODB
;
CREATE TEMPORARY TABLE TMP_tbl_member_test (
content TEXT NULL,
event_type VARCHAR(20) NULL,
insert_date DATETIME NULL DEFAULT NOW()
)
COLLATE = 'utf8mb4_general_ci'
ENGINE = INNODB
;
DELIMITER $$
CREATE TRIGGER TRG_member_temp_insert AFTER INSERT
ON tbl_member FOR EACH ROW
BEGIN
DECLARE con TEXT;
SET con = CONCAT(NEW.memberID, NEW.name);
INSERT INTO TMP_tbl_member_test(content, event_type)
VALUES (con, 'INSERT');
END;
$$
INSERT INTO tbl_member(memberId, NAME, pwd) VALUES ('testTrigger1', '테스트','1234');
INSERT INTO tbl_member(memberId, NAME, pwd) VALUES ('testTrigger2', '테스트2','1234');
SELECT * FROM TMP_tbl_member_test;
DELIMITER $$
CREATE TRIGGER TRG_member_temp_update AFTER UPDATE
ON tbl_member FOR EACH ROW
BEGIN
DECLARE old_con TEXT;
DECLARE new_con TEXT;
SET old_con = CONCAT(OLD.memberID, OLD.name);
INSERT INTO TMP_tbl_member_test(content, event_type)
VALUES (old_con, 'UPDATE_OLD');
SET new_con = CONCAT(NEW.memberID, NEW.name);
INSERT INTO TMP_tbl_member_test(content, event_type)
VALUES (new_con, 'UPDATE_NEW');
END;
$$
UPDATE tbl_member
SET memberId = 'testTrigger1_1'
, NAME = '트리거테스트1'
WHERE memberId = 'testTrigger1';
UPDATE tbl_member
SET memberId = 'testTrigger2_1'
, NAME = '트리거테스트2'
WHERE memberId = 'testTrigger2';
SELECT * FROM TMP_tbl_member_test;
DELIMITER $$
CREATE TRIGGER TRG_member_temp_delete AFTER DELETE
ON tbl_member FOR EACH ROW
BEGIN
DECLARE old_con TEXT;
SET old_con = CONCAT(OLD.memberID, OLD.name);
INSERT INTO TMP_tbl_member_test(content, event_type)
VALUES (old_con, 'DELETE');
END;
$$
DELIMITER ;
DELETE FROM tbl_member WHERE memberId = 'testTrigger2_1';
DELETE FROM tbl_member WHERE memberId = 'testTrigger1_1';
SELECT * FROM TMP_tbl_member_test;
DELIMITER $$
CREATE TRIGGER TRG_member_temp_insert_before BEFORE INSERT
ON tbl_member FOR EACH ROW
BEGIN
DECLARE con TEXT;
SET NEW.name = CONCAT('before',NEW.name);
SET con = CONCAT(NEW.memberID, NEW.name);
INSERT INTO TMP_tbl_member_test(content, event_type)
VALUES (con, 'BEFORE INSERT');
END;
$$
DELIMITER ;
INSERT INTO tbl_member(memberId, NAME, pwd) VALUES ('testTrigger1', '테스트','1234');
INSERT INTO tbl_member(memberId, NAME, pwd) VALUES ('testTrigger2', '테스트2','1234');
SELECT * FROM TMP_tbl_member_test;
DROP TRIGGER TRG_member_temp_insert;
DROP TRIGGER TRG_member_temp_update;
DROP TRIGGER TRG_member_temp_delete;
DROP TRIGGER TRG_member_temp_insert_before;
DELIMITER $$
CREATE TRIGGER TRG_tbl_member_insert_before
BEFORE INSERT ON tbl_member FOR EACH ROW
BEGIN
DECLARE con TEXT;
IF NEW.name IS NULL THEN
SIGNAL SQLSTATE '90000'
SET MESSAGE_TEXT = '이름 컬럼이 null 입니다.';
ELSE
SET con = CONCAT(NEW.memberID, NEW.name);
INSERT INTO TMP_tbl_member_test(content, event_type)
VALUES (con, 'BEFORE INSERT');
END IF;
END;
$$
delimiter ;
INSERT INTO tbl_member(memberId, NAME, pwd) VALUES ('testTrigger1', NULL,'1234');
SELECT * FROM TMP_tbl_member_test;
SELECT * FROM tbl_member;
DELETE FROM tbl_member WHERE memberId LIKE 'testTrigger%';
DELIMITER $$
BEGIN NOT ATOMIC
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
GET DIAGNOSTICS CONDITION 1
@sql_state = RETURNED_SQLSTATE
, @errno = mysql_errno
, @err_text = MESSAGE_TEXT;
SELECT @sql_state, @errno, @err_text;
END;
INSERT INTO tbl_member(memberId, NAME, pwd) VALUES ('testTrigger1', NULL,'1234');
END;
$$
DELIMITER ;
CREATE TABLE `tbl_member_log` (
`idx` INT NOT NULL AUTO_INCREMENT,
`memberId` VARCHAR(20) NOT NULL COMMENT '회원ID' COLLATE 'utf8mb4_general_ci',
`name` VARCHAR(20) NULL DEFAULT NULL COMMENT '이름' COLLATE 'utf8mb4_general_ci',
`pwd` VARCHAR(300) NOT NULL COMMENT '비밀번호' COLLATE 'utf8mb4_general_ci',
`jumin` VARCHAR(300) NULL DEFAULT NULL COMMENT '주민번호' COLLATE 'utf8mb4_general_ci',
`addr1` VARCHAR(100) NULL DEFAULT NULL COMMENT '주소1' COLLATE 'utf8mb4_general_ci',
`addr2` VARCHAR(100) NULL DEFAULT NULL COMMENT '주소2' COLLATE 'utf8mb4_general_ci',
`birthday` CHAR(10) NULL DEFAULT NULL COMMENT '생년월일(YYYY-MM-DD)' COLLATE 'utf8mb4_general_ci',
`jobCode` CHAR(2) NULL DEFAULT NULL COMMENT '직업코드' COLLATE 'utf8mb4_general_ci',
`mileage` DECIMAL(7,0) NULL DEFAULT '0' COMMENT '마일리지',
`memberState` CHAR(1) NULL DEFAULT 'N' COMMENT '회원상태' COLLATE 'utf8mb4_general_ci',
`regDate` DATETIME NOT NULL DEFAULT current_timestamp() COMMENT '등록일',
`leaveDate` DATETIME NULL DEFAULT NULL COMMENT '탈퇴일시',
`pwdChangeDate` DATETIME NULL DEFAULT NULL COMMENT '비밀번호 변경일',
`recommender` VARCHAR(20) NULL DEFAULT NULL COMMENT '추천인ID' COLLATE 'utf8mb4_general_ci',
`event_type` VARCHAR(20) NULL COMMENT '트리거이벤트' COLLATE 'utf8mb4_general_ci',
`logDate` DATETIME NULL DEFAULT NOW() COMMENT '로그등록일',
PRIMARY KEY (`idx`) USING BTREE
)
COMMENT='회원테이블'
COLLATE='utf8mb4_general_ci'
ENGINE=InnoDB
;
DELIMITER $$
CREATE OR REPLACE TRIGGER TRG_tbl_member_update
AFTER UPDATE ON tbl_member FOR EACH ROW
BEGIN
DECLARE old_con TEXT;
DECLARE new_con TEXT;
SET old_con = CONCAT(OLD.memberID, OLD.name);
INSERT INTO TMP_tbl_member_test(content, event_type)
VALUES (old_con, 'UPDATE_OLD');
SET new_con = CONCAT(NEW.memberID, NEW.name);
INSERT INTO TMP_tbl_member_test(content, event_type)
VALUES (new_con, 'UPDATE_NEW');
INSERT INTO tbl_member_log (memberId, NAME, pwd, addr1, addr2, birthday, jobCode, mileage, memberState, regDate, leaveDate, event_type)
VALUES (OLD.memberId, OLD.NAME, OLD.pwd, OLD.addr1, OLD.addr2, OLD.birthday, OLD.jobCode, OLD.mileage, OLD.memberState, OLD.regDate, OLD.leaveDate, 'UPDATE_OLD');
END;
$$
DELIMITER ;
INSERT INTO tbl_member(memberId, NAME, pwd) VALUES ('testTrigger1', '트리거1','1234');
UPDATE tbl_member SET memberId = 'testTrigger1_2', NAME = '트리거테스트1_2' WHERE memberId = 'testTrigger1_1';
SELECT * FROM tbl_member_log;
SELECT * FROM TMP_tbl_member_test;
DELIMITER $$
CREATE TRIGGER TRG_tbl_member_delete
AFTER DELETE ON tbl_member FOR EACH ROW
BEGIN
DECLARE old_con TEXT;
SET old_con = CONCAT(OLD.memberID, OLD.name);
INSERT INTO TMP_tbl_member_test(content, event_type)
VALUES (old_con, 'DELETE');
INSERT INTO tbl_member_log (memberId, NAME, pwd, addr1, addr2, birthday, jobCode, mileage, memberState, regDate, leaveDate, event_type)
VALUES (OLD.memberId, OLD.NAME, OLD.pwd, OLD.addr1, OLD.addr2, OLD.birthday, OLD.jobCode, OLD.mileage, OLD.memberState, OLD.regDate, OLD.leaveDate, 'DELETE_OLD');
END;
$$
DELIMITER ;
UPDATE tbl_member SET memberId = 'testTrigger1_1', NAME = '트리거테스트1_1' WHERE memberId = 'testTrigger1_2';
DELETE FROM tbl_member WHERE memberId = 'testTrigger1_1';
SELECT * FROM tbl_member_log;
SELECT * FROM TMP_tbl_member_test;
SELECT * FROM tbl_orderinfo;
SELECT * FROM tbl_orderdetail;
CREATE OR REPLACE TEMPORARY TABLE TMP_tbl_order_month(
idx INT AUTO_INCREMENT PRIMARY KEY
, orderYM CHAR(7) DEFAULT NULL COLLATE 'utf8mb4_general_ci'
, goodsCode CHAR(6) NOT NULL COLLATE 'utf8mb4_general_ci'
, monthAmount DECIMAL(7,0) DEFAULT 0
, monthCancelAmount DECIMAL(7,0) DEFAULT 0
)
;
DELIMITER $
CREATE OR REPLACE TRIGGER TRG_tbl_orderDetail_insert
AFTER INSERT ON tbl_orderdetail FOR EACH ROW
BEGIN
DECLARE in_amount DECIMAL(7,0) DEFAULT 0;
DECLARE normal_amount DECIMAL(7,0) DEFAULT 0;
DECLARE cancel_amount DECIMAL(7,0) DEFAULT 0;
DECLARE order_date CHAR(7);
DECLARE cancel_yn CHAR(1);
DECLARE goodsCD CHAR(6);
SELECT LEFT(CONVERT(orderDate, CHAR),7), cancelYN
INTO order_date, cancel_yn
FROM tbl_orderinfo
WHERE orderNo = NEW.orderNo;
SET goodsCD = NEW.goodsCode;
SET in_amount = NEW.amount;
IF cancel_yn = 'N' THEN
SET normal_amount = in_amount;
ELSEIF cancel_yn = 'Y' THEN
SET cancel_amount = in_amount;
END IF;
IF (SELECT COUNT(goodsCode) FROM TMP_tbl_order_month WHERE goodsCode = goodsCD AND orderYM = order_date) = 1
THEN
UPDATE TMP_tbl_order_month
SET
monthAmount = monthAmount + normal_amount
, monthCancelAmount = monthCancelAmount + cancel_amount
WHERE (goodsCode = goodsCD) && (orderYM = order_date);
ELSE
INSERT INTO TMP_tbl_order_month (orderYM, goodsCode, monthAmount, monthCancelAmount)
VALUES (order_date, goodsCD, normal_amount, cancel_amount);
END IF;
END;
$$
DELIMITER ;
INSERT INTO tbl_orderinfo(orderNo, orderDate, memberId, orderAmount, cancelYN)
VALUES ('202302001', NOW(), 'gee3', 5000, 'N');
INSERT INTO tbl_orderinfo(orderNo, orderDate, memberId, orderAmount, cancelYN)
VALUES ('202302002', NOW(), 'gee1', 1000, 'N');
INSERT INTO tbl_orderdetail(orderNo, goodsCode, unitCode, unitPrice, orderedCnt, amount)
VALUES ('202302001', 'GDS005', '02', 1000, 5, 5000);
INSERT INTO tbl_orderdetail(orderNo, goodsCode, unitCode, unitPrice, orderedCnt, amount)
VALUES ('202302001', 'GDS002', '02', 100, 10, 1000);
INSERT INTO tbl_orderdetail(orderNo, goodsCode, unitCode, unitPrice, orderedCnt, amount)
VALUES ('202302002', 'GDS005', '02', 1000, 5, 5000);
INSERT INTO tbl_orderdetail(orderNo, goodsCode, unitCode, unitPrice, orderedCnt, amount)
VALUES ('202302002', 'GDS002', '02', 100, 10, 1000);
SELECT * FROM tbl_orderinfo;
SELECT * FROM TMP_tbl_order_month;
TRUNCATE TABLE TMP_tbl_order_month;
DELETE FROM tbl_orderdetail WHERE orderNo = '202302001';
DELETE FROM tbl_orderdetail WHERE orderNo = '202302002';
DELETE FROM tbl_orderinfo WHERE orderNo = '202302001';
DELETE FROM tbl_orderinfo WHERE orderNo = '202302002';
SELECT * FROM tbl_orderinfo;
SELECT * FROM tbl_orderdetail;
DELIMITER $
CREATE OR REPLACE TRIGGER TRG_tbl_orderDetail_update
AFTER UPDATE ON tbl_orderdetail FOR EACH ROW
BEGIN
DECLARE in_amount DECIMAL(7,0) DEFAULT 0;
DECLARE normal_amount DECIMAL(7,0) DEFAULT 0;
DECLARE cancel_amount DECIMAL(7,0) DEFAULT 0;
DECLARE order_date CHAR(7);
DECLARE cancel_yn CHAR(1);
DECLARE goodsCD CHAR(6);
SELECT LEFT(CONVERT(orderDate, CHAR),7)
INTO order_date
FROM tbl_orderinfo
WHERE orderNo = NEW.orderNo;
IF NEW.cancelAmount = OLD.cancelAmount THEN SET cancel_Amount = 0;
ELSE SET cancel_Amount = (NEW.cancelAmount - OLD.cancelAmount);
END IF;
IF NEW.amount = OLD.amount THEN SET normal_amount = 0;
ELSE SET normal_amount = (NEW.amount - OLD.amount);
END IF;
SET goodsCD = NEW.goodsCode;
IF (SELECT COUNT(cancelAmount) FROM tbl_orderdetail WHERE (orderNo = NEW.orderNo) AND (cancelAmount != 0)) != 0 THEN
SET cancel_yn = 'Y';
UPDATE tbl_orderinfo
SET cancelYN = cancel_yn, cancelDate = NOW()
WHERE orderNo = NEW.orderNo;
ELSE
SET cancel_yn = 'N';
UPDATE tbl_orderinfo
SET cancelYN = cancel_yn, cancelDate = null
WHERE orderNo = NEW.orderNo;
END if;
IF (SELECT COUNT(goodsCode) FROM TMP_tbl_order_month WHERE goodsCode = goodsCD AND orderYM = order_date) = 1
THEN
UPDATE TMP_tbl_order_month
SET
monthAmount = (monthAmount + normal_amount)
, monthCancelAmount = monthCancelAmount + cancel_amount
WHERE (goodsCode = goodsCD) && (orderYM = order_date);
END IF;
END;
$$
DELIMITER ;
UPDATE tbl_orderdetail SET cancelAmount = 1000, amount = 0 WHERE orderNo = '202302001' && goodsCode = 'GDS002';
SELECT * FROM tbl_orderinfo;
SELECT * FROM tbl_orderdetail;
SELECT * FROM TMP_tbl_order_month;
SHOW VARIABLES LIKE '%log_bin%';
DELIMITER $$
CREATE FUNCTION FN_ADD(num1 INT, num2 INT)
RETURNS INT
BEGIN
RETURN num1 + num2;
END;
$$
DELIMITER ;
SELECT FN_ADD(10, 20);
SET @result = FN_ADD(30, 40);
SELECT @result;
DELIMITER $$
CREATE FUNCTION FN_ADD2(num1 INT, num2 INT)
RETURNs INT NO SQL DETERMINISTIC
RETURN num1 + num2;
$$
DELIMITER ;
SELECT FN_ADD2(10, 20);
SET @result2 = FN_ADD2(30, 40);
SELECT @result2;
DELIMITER $$
CREATE OR REPLACE FUNCTION FN_CALCULATE_AGE(birth DATE)
RETURNS INT NO SQL
BEGIN
DECLARE age INT;
IF to_char(birth, 'MM-DD') <= to_char(NOW(), 'MM-DD') THEN
SET age = (YEAR(NOW()) - YEAR(birth));
ELSE
SET age = (YEAR(NOW()) - YEAR(birth)) - 1;
END IF;
RETURN age;
END;
$$
DELIMITER ;
SELECT FN_CALCULATE_AGE('1996-10-17') AS 'gee', FN_CALCULATE_AGE('1995-10-31') AS 'tae', FN_CALCULATE_AGE('1996-02-23') AS 'test' ;
Review
- 9장 절차적 SQL프로그래밍 파트는 엄청 중요하다고 하심
TO DO
- Java 최종 정리(~2/25) => 실패...(~3/2일 까지로 연장)
- Maria DB 정리 수업진도 따라잡기
정리하고 있는 부분 : 332p / 진도 : 457p