2016-11-17 7 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

アレックス。あなたが勝つ! – Alexandra15

答えて

1

The syntax diagram for 9iは、when matchedwhen not matchedの両方の句が必要であることを示しています。 That changed in 10gR1(およびnew featuresリストに記載されています)。アップグレードできない場合はそれが本当にあなたを助けるものではありません。なぜそれがうまくいかないのかを説明するだけです。また、join句から3つの列のうちの2つを更新しようとしましたが、これは許可されていません。あなたが代わりに相関更新を行うことができます

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句は、実際にv_recに一致する行を持つpricingの行のみが更新されることを意味します。そのの場合はnvl()コールが冗長であることを意味し、sから値を選択するだけで、データがわからない場合は確信が持てません。

関連する問題