반응형

1. 서브 쿼리

가장 문안한 방법이기는 하나 대용량 처리하기는 어렵다.

 

UPDATE TB_CONTRACT_MST M

   SET ETC_1 =

       (

          SELECT MAX(CUST_CRTFC_DT)

          FROM TB_CONTRACT_MST_AUTH

          WHERE CONTRACTMST_NO = M.CONTRACTMST_NO

          GROUP BY CONTRACTMST_NO

       )

WHERE M.REG_DT >= TO_DATE('20150501', 'YYYY-MM-DD')

  AND M.CONTRACT_STATUS_SEC = '07'

  AND M.CONTRACT_AGRE_SEC <> '5'

  AND M.ETC_1 IS NULL

  AND EXISTS (SELECT 1 FROM TB_CONTRACT_MST_AUTH WHERE CONTRACTMST_NO = M.CONTRACTMST_NO)

-------------------------------------------------------

UPDATE TB_USER A SET

A.VPN_IP = (

SELECT VPN_IP FROM

(

    SELECT USER_ID, '192.168.10.' || ROWNUM AS VPN_IP

    FROM

    (

        SELECT *

        FROM TB_USER

        WHERE ORG_CD = '02000001'

        AND USE_YN = 'Y'

        ORDER BY USER_NM ASC

    )

) B WHERE B.USER_ID = A.USER_ID)

WHERE ORG_CD = '02000001'

AND USE_YN = 'Y'

 

2. UPDATABLE JOIN VIEW

UPDATE /*+ bypass_ujvc */

    (

        SELECT ETC_1, CUST_CRTFC_DT

        FROM TB_CONTRACT_MST M,

            (

                SELECT CONTRACTMST_NO, MAX(CUST_CRTFC_DT) AS CUST_CRTFC_DT 

                FROM TB_CONTRACT_MST_AUTH 

                GROUP BY CONTRACTMST_NO

            ) A

        WHERE M.REG_DT >= TO_DATE('20150501', 'YYYY-MM-DD')

        AND M.CONTRACT_STATUS_SEC = '07'

        AND M.CONTRACT_AGRE_SEC <> '5'

        AND M.ETC_1 IS NULL

        AND M.CONTRACTMST_NO = A.CONTRACTMST_NO

    )

SET ETC_1 = CUST_CRTFC_DT

이 질의문은 당연히 에러가 난다.

"ORA-01732 : 뷰에 대한 데이터 조작이 부적합합니다" 라는 에러가 뜬다.

문제는 GROUP BY, DISTINCT 등을 사용하면 원래의 값이 아닌 변형된 결과가 나오므로 업데이트할 수가 없다.

 

3. MERGE INTO

먼저 오라클 버전먼저 확인해야 된다.

 

SELECT *FROM V$VERSION;

BANNER

-------------------------------------------------------------------------------------

Oracle9i Enterprise Edition Release 9.2.0.8.0 - 64bit Production

PL/SQL Release 9.2.0.8.0 - Production

CORE 9.2.0.8.0 Production

TNS for HPUX: Version 9.2.0.8.0 - Production

NLSRTL Version 9.2.0.8.0 - Production

 

내가 사용하고 있는 오라클 버전이다.. 고로 사용할 수 없다. ㅠㅠ

 

BANNER

----------------------------------------------------------------

Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod

PL/SQL Release 10.2.0.1.0 - Production

CORE    10.2.0.1.0      Production

TNS for 32-bit Windows: Version 10.2.0.1.0 - Production

NLSRTL Version 10.2.0.1.0 - Production

10g 이상의 버전에서만 사용가능하다..

사용해보지는 않았지만, 이런식으로 사용하면 될것이다.

 

MERGE INTO TB_CONTRACT_MST M

USING

    (

        SELECT CONTRACTMST_NO, MAX(CUST_CRTFC_DT) AS CUST_CRTFC_DT

        FROM TB_CONTRACT_MST_AUTH

        GROUP BY CONTRACTMST_NO

    ) A

ON

    (

        M.CONTRACTMST_NO = A.CONTRACTMST_NO

    )   

WHEN MATCHED THEN

    UPDATE SET ETC_1 = CUST_CRTFC_DT

결곽 9i 에서는 대용량 DB 를 UPDATE 하기가 힘들거 같다.

다른 방법이 있겠지만......

반응형