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 하기가 힘들거 같다.
다른 방법이 있겠지만......
'DB(Oracle, Mysql 등)' 카테고리의 다른 글
[오라클] 두 열을 한 열로.. (0) | 2016.02.12 |
---|---|
[오라클] 문자열 길이 LENGTH(), LENGTHB(), VSIZE() (0) | 2016.02.12 |
[오라클] sqlplus set -options (0) | 2016.02.12 |
[오라클] 중복 제거 하고 전체값 가져오기 (0) | 2016.02.12 |
[오라클] 인덱스 힌트 사용방법(Oracle index hint) (0) | 2016.02.12 |