2016-11-17 53 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)顯示您必須同時擁有'when matched'和'when not匹配「條款。 [在10gR1中更改](https://docs.oracle.com/cd/B12037_01/server.101/b10759/statements_9016.htm)(並在[新功能](https://docs.oracle。 com/cd/B12037_01/server.101/b10759/wnsql.htm)list).. –

+0

你好Alex。請記住我不能升級 – Alexandra15

+0

亞歷克斯。你贏了!! – Alexandra15

回答

1

The syntax diagram for 9i表明您必須同時具有when matchedwhen not matched子句。 That changed in 10gR1(並在new features列表中提及);但如果你不能升級,這並不能真正幫助你 - 它只是解釋了爲什麼它不起作用。您還試圖更新連接子句中的三列中的兩列,這是不允許的。

你可以做一個相關的更新替代:

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 
); 

我已經採取了item_idline_type列,你已經知道它們是否匹配。 where exists子句意味着只有在pricing中的行實際上在v_rec中有匹配的行被更新。那可能意味着nvl()調用是多餘的,您只需要從s中選擇值,但不知道您的數據很難確定。