在 Oracle 9i 中仅与 'when matched then update' 合并

Merge with only 'when matched then update' In Oracle 9i

我在一家公司工作,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 中不可能,那么我将如何进行等效更新?

The syntax diagram for 9i shows that you had to have both when matched and when not matched clauses. That changed in 10gR1 (and is mentioned in the 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() 调用是多余的,您只需要 select 来自 s 的值,但不知道您的数据很难确定。