Слияние только с «при совпадении, затем обновление» в 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, то как мне сделать эквивалентное обновление?


person Alexandra15    schedule 17.11.2016    source источник
comment
Синтаксическая диаграмма для 9i показывает, что вам нужно было иметь оба предложения when matched и when not matched. Это изменилось в 10gR1 (и упоминается в список новых функций).   -  person Alex Poole    schedule 17.11.2016
comment
Привет, Алекс. Пожалуйста, помните, что я не могу обновить   -  person Alexandra15    schedule 17.11.2016
comment
Алекс. ты победил!!   -  person Alexandra15    schedule 17.11.2016
comment
но нет возможности проголосовать за тебя @AlexPoole   -  person Alexandra15    schedule 17.11.2016
comment
Посетите справочный центр. Я не уверен, что победа означает, что мой ответ решит вашу проблему?   -  person Alex Poole    schedule 17.11.2016


Ответы (1)


Синтаксическая диаграмма для 9i показывает, что вам нужно было иметь оба предложения when matched и when not matched. Это изменилось в 10gR1 (и упоминается в список новых функций); но это на самом деле не поможет вам, если вы не можете обновиться - это просто объясняет, почему это не работает. Вы также пытались обновить два из трех столбцов из предложения соединения, что не разрешено.

Вместо этого вы можете сделать коррелированное обновление:

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_id и line_type, поскольку вы уже знаете, что они совпадают. Предложение where exists означает, что обновляются только те строки в pricing, которым действительно соответствует строка в v_rec. Это может означать, что вызовы nvl() являются избыточными, и вам просто нужно выбрать значение из s, но, не зная ваших данных, трудно быть уверенным.

person Alex Poole    schedule 17.11.2016