2016-11-17 12 views
0

Oracle 9i 9.2를 사용하는 회사에서 일하고 있는데 업그레이드 할 수 없습니다.'일치하는 경우 업데이트 후 병합'Oracle 9i에서

일치하는 항목에 대한 업데이트 만 수행하고 일치하지 않는 항목에 대한 삽입이 아닌이 버전은이 버전에서 작동하지 않는 것 같습니다.

내가 할 노력하고 있어요 :

MERGE INTO CDLREFWORK.pricing d --table to insert to 
    USING V_REC S --table source 
    ON (D.item_id = S.item_id 
     and d.line_type = s.line_type 
     AND d.price_code =s.price_code) 
    WHEN MATCHED THEN UPDATE SET 
    d.APPLICATION_ID='CPMASI', 
    d.SYS_UPDATE_DATE=SYSDATE, 
    d.OPERATOR_ID=nvl(s.OPERATOR_ID, d.OPERATOR_ID), 
    d.LOCATION_ID=nvl(s.LOCATION_ID,d.LOCATION_ID), 
    d.ITEM_ID= nvl(s.ITEM_ID,d.ITEM_ID), 
    d.LINE_TYPE= nvl(s. LINE_TYPE, d.LINE_TYPE), 
    d.EXPIRATION_DATE=nvl(s.EXPIRATION_DATE,d.EXPIRATION_DATE), 
    d.PRICE_CODE= nvl(s.PRICE_CODE,d.PRICE_CODE), 
    d.TO_QTY=nvl(s.TO_QTY,d.TO_QTY), 
    d.PRICE= nvl(s.PRICE,d.PRICE), 
    d.CHARGE_CODE=nvl(s.CHARGE_CODE,d.CHARGE_CODE), 
    d.SOC=nvl(s.SOC,d.SOC), 
    d.COMMITMENT=nvl(s.COMMITMENT,d.COMMITMENT), 
    d.CAMBIAZO_CODE=nvl(s.CAMBIAZO_CODE,d.CAMBIAZO_CODE), 
    d.PPG_IND=nvl(s.PPG_IND,d.PPG_IND); 

이 가져옵니다

SQL Error: ORA-00905: missing keyword 
00905. 00000 - "missing keyword" 

를이 내가 대신 이에 상응하는 업데이 트를 할 것입니다 방법 다음, 9i의에서 할 수없는 경우?

+0

[9i의 구문 다이어그램] (https://docs.oracle.com/cd/B10501_01/server.920/a96540/statements_915a.htm)에서는 '일치 할 때'와 '일치하지 않을 때' 일치하는 조항. [10gR1에서 변경된 사항] (https://docs.oracle.com/cd/B12037_01/server.101/b10759/statements_9016.htm) ([새 기능] (https://docs.oracle.com)에서 언급 됨). com/cd/B12037_01/server.101/b10759/wnsql.htm) 목록 .. –

+0

안녕하세요. 내가 업그레이드 할 수 없다는 것을 기억하십시오 – Alexandra15

+0

Alex. 네가 이겼다!! – Alexandra15

답변

1

The syntax diagram for 9iwhen matchedwhen not matched 절이 모두 있어야한다는 것을 보여줍니다. That changed in 10gR1 (및 new features 목록에 언급되어 있음); 업그레이드 할 수 없다면 그건 도움이되지 않습니다. 단지 작동하지 않는 이유 만 설명합니다. 조인 절에서 세 개의 열 중 두 개를 업데이트하려고했으나 허용되지 않습니다.

당신은 대신에 상관 갱신을 수행 할 수 있습니다 당신은 이미이 일치 알다시피 나는 item_idline_type 열을 촬영했습니다

UPDATE CDLREFWORK.pricing d 
SET (d.APPLICATION_ID, d.SYS_UPDATE_DATE, d.OPERATOR_ID, d.LOCATION_ID, 
    d.EXPIRATION_DATE, d.PRICE_CODE, d.TO_QTY, d.PRICE, d.CHARGE_CODE, d.SOC, 
    d.COMMITMENT, d.CAMBIAZO_CODE, d.PPG_IND) 
= (
    SELECT 'CPMASI', 
    SYSDATE, 
    nvl(s.OPERATOR_ID, d.OPERATOR_ID), 
    nvl(s.LOCATION_ID,d.LOCATION_ID), 
    nvl(s.EXPIRATION_DATE,d.EXPIRATION_DATE), 
    nvl(s.PRICE_CODE,d.PRICE_CODE), 
    nvl(s.TO_QTY,d.TO_QTY), 
    nvl(s.PRICE,d.PRICE), 
    nvl(s.CHARGE_CODE,d.CHARGE_CODE), 
    nvl(s.SOC,d.SOC), 
    nvl(s.COMMITMENT,d.COMMITMENT), 
    nvl(s.CAMBIAZO_CODE,d.CAMBIAZO_CODE), 
    nvl(s.PPG_IND,d.PPG_IND) 
    FROM V_REC s 
    WHERE s.item_id =d.item_id 
    AND s.line_type = d.line_type 
    AND s.price_code = d.price_code 
) 
WHERE EXISTS (
    SELECT null 
    FROM V_REC s 
    WHERE s.item_id =d.item_id 
    AND s.line_type = d.line_type 
    AND s.price_code = d.price_code 
); 

. where exists 절은 실제로 v_rec에 일치하는 행이있는 pricing의 행만 업데이트됨을 의미합니다. 일 수 있습니다.nvl() 통화가 중복된다는 의미이며 s에서 값을 선택하기 만하면되지만 데이터를 알지 못하면 확신하기 어렵습니다.