๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐ŸŒพBackEnd/๐ŸŒฑ Spring

SPRING ์ฟผ๋ฆฌ๋ฅผ 2๊ฐœ๋ฅผ 1๊ฐœ๋กœ ์ค„์ด๋Š” Merge ์ด์šฉํ•˜๊ธฐ

by MuGeon Kim 2022. 11. 26.
๋ฐ˜์‘ํ˜•

Merge๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด ์ฝ”๋“œ๋ฅผ ์ค„์ด๊ณ  ๊ฐ€๋…์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค. ์•„์ง ์ƒ์†Œํ•˜์ง€๋งŒ ๊ณ„์† ๋…ธ๋ ฅ์„ ํ•ด์•ผ๋˜๊ฒ ๋‹ค.

 

1.์ผ๋‹จ ์ฟผ๋ฆฌ์— ๋Œ€ํ•ด์„œ ์ž‘์„ฑํ•œ๋‹ค.

sql
--1
   SELECT   PROD_NAME prodName
           ,   SUM(PROD_SALE * CART_QTY) money
      FROM     PROD, CART 
      WHERE    PROD_ID = CART_PROD
      GROUP BY PROD_NAME
      HAVING   SUM(PROD_SALE * CART_QTY) >= 10000000;
      

--merge : LPRODํ…Œ์ด๋ธ”์„ LPROD2ํ…Œ์ด๋ธ”๋กœ ๋ณต์ œํ•ด๋ณด์ž
   --2
    CREATE TABLE LPROD2
    AS 
    SELECT * FROM LPROD;

--MERGE
    --3
    MERGE INTO LPROD2 A --๋Œ€์ƒ ํ…Œ์ด๋ธ”
    USING DUAL 
    ON (A.LPROD_GU='P403') --์กฐ๊ฑด์ ˆ(์ฃผ๋กœ ๊ธฐ๋ณธํ‚ค ๋ฐ์ดํ„ฐ)
    WHEN MATCHED THEN --์กฐ๊ฑด์ ˆ์— ํ•ด๋‹นํ•˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์œผ๋ฉด ์‹คํ–‰
        UPDATE SET A.LPROD_CNT=A.LPROD_CNT+1 
    WHEN NOT MATCHED THEN --์กฐ๊ฑด์ ˆ์— ํ•ด๋‹นํ•˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์œผ๋ฉด ์‹คํ–‰
    INSERT(LPROD_ID , LPROD_GU,LPROD_NM,LPROD_CNT)
    VALUES(FN_NEXT_LPROD_ID(),'P404','๊ธฐ๊ตฌ๋ฅ˜',0);
    
    --LPROD2 ํ…Œ์ด๋ธ”์˜ LPROD_ID๊ฐ’์„ 1 ์ฆ๊ฐ€์‹œ์ผœ ๋ฆฌํ„ดํ•ด์ฃผ๋Š” FUNCTION์„ ๋งŒ๋“ค์–ด๋ณด์ž
    --FUNCTION๋ช… : FN_NEXT_LPROD_ID
    --4.
    SELECT NVL(MAX(LPROD_ID),0)+1 FROM LPROD2;
    ----------------------------------------------------------
    CREATE OR REPLACE FUNCTION FN_NEXT_LPROD_ID
    RETURN NUMBER
    IS V_ID NUMBER;
    BEGIN
        --PL/SQL์—์„œ SELECT์™€ ํ•จ๊ป˜ ๊ผญ INTO๋ฅผ ์“ฐ์ž
        SELECT NVL(MAX(LPROD_ID),0)+1 INTO V_ID 
        FROM LPROD2;
        RETURN V_ID;
    END;
    
    --LPROD2 ํ…Œ์ด๋ธ”์˜ LPROD_GU๊ฐ’์„ 1์ฆ๊ฐ€์‹œ์ผœ ๋ฆฌํ„ดํ•ด์ฃผ๋Š” ์„œ๋ธŒ์ฟผ๋ฆฌ๋ฅผ ๋งŒ๋“ค์–ด๋ณด์ž
    --P403 -> 1์ฆ๊ฐ€ -> P405
    SELECT MAX(LPROD_GU) 
        ,SUBSTR(MAX(LPROD_GU),1,1)
        ||TRIM(SUBSTR(MAX(LPROD_GU),2)+1)
    FROM LPROD2;
    --P์™€ 405์„ ๋ถ„๋ฆฌ์‹œํ‚ค๊ณ  ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐ
-- ์Šค๋ธŒ์ฟผ๋ฆฌ ๋งŒ๋“ค๊ธฐ


--5.UPDATE๋ฅผ ํ•˜๊ฑฐ๋‚˜ INSERT๋ฅผ ํ•˜๋Š”๊ฑฐ์ž„ ์กฐ๊ฑด์— ๋งž๋Š”๊ฑฐ
MERGE INTO LPROD2 A  -- ๋Œ€์ƒ ํ…Œ์ด๋ธ”
USING DUAL
ON(A.LPROD_GU = 'P404') -- ์กฐ๊ฑด์ ˆ(์ฃผ๋กœ ๊ธฐ๋ณธํ‚ค ๋ฐ์ดํ„ฐ)
WHEN MATCHED THEN -- ์กฐ๊ฑด์ ˆ์— ํ•ด๋‹นํ•˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์œผ๋ฉด ์‹คํ–‰
    UPDATE SET A.LPROD_CNT = A.LPROD_CNT + 1
WHEN NOT MATCHED THEN -- ์กฐ๊ฑด์ ˆ์— ํ•ด๋‹นํ•˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์œผ๋ฉด ์‹คํ–‰
    INSERT (LPROD_ID, LPROD_GU, LPROD_NM, LPROD_CNT)
    VALUES ((SELECT NVL(MAX(LPROD_ID), 0) + 1 FROM LPROD2), (SELECT SUBSTR(MAX(LPROD_GU), 1, 1)
            || TRIM(SUBSTR(MAX(LPROD_GU), 2) + 1)
            FROM   LPROD2), '๊ฐ€๊ตฌ๋ฅ˜', 0)
;

 

์–ด๋–ค ์ฝ”๋“œ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ์•„๋ณด์ž

insert์™€ update์ด ๋‘๊ฐœ์˜ ์ฝ”๋“œ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.

<!--
<insert id="insertPost" parameterType="bookVO">
	<selectKey order="BEFORE" keyProperty="bookId" resultType="int">
		SELECT NVL(MAX(BOOK_ID),0) + 1 FROM BOOK
	</selectKey>

	INSERT INTO BOOK (BOOK_ID,TITLE,CATEGORY,PRICE,INSERT_DATE,CONTENT)
	VALUES (#{bookId},#{title},#{category},#{price},SYSDATE,#{content})
</insert>
 -->

<!-- MERGE๋ฅผ ์ด์šฉํ•œ ์กฐ๊ฑด INSERT๋ฌธ
	UPDATE : BOOKVO.BOOKID๊ฐ€ ์žˆ์Œ => controller์—์„œ detail.jsp?bookId=1๋กœ redirect ์‹œ parameter๊ฐ’์„ ์ด์šฉํ•ด์„œ
	INSERT : BOOKVO.BOOKID๊ฐ€ ์—†์Œ
	๊ทธ๋ž˜์„œ ์„œ๋ธŒ์ฟผ๋ฆฌ๋กœ ์ž‘์„ฑ INSERT BOOKID๋ฅผ SELECTKEY ๋‹ค ๋„ฃ๊ธฐ
-->

 

Merge๋ฅผ ์ด์šฉํ•˜๋ฉด ์ฝ”๋“œ๋ฅผ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ž‘์„ฑ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

<insert id="insertPost" parameterType="bookVO"  >
		<selectKey order="AFTER" keyProperty="bookId" resultType="int">
			SELECT MAX(BOOK_ID)  FROM BOOK
		</selectKey>
		MERGE INTO BOOK A
		USING DUAL ON(A.BOOK_ID=#{bookId})
		WHEN MATCHED THEN
		UPDATE BOOK
		   SET TITLE = #{title}
		    ,  CATEGORY = #{category}
		    ,  PRICE = #{price}
		    ,  CONTENT = #{content}
		    ,  INSERT_DATE = SYSDATE
		WHEN NOT MATCHED THEN
		INSERT (BOOK_ID,TITLE,CATEGORY,PRICE,INSERT_DATE,CONTENT) 
		VALUES ((SELECT NVL(MAX(BOOK_ID),0) + 1 FROM BOOK),#{title},#{category},#{price},SYSDATE,#{content})
	</insert>
	<!-- INSERT INTO BOOK ๋นผ๊ณ  WHERE BOOK_ID = #{bookId} ๋นผ๊ธฐ -->
๋ฐ˜์‘ํ˜•