여러분에 많은 도움으로 일단...데이터 동기화하는걸 최종으로 만들었는데요!
프로시저를 처음 만들어봐서...혹시 개선사항이나 이렇게 했으면 좋을것같은게...있으면
봐주시면 감사하겠습니다!!
머지문은 데이터 많은것들만 시행했습니당!
CREATE OR REPLACE PROCEDURE TOSS.SD_TABLE_SYNC
IS
/******************************************************************************
NAME: TOSS.SD_TABLE_SYNC
PURPOSE: 운영DB -> 개발 DB 동기화 프로시저
REVISIONS:
Ver Date Author Description
--------- ---------- --------------- ------------------------------------
1.0 2024/04/03 yongsei 1. Created this procedure.
NOTES:
Automatically available Auto Replace Keywords:
Object Name: SD_TABLE_SYNC
Sysdate: 2024/04/03
Date and Time: 2024/04/03, 오후 :17:18, and 2024/04/03 오후 :17:18
Username: yongsei (set in TOAD Options, Procedure Editor)
Table Name: (set in the "New PL/SQL Object" dialog)
******************************************************************************/
V_SQL VARCHAR(500);
V_TABLE_NM VARCHAR(30);
V_DB_LINK_NM VARCHAR(30);
V_STRT_PRIOD VARCHAR(5);
V_END_PRIOD VARCHAR(5);
V_DATE VARCHAR(8);
V_PFMC_CYCLE VARCHAR(5);
BEGIN
DBMS_OUTPUT.PUT_LINE('운영 테이블 -> 개발 테이블 DB 동기화');
FOR TABLE_LIST IN (
SELECT TABLE_NAME
, DB_LINK_NAME
, STRT_PRIOD
, END_PRIOD
, PFMC_CYCLE /* M 머지 / A 전체*/
FROM TOSS.SD_INF_STD_DATE
WHERE USE_YN = 'Y'
)
LOOP
-- 테이블 & DB링크 명칭 변수 매칭
V_TABLE_NM := TABLE_LIST.TABLE_NAME;
V_DB_LINK_NM := TABLE_LIST.DB_LINK_NAME;
V_STRT_PRIOD := TABLE_LIST.STRT_PRIOD;
V_END_PRIOD := TABLE_LIST.END_PRIOD;
V_DATE := 'YYYYMMDD';
V_PFMC_CYCLE := TABLE_LIST.PFMC_CYCLE;
IF V_DB_LINK_NM IS NOT NULL THEN /* DB링크 없을 시 리턴. */
/* 전체 삭제 동기화(A) */
IF V_PFMC_CYCLE = 'A' THEN
-- 개발 테이블 TRUNCATE
DBMS_UTILITY.EXEC_DDL_STATEMENT('TRUNCATE TABLE TOSS.'|| V_TABLE_NM);
DBMS_OUTPUT.PUT_LINE(V_TABLE_NM || ' DELETE 완료');
-- 운영테이블 -> 개발 테이블 INSERT
V_SQL := 'INSERT /*+ prallel ( select_table 4 ) */ INTO TOSS.' || V_TABLE_NM || ' SELECT /*+ prallel ( select_table 4 ) */ * FROM '|| V_TABLE_NM || V_DB_LINK_NM;
EXECUTE IMMEDIATE V_SQL;
DBMS_OUTPUT.PUT_LINE(V_TABLE_NM || ' INSERT 완료');
ELSIF V_PFMC_CYCLE = 'M' THEN
/* MERGE(M) */
IF V_TABLE_NM = 'SD_CUST_ORDER_ITEM' THEN
/* 운영에 삭제된 데이터 개발 삭제*/
FOR DEL1 IN (
SELECT A.COMP_CD
, A.CUST_CD
, A.DATA_TP
, A.ITEM_CD
FROM SD_CUST_ORDER_ITEM A
LEFT JOIN SD_CUST_ORDER_ITEM@WEBORD_REAL B
ON A.COMP_CD = B.COMP_CD
AND A.CUST_CD = B.CUST_CD
AND A.DATA_TP = B.DATA_TP
AND A.ITEM_CD = B.ITEM_CD
WHERE B.COMP_CD IS NULL
)
LOOP
DELETE FROM SD_CUST_ORDER_ITEM A
WHERE A.COMP_CD = DEL1.COMP_CD
AND A.CUST_CD = DEL1.CUST_CD
AND A.DATA_TP = DEL1.DATA_TP
AND A.ITEM_CD = DEL1.ITEM_CD;
END LOOP;
/* 운영에 추가 및 수정된 데이터 개발 동기화 */
MERGE INTO TOSS.SD_CUST_ORDER_ITEM A
USING (
SELECT *
FROM (
SELECT *
FROM TOSS.SD_CUST_ORDER_ITEM@WEBORD_REAL
WHERE UPDATED >= TRUNC(SYSDATE)-1
)
) B
ON
(
A.COMP_CD = B.COMP_CD
AND A.CUST_CD = B.CUST_CD
AND A.DATA_TP = B.DATA_TP
AND A.ITEM_CD = B.ITEM_CD
)
WHEN MATCHED THEN
UPDATE SET
A.INPUTTED = B.INPUTTED
, A.INPUT_ID = B.INPUT_ID
, A.UPDATED = B.UPDATED
, A.UPDATE_ID = B.UPDATE_ID
, A.TERMINALCD = B.TERMINALCD
, A.START_DT = B.START_DT
, A.STOP_DT = B.STOP_DT
, A.BRAND = B.BRAND
WHEN NOT MATCHED THEN
INSERT (
A.COMP_CD
, A.CUST_CD
, A.DATA_TP
, A.ITEM_CD
, A.INPUTTED
, A.INPUT_ID
, A.UPDATED
, A.UPDATE_ID
, A.TERMINALCD
, A.START_DT
, A.STOP_DT
, A.BRAND
) VALUES (
B.COMP_CD
, B.CUST_CD
, B.DATA_TP
, B.ITEM_CD
, B.INPUTTED
, B.INPUT_ID
, B.UPDATED
, B.UPDATE_ID
, B.TERMINALCD
, B.START_DT
, B.STOP_DT
, B.BRAND
);
ELSIF V_TABLE_NM = 'SD_CUST_CLOSE' THEN
/* 운영에 삭제된 데이터 개발 삭제*/
FOR DEL2 IN (
SELECT A.COMP_CD
, A.HIRCHY_CD
, A.CUST_CD
, A.YMD
FROM SD_CUST_CLOSE A
LEFT JOIN SD_CUST_CLOSE@WEBORD_REAL B
ON A.COMP_CD = B.COMP_CD
AND A.HIRCHY_CD = B.HIRCHY_CD
AND A.CUST_CD = B.CUST_CD
AND A.YMD = B.YMD
WHERE B.COMP_CD IS NULL
)
LOOP
DELETE FROM SD_CUST_CLOSE A
WHERE A.COMP_CD = DEL2.COMP_CD
AND A.HIRCHY_CD = DEL2.HIRCHY_CD
AND A.CUST_CD = DEL2.CUST_CD
AND A.YMD = DEL2.YMD;
END LOOP;
/* 운영에 추가 및 수정된 데이터 개발 동기화 */
MERGE INTO TOSS.SD_CUST_CLOSE A
USING (
SELECT *
FROM (
SELECT *
FROM TOSS.SD_CUST_CLOSE@WEBORD_REAL
WHERE UPDATED >= TRUNC(SYSDATE)-1
)
) B
ON (
A.COMP_CD = B.COMP_CD
AND A.HIRCHY_CD = B.HIRCHY_CD
AND A.CUST_CD = B.CUST_CD
AND A.YMD = B.YMD
)
WHEN MATCHED THEN
UPDATE
SET A.REMARKS = B.REMARKS
, A.UPDATED = B.UPDATED
, A.UPDATE_ID = B.UPDATE_ID
, A.TERMINALCD = B.TERMINALCD
WHEN NOT MATCHED THEN
INSERT (
A.COMP_CD
, A.HIRCHY_CD
, A.CUST_CD
, A.YMD
, A.REMARKS
, A.UPDATED
, A.UPDATE_ID
, A.TERMINALCD
) VALUES (
B.COMP_CD
, B.HIRCHY_CD
, B.CUST_CD
, B.YMD
, B.REMARKS
, B.UPDATED
, B.UPDATE_ID
, B.TERMINALCD
);
ELSIF V_TABLE_NM = 'BC_ITEM_PRICE' THEN
/* 운영에 삭제된 데이터 개발 삭제*/
FOR DEL3 IN (
SELECT A.COMP_CD
, A.ITEM_CD
, A.CUST_CD
, A.START_DT
, A.STOP_DT
, A.PRICE_TP
FROM BC_ITEM_PRICE A
LEFT JOIN BC_ITEM_PRICE@WEBORD_REAL B
ON A.COMP_CD = B.COMP_CD
AND A.ITEM_CD = B.ITEM_CD
AND A.CUST_CD = B.CUST_CD
AND A.START_DT = B.START_DT
AND A.STOP_DT = B.STOP_DT
AND A.PRICE_TP = B.PRICE_TP
WHERE B.COMP_CD IS NULL
)
LOOP
DELETE FROM BC_ITEM_PRICE A
WHERE A.COMP_CD = DEL3.COMP_CD
AND A.ITEM_CD = DEL3.ITEM_CD
AND A.CUST_CD = DEL3.CUST_CD
AND A.START_DT = DEL3.START_DT
AND A.STOP_DT = DEL3.STOP_DT
AND A.PRICE_TP = DEL3.PRICE_TP;
END LOOP;
/* 운영에 추가 및 수정된 데이터 개발 동기화 */
MERGE INTO TOSS.BC_ITEM_PRICE A
USING (
SELECT *
FROM (
SELECT *
FROM TOSS.BC_ITEM_PRICE@WEBORD_REAL
WHERE UPDATED >= TRUNC(SYSDATE)-1
)
) B
ON (
A.COMP_CD = B.COMP_CD
AND A.ITEM_CD = B.ITEM_CD
AND A.CUST_CD = B.CUST_CD
AND A.START_DT = B.START_DT
AND A.STOP_DT = B.STOP_DT
AND A.PRICE_TP = B.PRICE_TP
)
WHEN MATCHED THEN
UPDATE
SET A.UNIT_PRICE = B.UNIT_PRICE
, A.REMARKS = B.REMARKS
, A.HIRCHY_CD = B.HIRCHY_CD
, A.USE_YN = B.USE_YN
, A.INPUTTED = B.INPUTTED
, A.INPUT_ID = B.INPUT_ID
, A.UPDATED = B.UPDATED
, A.UPDATE_ID = B.UPDATE_ID
, A.TERMINALCD = B.TERMINALCD
, A.APPR_NO = B.APPR_NO
WHEN NOT MATCHED THEN
INSERT (
A.COMP_CD
, A.ITEM_CD
, A.CUST_CD
, A.START_DT
, A.STOP_DT
, A.UNIT_PRICE
, A.PRICE_TP
, A.REMARKS
, A.HIRCHY_CD
, A.USE_YN
, A.INPUTTED
, A.INPUT_ID
, A.UPDATED
, A.UPDATE_ID
, A.TERMINALCD
, A.APPR_NO
) VALUES (
B.COMP_CD
, B.ITEM_CD
, B.CUST_CD
, B.START_DT
, B.STOP_DT
, B.UNIT_PRICE
, B.PRICE_TP
, B.REMARKS
, B.HIRCHY_CD
, B.USE_YN
, B.INPUTTED
, B.INPUT_ID
, B.UPDATED
, B.UPDATE_ID
, B.TERMINALCD
, B.APPR_NO
);
ELSIF V_TABLE_NM = 'BC_HIER_PRICE' THEN
/* 운영에 삭제된 데이터 개발 삭제*/
FOR DEL4 IN (
SELECT A.COMP_CD
, A.ITEM_CD
, A.HIER_CD
, A.START_DT
, A.STOP_DT
, A.PRICE_TP
FROM BC_HIER_PRICE A
LEFT JOIN BC_HIER_PRICE@WEBORD_REAL B
ON A.COMP_CD = B.COMP_CD
AND A.ITEM_CD = B.ITEM_CD
AND A.HIER_CD = B.HIER_CD
AND A.START_DT = B.START_DT
AND A.STOP_DT = B.STOP_DT
AND A.PRICE_TP = B.PRICE_TP
WHERE B.COMP_CD IS NULL
)
LOOP
DELETE FROM BC_HIER_PRICE A
WHERE A.COMP_CD = DEL4.COMP_CD
AND A.ITEM_CD = DEL4.ITEM_CD
AND A.HIER_CD = DEL4.HIER_CD
AND A.START_DT = DEL4.START_DT
AND A.STOP_DT = DEL4.STOP_DT
AND A.PRICE_TP = DEL4.PRICE_TP;
END LOOP;
/* 운영에 추가 및 수정된 데이터 개발 동기화 */
MERGE INTO TOSS.BC_HIER_PRICE A
USING (
SELECT *
FROM (
SELECT *
FROM TOSS.BC_HIER_PRICE@WEBORD_REAL
WHERE UPDATED >= TRUNC(SYSDATE)-1
)
) B
ON (
A.COMP_CD = B.COMP_CD
AND A.ITEM_CD = B.ITEM_CD
AND A.HIER_CD = B.HIER_CD
AND A.START_DT = B.START_DT
AND A.STOP_DT = B.STOP_DT
AND A.PRICE_TP = B.PRICE_TP
)
WHEN MATCHED THEN
UPDATE
SET A.UNIT_PRICE = B.UNIT_PRICE
, A.REMARKS = B.REMARKS
, A.USE_YN = B.USE_YN
, A.INPUTTED = B.INPUTTED
, A.INPUT_ID = B.INPUT_ID
, A.UPDATED = B.UPDATED
, A.UPDATE_ID = B.UPDATE_ID
, A.TERMINALCD = B.TERMINALCD
, A.APPR_NO = B.APPR_NO
WHEN NOT MATCHED THEN
INSERT (
A.COMP_CD
, A.ITEM_CD
, A.HIER_CD
, A.START_DT
, A.STOP_DT
, A.UNIT_PRICE
, A.PRICE_TP
, A.REMARKS
, A.USE_YN
, A.INPUTTED
, A.INPUT_ID
, A.UPDATED
, A.UPDATE_ID
, A.TERMINALCD
, A.APPR_NO
) VALUES (
B.COMP_CD
, B.ITEM_CD
, B.HIER_CD
, B.START_DT
, B.STOP_DT
, B.UNIT_PRICE
, B.PRICE_TP
, B.REMARKS
, B.USE_YN
, B.INPUTTED
, B.INPUT_ID
, B.UPDATED
, B.UPDATE_ID
, B.TERMINALCD
, B.APPR_NO
);
ELSIF V_TABLE_NM = 'BC_ITEM_PLANT' THEN
/* 운영에 삭제된 데이터 개발 삭제*/
FOR DEL5 IN (
SELECT A.COMP_CD
, A.ITEM_CD
, A.CUST_CD
, A.LOGISTIC_CD
FROM BC_ITEM_PLANT A
LEFT JOIN BC_ITEM_PLANT@WEBORD_REAL B
ON A.COMP_CD = B.COMP_CD
AND A.ITEM_CD = B.ITEM_CD
AND A.CUST_CD = B.CUST_CD
AND A.LOGISTIC_CD = B.LOGISTIC_CD
WHERE B.COMP_CD IS NULL
)
LOOP
DELETE FROM BC_ITEM_PLANT A
WHERE A.COMP_CD = DEL5.COMP_CD
AND A.ITEM_CD = DEL5.ITEM_CD
AND A.CUST_CD = DEL5.CUST_CD
AND A.LOGISTIC_CD = DEL5.LOGISTIC_CD;
END LOOP;
/* 운영에 추가 및 수정된 데이터 개발 동기화 */
MERGE INTO TOSS.BC_ITEM_PLANT A
USING (
SELECT *
FROM (
SELECT *
FROM TOSS.BC_ITEM_PLANT@WEBORD_REAL
WHERE UPDATED >= TRUNC(SYSDATE)-1
)
) B
ON (
A.COMP_CD = B.COMP_CD
AND A.ITEM_CD = B.ITEM_CD
AND A.CUST_CD = B.CUST_CD
AND A.LOGISTIC_CD = B.LOGISTIC_CD
)
WHEN MATCHED THEN
UPDATE
SET A.LOGISTIC1 = B.LOGISTIC1
, A.LOGISTIC2 = B.LOGISTIC2
, A.LOGISTIC3 = B.LOGISTIC3
, A.STATUS = B.STATUS
, A.INPUTTED = B.INPUTTED
, A.INPUT_ID = B.INPUT_ID
, A.UPDATED = B.UPDATED
, A.UPDATE_ID = B.UPDATE_ID
WHEN NOT MATCHED THEN
INSERT (
A.COMP_CD
, A.ITEM_CD
, A.CUST_CD
, A.LOGISTIC_CD
, A.LOGISTIC1
, A.LOGISTIC2
, A.LOGISTIC3
, A.STATUS
, A.INPUTTED
, A.INPUT_ID
, A.UPDATED
, A.UPDATE_ID
) VALUES (
B.COMP_CD
, B.ITEM_CD
, B.CUST_CD
, B.LOGISTIC_CD
, B.LOGISTIC1
, B.LOGISTIC2
, B.LOGISTIC3
, B.STATUS
, B.INPUTTED
, B.INPUT_ID
, B.UPDATED
, B.UPDATE_ID
);
END IF;
END IF;
ELSE
DBMS_OUTPUT.PUT_LINE(V_TABLE_NM || ' 테이블의 DB링크가 없습니다.');
END IF;
END LOOP;
COMMIT;
DBMS_OUTPUT.PUT_LINE('운영 테이블 => 개발 테이블 DB 동기화 완료');
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
DBMS_OUTPUT.PUT_LINE(V_TABLE_NM || V_DB_LINK_NM || '데이터 이전중 오류가 발생하였습니다.');
END SD_TABLE_SYNC;