2016-11-17 2 views
0

Ich arbeite bei einem Unternehmen mit Oracle 9i 9.2, und ich kann nicht aktualisieren.Zusammenführen mit nur 'wenn abgestimmt dann Update' In Oracle 9i

Eine Zusammenführung, die nur ein Update auf Übereinstimmungen durchführt, nicht ein Insert auf Nicht-Übereinstimmungen, scheint in dieser Version nicht zu funktionieren.

Ich versuche zu tun: Das

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

bekommt:

SQL Error: ORA-00905: missing keyword 
00905. 00000 - "missing keyword" 

Ist dies nicht möglich, in 9i, wie dann würde ich stattdessen eine äquivalente Update?

+0

[Das Syntaxdiagramm für 9i] (https://docs.oracle.com/cd/B10501_01/server.920/a96540/statements_915a.htm) zeigt, dass Sie sowohl "wenn abgestimmt" als auch "wenn nicht" haben müssen Übereinstimmungen. [Das änderte sich in 10gR1] (https://docs.oracle.com/cd/B12037_01/server.101/b10759/statements_9016.htm) (und wird in den [neuen Funktionen] (https://docs.oracle. com/cd/B12037_01/server.101/b10759/wnsql.htm) Liste) .. –

+0

Hallo Alex. Bitte denk dran, ich kann kein – Alexandra15

+0

Alex aktualisieren. du gewinnst!! – Alexandra15

Antwort

1

The syntax diagram for 9i zeigt, dass Sie beide when matched und when not matched Klauseln haben mussten. That changed in 10gR1 (und wird in der new features Liste erwähnt); aber das hilft dir nicht wirklich, wenn du nicht upgraden kannst - es erklärt nur, warum es nicht funktioniert. Sie haben auch versucht, zwei der drei Spalten aus der Join-Klausel zu aktualisieren, was nicht zulässig ist.

Sie können stattdessen eine korrelierte Update tun:

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

ich die item_id und line_type Spalten herausgenommen haben, wie Sie bereits wissen, dass sie übereinstimmen. Die where exists-Klausel bedeutet, dass nur Zeilen in pricing, die tatsächlich eine übereinstimmende Zeile in v_rec haben, aktualisiert werden. Das kann bedeuten die nvl() Anrufe sind redundant, und Sie müssen nur den Wert von s auswählen, aber ohne Ihre Daten zu wissen, ist es schwer, sicher zu sein.

Verwandte Themen