SPRING ์ฟผ๋ฆฌ๋ฅผ 2๊ฐ๋ฅผ 1๊ฐ๋ก ์ค์ด๋ Merge ์ด์ฉํ๊ธฐ
2022. 11. 26. 01:23ใ๐พBackEnd/๐ฑ Spring
๋ฐ์ํ
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} ๋นผ๊ธฐ -->
๋ฐ์ํ
'๐พBackEnd > ๐ฑ Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ RFC ] ๊ณต์ ๋ฌธ์๋ฅผ ํตํ์ฌ Delete์ Status๋ฅผ ์์๋ณด์ (0) | 2023.03.12 |
---|---|
[ Jackson ] Jackson mock ํ ์คํธ ์ญ์ง๋ ฌํ ์ค๋ฅ (0) | 2023.03.11 |
Spring Boot Test H2 In Memory ์ค์ ํ๊ธฐ (0) | 2023.02.28 |
[SpringBoot] Slack์ผ๋ก ์๋ฆผ ๋ณด๋ด๊ธฐ (0) | 2023.02.15 |
JPA ์์์ฑ ์ปจํ ์คํธ (0) | 2023.02.04 |