仅在“匹配后更新”时合并在Oracle 9i中

时间:2016-11-17 14:50:59

标签: sql oracle oracle9i

我在Oracle 9i 9.2的公司工作,我无法升级。

仅在匹配时进行更新的合并,而不是不匹配的插入,似乎在此版本中不起作用。

我正在尝试:

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中无法做到这一点,那么我该如何进行等效更新?

1 个答案:

答案 0 :(得分:1)

The syntax diagram for 9i表明您必须同时拥有when matchedwhen not matched条款。 That changed in 10gR1(并在new features列表中提到);但是,如果你无法升级,这对你没有帮助 - 它只是解释了为什么它不起作用。您还尝试更新join子句中的三列中的两列,这是不允许的。

您可以改为进行相关更新:

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子句仅表示pricingv_rec中实际具有匹配行的行已更新。那个可能意味着nvl()来电是多余的,您只需要从s中选择一个值,但不知道您的数据就很难确定。