๐Ÿ“’ Database/MariaDB

[mariaDB] Procedure , Function create ์‹ค์Šต ๊ธฐ๋ก

a n u e 2022. 7. 18. 10:55

 

 

1. ์ธ์‚ฌ๋งˆ์Šคํ„ฐ์™€ 1:1 mapping๋˜๋Š” ์‚ฌ๋‚ด๋Œ€์ถœ์›์žฅ ๊ธฐ์ดˆ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…ํ•˜๋Š” ํ”„๋กœ์‹œ์ €๋ฅผ ์ƒ์„ฑํ•ด๋ณด์ž

 

USE OSS;

#์ง€์ • ์›” ์ƒํ™˜์•ก ์ถ”๊ฐ€
ALTER TABLE TB_LOAN ADD COLUMN MONTH_PAY NUMERIC(10) NOT NULL;
#์ปฌ๋Ÿผ ์œ„์น˜ ์ด๋™
ALTER TABLE TB_LOAN MODIFY MONTH_PAY NUMERIC(10) AFTER LOAN_AMOUNT;
ALTER TABLE TB_LOAN MODIFY BALANCE NUMERIC(10) AFTER TOTAL_PAY;

SELECT * FROM TB_LOAN;

DELIMITER $$
CREATE OR REPLACE PROCEDURE INSERT_LOAN(OUT v_result INT)
    /*
     @DESCRIPTION
        LOAN ๋ฐ์ดํ„ฐ(๋Œ€์ถœ ์›์žฅ)๋ฅผ ์‚ฌ์› ์ˆ˜ ๋งŒํผ ์ธ์„œํŠธ ํ•œ๋‹ค.
     @RETURN
        RESULT : ์‹คํŒจ(-1) ์„ฑ๊ณต(0)
     */
    BEGIN
        DECLARE v_emp_cnt INT; #์‚ฌ์› ์ˆ˜
        DECLARE v_kor_nm NVARCHAR(10); #์‚ฌ์›๋ช…
        DECLARE v_min_emp_no INT; #์‚ฌ์› ๋ฒˆํ˜ธ(min)
        DECLARE v_loan_amount INT; #๋Œ€์ถœ๊ธˆ์•ก
        DECLARE v_total_pay INT; #์ด ์ƒํ™˜์•ก
        DECLARE v_interest INT; #์›” ์ ์šฉ์ด์ž
        DECLARE v_balance INT; #๋Œ€์ถœ ์ž”์•ก
        DECLARE v_month_pay INT; #์›” ์ƒํ™˜์•ก(๋งค ์›” ๊ณ ์ •)
        DECLARE i INT DEFAULT 0; #Loop i ๋ณ€์ˆ˜

        DECLARE EXIT HANDLER FOR SQLEXCEPTION #SQL ERROR์‹œ ROLLBACKํ•˜๊ณ  v_result -1 ์ฒ˜๋ฆฌ
            BEGIN
                ROLLBACK;
                SET v_result = -1;
            END;

        /** ํŠธ๋žœ์žญ์…˜ ์‹œ์ž‘ */
        START TRANSACTION;
            SELECT COUNT(*) INTO v_emp_cnt FROM TB_EMP_MST;
            SELECT MIN(EMP_NO) INTO v_min_emp_no FROM TB_EMP_MST;

            /** ์‚ฌ์› ์ˆ˜ ๋งŒํผ Loop */
            WHILE i < v_emp_cnt DO
                BEGIN
                    BEGIN
                        SELECT KOR_NM INTO v_kor_nm FROM TB_EMP_MST WHERE EMP_NO = v_min_emp_no + i;
                    END;
                    BEGIN
                        SELECT RPAD(FLOOR(1 + RAND() * 9), '7', '0') INTO v_loan_amount;
                    END;
                    BEGIN
                        SELECT RPAD(FLOOR(1 + RAND() * 9), '5', '0') INTO v_month_pay; #์›”์— ๊ฐš์•„์•ผํ•˜๋Š” ๋ˆ
                    END;


                    SET v_total_pay = 0;
                    SET v_interest = v_loan_amount * 0.011; #์ด์ž๋Š” 1.1% ๋กœ ๋™์ผ ์ ์šฉ
                    SET v_balance =  v_loan_amount - v_total_pay;

                    INSERT INTO TB_LOAN (LOAN_NO, EMP_NO, LOAN_DATE, LOAN_AMOUNT, TOTAL_PAY, REMARK, INTEREST_RATE, INTEREST, IS_REPAY, REPAY_PERIOD, BALANCE, MONTH_PAY)
                    VALUES (NEXTVAL(LOAN_NO_SEQ), (SELECT EMP_NO FROM TB_EMP_MST WHERE KOR_NM = v_kor_nm), '20220501', v_loan_amount, v_total_pay, 'ํ•™์ž๊ธˆ ๋Œ€์ถœ', '1.1', v_interest, 'N', '20220725', v_balance, v_month_pay);
                    SET i = i+1;
                    SET v_result = 0;
                END;
            END WHILE;
        /** ํŠธ๋žœ์žญ์…˜ ์ข…๋ฃŒ (์ปค๋ฐ‹) */
        COMMIT;
    END;

CALL INSERT_LOAN(@v_result);

์ฐธ๊ณ  ํ…Œ์ด๋ธ” ์ƒ์„ฑ๋ฌธ

CREATE DATABASE OSS;
USE OSS;

DROP TABLE TB_EMP_MST;
CREATE TABLE IF NOT EXISTS TB_EMP_MST (
    EMP_NO INT(10) NOT NULL PRIMARY KEY AUTO_INCREMENT
    , KOR_NM NVARCHAR(30) NOT NULL
    , ENG_NM NVARCHAR(50)
    , MPHONE NVARCHAR(30)
    , ADDR NVARCHAR(150)
    , DIVISION NVARCHAR(150) NOT NULL
    , POSITION NVARCHAR(100) NOT NULL
    , JOB NVARCHAR(50) NOT NULL
    , DUTY NVARCHAR(50) NOT NULL
    , EDUCATION NVARCHAR(100)
    , WORK_TYPE NVARCHAR(10) NOT NULL
    , EMP_STATUS NVARCHAR(10) NOT NULL
    , JOIN_TYPE NVARCHAR(10) NOT NULL
    , JOIN_DATE DATE NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1;
ALTER TABLE TB_EMP_MST ADD BIRTH_DATE DATE;

CREATE SEQUENCE EMP_NO_SEQ
INCREMENT BY 1
START WITH 10000
MAXVALUE 999999
CYCLE;

DROP TABLE TB_LOAN;
CREATE TABLE IF NOT EXISTS TB_LOAN (
    LOAN_NO INT(10) NOT NULL AUTO_INCREMENT
    , EMP_NO INT(10) NOT NULL
    , LOAN_DATE DATE NOT NULL
    , LOAN_AMOUNT NVARCHAR(30) NOT NULL
    , TOTAL_PAY NUMERIC(10) NOT NULL
    , REMARK NVARCHAR(50)
    , INTEREST NUMERIC(10)
    , INTEREST_RATE NUMERIC(10)
    , IS_REPAY NVARCHAR(5) NOT NULL
    , REPAY_PERIOD DATE
    , BALANCE NUMERIC(10) NOT NULL
    , PRIMARY KEY (LOAN_NO, EMP_NO)
    , FOREIGN KEY (EMP_NO) REFERENCES TB_EMP_MST (EMP_NO)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1;
ALTER TABLE TB_LOAN MODIFY INTEREST_RATE DECIMAL(5, 2);

CREATE SEQUENCE LOAN_NO_SEQ
INCREMENT BY 1
START WITH 1
MAXVALUE 999999
CYCLE;

DROP TABLE TB_LOAN_HIST;
CREATE TABLE IF NOT EXISTS TB_LOAN_HIST (
    EMP_NO INT(10) NOT NULL
    , REPAY_DATE DATE NOT NULL
    , LOAN_DATE DATE NOT NULL
    , MONTH_PAY NUMERIC(10) NOT NULL
    , MONTH_INTERREST NUMERIC(10) NOT NULL
    , IS_REPAY NVARCHAR(5) NOT NULL
    , PRIMARY KEY(EMP_NO, REPAY_DATE, LOAN_DATE)
    , FOREIGN KEY (EMP_NO) REFERENCES TB_EMP_MST (EMP_NO)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1;
ALTER TABLE TB_LOAN_HIST MODIFY LOAN_DATE DATE AFTER EMP_NO;

2. ์‚ฌ๋‚ด๋Œ€์ถœ์›์žฅ๊ณผ 1:N mapping๋˜๋Š” ์›”๋ณ„ ๋Œ€์ถœ์ƒํ™˜๋‚ด์—ญ ๋ฐ์ดํ„ฐ๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ํ”„๋กœ์‹œ์ €๋ฅผ ์ƒ์„ฑํ•ด๋ณด์ž

๋งค๋‹ฌ ํ”„๋กœ์‹œ์ ธ๋ฅผ ๋Œ๋ ค, ์›”๋ณ„ ๋Œ€์ถœ์ƒํ™˜ ๋‚ด์—ญ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…ํ•˜๊ณ 

์›”๋ณ„ ๋Œ€์ถœ ์ƒํ™˜ ๋‚ด์—ญ๊ณผ ์—ฐ๊ณ„๋œ ์‚ฌ๋‚ด๋Œ€์ถœ์›์žฅ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐฑ์‹ ํ•œ๋‹ค.

USE OSS;

DELIMITER $$
CREATE OR REPLACE PROCEDURE INSERT_LOAN_HIST(IN v_repay_date DATE, OUT v_result INT)
    /*
     @DESCRIPTION
        ๋Œ€์ถœ ์›์žฅ(TB_LOAN)์— ๋Œ€ํ•œ ์›” ๋ณ„ ์ƒํ™˜ ๋ฐ์ดํ„ฐ(TB_LOAN_HIST)๋ฅผ ์ƒํ™˜ ์›”๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ํ•˜์—ฌ ์ž๋™ ์ƒ์„ฑํ•˜๊ณ 
        ๋Œ€์ถœ ์›์žฅ(TA_LOAN) ๋ฐ์ดํ„ฐ์˜ ๋Œ€์ถœ ์ƒํ™˜์—ฌ๋ถ€๊ฐ€ Y๊ฐ€ ๋  ๋•Œ ๊นŒ์ง€, ์ตœ์‹  ์ƒํ™˜์•ก๊ณผ ์ž”์•ก ๋“ฑ์„ ๊ฐฑ์‹ ํ•œ๋‹ค.
     @RETURN
        RESULT : ์‹คํŒจ(-1) ์„ฑ๊ณต(0)
     */
    BEGIN
        DECLARE v_loan_cnt INT; #๋Œ€์ถœ์›์žฅ ๋งˆ์Šคํ„ฐ length
        DECLARE v_month_pay INT; #์›” ์ƒํ™˜์•ก
        DECLARE v_min_loan_no INT; #๋Œ€์ถœ์›์žฅ ๋ฒˆํ˜ธ(min)
        DECLARE v_balance INT; #๋Œ€์ถœ ์ž”์•ก
        DECLARE v_total_pay INT; #์ด ์ƒํ™˜์•ก
        DECLARE v_loan_amount INT; #๋Œ€์ถœ ๊ธˆ์•ก
        DECLARE v_is_repay NVARCHAR(3); #์ตœ์ข… ์ƒํ™˜์—ฌ๋ถ€
        DECLARE v_is_loan_hist INT; #์›” ์ƒํ™˜๋‚ด์—ญ ์กด์žฌ์—ฌ๋ถ€
        DECLARE i INT DEFAULT 0; #Loop ๋ณ€์ˆ˜ i


        /** ํŠธ๋žœ์žญ์…˜ ์‹œ์ž‘ */
        START TRANSACTION;
            #๋Œ€์ถœ์›์žฅ ๋งˆ์Šคํ„ฐ length ๋งŒํผ, loop
            SELECT COUNT(*) INTO v_loan_cnt FROM TB_LOAN;
            SELECT MIN(LOAN_NO) INTO v_min_loan_no FROM TB_LOAN;

            WHILE i < v_loan_cnt DO
                BEGIN
                    #์ƒํ™˜ ์—ฌ๋ถ€
                    BEGIN
                        SELECT IS_REPAY INTO v_is_repay FROM TB_LOAN WHERE LOAN_NO = v_min_loan_no + i;
                    END;
                    #์›” ์ƒํ™˜ ๊ธˆ์•ก
                    BEGIN
                        SELECT MONTH_PAY INTO v_month_pay FROM TB_LOAN WHERE LOAN_NO = v_min_loan_no + i;
                    END;
                    #๋Œ€์ถœ ์ž”์•ก
                    BEGIN
                        SELECT BALANCE INTO v_balance FROM TB_LOAN WHERE LOAN_NO = v_min_loan_no + i;
                    END;
                    BEGIN
                        SELECT COUNT(1) INTO v_is_loan_hist FROM TB_LOAN_HIST WHERE REPAY_DATE = v_repay_date AND LOAN_NO = v_min_loan_no + i;
                    END;

                    #๋Œ€์ถœ์›์žฅ ๋งˆ์Šคํ„ฐ์˜ ์ƒํ™˜์—ฌ๋ถ€๊ฐ€ N์ด๊ณ , ๊ทธ ๋‹ฌ์— ์ด๋ฏธ ๋Œ๋ฆฌ์ง€ ์•Š์•˜์„ ๋•Œ์—๋งŒ
                    IF v_is_repay = 'N' && v_is_loan_hist = 0
                    THEN
                        #๋‹จ, ์ž”์•ก์ด ์›” ์ƒํ™˜์•ก๋ณด๋‹ค ๋ฏธ๋งŒ์ธ ๊ฒฝ์šฐ, ์›” ์ƒํ™˜์•ก์€ ์ž”์•ก์ด ๋œ๋‹ค.
                        IF v_month_pay > v_balance
                            THEN SET v_month_pay = v_balance;
                        END IF;

                        BEGIN
                            INSERT INTO TB_LOAN_HIST (EMP_NO, LOAN_NO, REPAY_DATE, LOAN_DATE, MONTH_PAY, MONTH_INTERREST, IS_REPAY)
                            VALUES ((SELECT EMP_NO FROM TB_LOAN WHERE LOAN_NO = v_min_loan_no + i), (SELECT LOAN_NO FROM TB_LOAN WHERE LOAN_NO = v_min_loan_no + i), v_repay_date, (SELECT LOAN_DATE FROM TB_LOAN WHERE LOAN_NO = v_min_loan_no + i), v_month_pay, (SELECT INTEREST FROM TB_LOAN WHERE LOAN_NO = v_min_loan_no + i), 'Y');
                        END;

                        BEGIN
                            #์›”์ƒํ™˜๋‚ด์—ญ ์ƒ์„ฑ ํ›„, ๋Œ€์ถœ์›์žฅ์„ ๊ฐฑ์‹ 
                                #1. ํ•ด๋‹น ์›” ๋ณ„ ์ƒํ™˜๊ธˆ์•ก์„ ์ด ์ƒํ™˜๊ธˆ์•ก์— ๋” ํ•จ
                                #2. (์ด ๋Œ€์ถœ๊ธˆ์•ก - ์ด ์ƒํ™˜๊ธˆ์•ก) ๊ณ„์‚ฐํ•˜์—ฌ ์ž”์•ก์„ ๊ฐฑ์‹ 
                                #3. ์ž”์•ก์ด 0์ด๋ฉด ์ƒํ™˜์—ฌ๋ถ€ Y์ฒ˜๋ฆฌ
                            START TRANSACTION;
                                BEGIN
                                    UPDATE TB_LOAN
                                    SET TOTAL_PAY = TOTAL_PAY + v_month_pay
                                    WHERE LOAN_NO = v_min_loan_no + i;
                                END;
                            COMMIT;
                            BEGIN
                                SELECT TOTAL_PAY INTO v_total_pay FROM TB_LOAN WHERE LOAN_NO = v_min_loan_no + i;
                            END;
                            BEGIN
                                SELECT LOAN_AMOUNT INTO v_loan_amount FROM TB_LOAN WHERE LOAN_NO = v_min_loan_no + i;
                            END;
                            BEGIN
                                IF v_loan_amount - v_total_pay = 0
                                    THEN SET v_is_repay = 'Y';
                                ELSE
                                    SET v_is_repay = 'N';
                                END IF;
                            END;
                            BEGIN
                                UPDATE TB_LOAN
                                SET BALANCE = v_loan_amount - v_total_pay
                                    , IS_REPAY = v_is_repay
                                WHERE LOAN_NO = v_min_loan_no + i;
                            END;
                        END;
                    END IF;
                END;

                SET i = i + 1;
                SET v_result = 0;

            END WHILE;

        /** ํŠธ๋žœ์žญ์…˜ ์ข…๋ฃŒ (์ปค๋ฐ‹) */
        COMMIT;
    END;

CALL INSERT_LOAN(@v_result);
CALL INSERT_LOAN_HIST('20220725', @v_result);
CALL INSERT_LOAN_HIST('20220825', @v_result);
CALL INSERT_LOAN_HIST('20220925', @v_result);
CALL INSERT_LOAN_HIST('20221025', @v_result);
CALL INSERT_LOAN_HIST('20221125', @v_result);
CALL INSERT_LOAN_HIST('20221225', @v_result);

DELETE FROM TB_LOAN;
SELECT * FROM TB_LOAN;
DELETE FROM TB_LOAN_HIST;
SELECT * FROM TB_LOAN_HIST;

3. ๋ถ€์„œ์™€ ์ง๊ธ‰์„ ๋ฌด์ž‘์œ„๋กœ ์ง€์ •ํ•˜์—ฌ ์‚ฌ์› ๋งˆ์Šคํ„ฐ 100๊ฐœ๋ฅผ ์ƒ์„ฑํ•ด์ฃผ๋Š” ํ”„๋กœ์‹œ์ €๋ฅผ ๋งŒ๋“ค์–ด๋ณด์ž 

USE OSS;

DELIMITER $$
CREATE OR REPLACE PROCEDURE INSERT_EMP(OUT v_result INT)
    /*
     @DESCRIPTION
        ์ง๊ธ‰, ์†Œ์†์„ ๋žœ๋ค์œผ๋กœ ํ•˜๋Š” ์ธ์‚ฌ๋งˆ์Šคํ„ฐ 100๊ฐœ INERT
     @RETURN
        RESULT : ์‹คํŒจ(-1) ์„ฑ๊ณต(0)
     */
    BEGIN
        DECLARE v_division INT; #๋ถ€์„œ
        DECLARE v_kor_nm NVARCHAR(10); #์‚ฌ์›๋ช…
        DECLARE v_position INT; #์ง๊ธ‰
        DECLARE i INT DEFAULT 0; #Loop i ๋ณ€์ˆ˜

        DECLARE EXIT HANDLER FOR SQLEXCEPTION #SQL ERROR์‹œ ROLLBACKํ•˜๊ณ  v_result -1 ์ฒ˜๋ฆฌ
        BEGIN
            ROLLBACK;
            SET v_result = -1;
        END;

        /** ํŠธ๋žœ์žญ์…˜ ์‹œ์ž‘ */
        START TRANSACTION;

            /** Loop */
            WHILE i <= 100 DO
                BEGIN
                    BEGIN
                        SELECT RPAD(FLOOR(1 + RAND() * 4), '3', '0') INTO v_division;
                    END;
                    BEGIN
                        SELECT RPAD(FLOOR(1 + RAND() * 5), '2', '0') INTO v_position;
                    END;
                    BEGIN
                        SELECT GET_KORNM() INTO v_kor_nm;
                    END;

                    BEGIN
                        INSERT INTO TB_EMP_MST (EMP_NO, KOR_NM, ENG_NM, MPHONE, ADDR, DIVISION, POSITION, JOB, DUTY, EDUCATION, WORK_TYPE, EMP_STATUS, JOIN_TYPE, JOIN_DATE, BIRTH_DATE)
                        VALUES (NEXTVAL(EMP_NO_SEQ), v_kor_nm, '', '', '', v_division, v_position, 'ํŒ€์›', '์›น๊ฐœ๋ฐœ', '๋Œ€์กธ', '์ •๊ทœ์ง', '์žฌ์ง', '๊ฒฝ๋ ฅ', '2022-04-25', CURDATE());
                        SET i = i+1;
                    END;
                    SET v_result = 0;
                END;
            END WHILE;

        /** ํŠธ๋žœ์žญ์…˜ ์ข…๋ฃŒ (์ปค๋ฐ‹) */
        COMMIT;
    END;

CALL INSERT_EMP(@v_result);
SELECT @v_result;

 

TB_LOAN

 

TB_LOAN_HIST


3. ๋ฌด์ž‘์œ„ ํ•œ๊ธ€ ์ด๋ฆ„์„ return ํ•ด์ฃผ๋Š” function ์ƒ์„ฑ

 - return ๊ฐ’์„ SET์œผ๋กœ ์ดˆ๊ธฐํ™” (SET v_real_nm = "";) ํ•ด์ฃผ์ง€ ์•Š์œผ๋‹ˆ๊นŒ, ์˜ค๋ฅ˜๊ฐ€ ๋‚ฌ๋‹ค. 

DELIMITER $$
CREATE OR REPLACE FUNCTION GET_KORNM() RETURNS NVARCHAR(20)

    BEGIN
        DECLARE v_first_nm NVARCHAR(10);
        DECLARE v_middle_nm NVARCHAR(10);
        DECLARE v_last_nm NVARCHAR(10);
        DECLARE v_real_nm NVARCHAR(10);

        SET v_real_nm = "";

        BEGIN
            SELECT SUBSTRING('๊น€์ด๋ฐ•์ตœ์ •๊ฐ•์กฐ์œค์žฅ์ž„์˜คํ•œ์‹ ์„œ๊ถŒํ™ฉ์•ˆ์†ก์œ ํ™์ „๊ณ ๋ฌธ์†Œ์–‘๋ฐฐ์กฐ๋ฐฑํ—ˆ๋‚จ', rand() * 36 + 1, 1) INTO v_first_nm FROM dual;
        END;
        BEGIN
            SELECT SUBSTRING('๋ฏผํ˜„๋™์ธ์ง€ํ˜„์žฌ์šฐ๊ฑด์ค€์Šน์˜์„ฑ์ง„์ค€์ •์ˆ˜๊ด‘์˜ํ˜ธ์ค‘ํ›ˆํ›„์šฐ์ƒ์—ฐ์ฒ ์•„์œค์€', rand() * 36 + 1, 1) INTO v_middle_nm FROM dual;
        END;
        BEGIN
            SELECT SUBSTRING('์œ ์ž๋„์„ฑ์ƒ๋‚จ์‹์ผ์ฒ ๋ณ‘ํ˜œ์˜๋ฏธํ™˜์‹์ˆ™์žํฌ์ˆœ์ง„์„œ๋นˆ์ •์ง€ํ•˜์—ฐ์„ฑ๊ณต์•ˆ์›', rand() * 36 + 1, 1) INTO v_last_nm FROM dual;
        END;
        BEGIN
        SELECT CONCAT(v_first_nm, v_middle_nm, v_last_nm) INTO v_real_nm;
        END;

    RETURN v_real_nm;
    END;

4. ๋Œ€์ถœ ์ƒํ™˜ ๋‚ด์—ญ์„ ์ƒ์„ฑํ•œ ํ›„, ๋Œ€์ถœ ์ƒํ™˜ ๋งˆ์Šคํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐฑ์‹ ํ•˜๋Š” ํ”„๋กœ์‹œ์ €๋ฅผ ๋‹จ์ˆœ ์ฟผ๋ฆฌ๋ฌธ์œผ๋กœ ๋ณ€๊ฒฝํ•ด๋ณด์ž !

USE OSS;

#4์›” ๋ฐ์ดํ„ฐ ์‚ญ์ œ
DELETE FROM TB_LOAN_HIST
WHERE REPAY_DATE = '2023-04-25';

#4์›” HIST ๋ฐ์ดํ„ฐ ์ƒ์„ฑ
INSERT INTO TB_LOAN_HIST (EMP_NO, LOAN_NO, LOAN_DATE, REPAY_DATE, MONTH_PAY, MONTH_INTERREST, IS_REPAY)
SELECT
    A.EMP_NO AS EMP_NO
    , B.LOAN_NO AS LOAN_NO
    , B.LOAN_DATE AS LOAN_DATE
    , '2023-04-25' AS REPAY_DATE
    , B.MONTH_PAY AS MONTH_PAY
    , B.INTEREST AS MONTH_INTERREST
    , 'Y' AS IS_REPAY
FROM TB_EMP_MST A
INNER JOIN TB_LOAN B
ON A.EMP_NO = B.EMP_NO;

#4์›” HIST ๋ฐ์ดํ„ฐ๋ฅผ ๊ธ์–ด์™€์„œ ๋งˆ์Šคํ„ฐ ๋ฐ์ดํ„ฐ ์ตœ์‹  ๋ฒ„์ „์œผ๋กœ ๊ฐฑ์‹ 
UPDATE TB_LOAN AA
        , (SELECT
                 A.LOAN_NO AS LOAN_NO
                 , CASE
                        WHEN A.BALANCE = '0' THEN A.BALANCE
                        WHEN A.BALANCE < (A.LOAN_AMOUNT - B.MONTH_PAY) THEN 0
                        ELSE A.LOAN_AMOUNT - B.MONTH_PAY
                    END             AS AFTER_BALANCE   #์—…๋ฐ์ดํŠธ ํ•  ์ž”์•ก
                  , B.MONTH_PAY AS AFTER_TOTAL_PAY #์—…๋ฐ์ดํŠธ ํ•  ์ด์ œ๊นŒ์ง€ ๊ฐš์€ ๋ˆ
             FROM TB_LOAN A
             INNER JOIN (SELECT LOAN_NO     AS LOAN_NO
                           , SUM(MONTH_PAY) AS MONTH_PAY
                        FROM TB_LOAN_HIST
                        GROUP BY LOAN_NO) B
                        ON A.LOAN_NO = B.LOAN_NO) BB
SET AA.BALANCE = BB.AFTER_BALANCE
    , AA.TOTAL_PAY = BB.AFTER_TOTAL_PAY
    , AA.IS_REPAY = (CASE WHEN BB.AFTER_BALANCE = 0 THEN 'Y' ELSE 'N' END) #IS_REPAY๋Š” ์ž”์•ก์œผ๋กœ ๊ฒฐ์ •
WHERE AA.LOAN_NO = BB.LOAN_NO;

#๊ฒฐ๊ณผ
SELECT * FROM TB_LOAN;