2012-06-26 17 views
9

कहते हैं कि हम 3 तालिका में रिकॉर्ड:उत्प्रेरक

--------------------------------------------- 
| PK | Name | Address | Postal Code | 
--------------------------------------------- 
| 1 | AA | Street1 | 11111  | 
| 2 | BB | Street2 | 44444  | 
| 3 | CC | Dtreet7 | 33333  | 
--------------------------------------------- 

क्या ग्राहक चाहता है अद्यतन रिकॉर्ड और केवल अद्यतन कॉलम (है: orig_tab

--------------------------------------------- 
| PK | Name | Address | Postal Code | 
--------------------------------------------- 
| 1 | AA | Street1 | 11111  | 
| 2 | BB | Street2 | 22222  | 
| 3 | CC | Street3 | 33333  | 
--------------------------------------------- 

अब डेटा बदल गया है हाँ, मैं जानता हूँ कि यह कोई मतलब नहीं है लेकिन उन्होंने 1970 के दशक से कुछ पुराने सिस्टम का उपयोग करें और वे कुछ लॉगिंग आदि क्या करना चाहते हैं)। तो रिपोर्टिंग तालिका इस तरह होना चाहिए:

--------------------------------------------- 
| PK | Name | Address | Postal Code | 
--------------------------------------------- 
| 2 |  |   | 44444  | 
| 3 |  | Dtreet7 |    | 
--------------------------------------------- 

मैं यह क्या करने की कोशिश की:

CREATE OR REPLACE TRIGGER vr_reporting_trigger 
    AFTER UPDATE ON orig_tab 
    FOR EACH ROW 
BEGIN 
IF inserting THEN 
INSERT INTO rep_tab(pk, name, address, code) 
    SELECT :new.pk, :new.name, :new.address, :new,code FROM DUAL 
    WHERE NOT EXISTS (SELECT 1 FROM rep_tab WHERE pk = :new.pk); 
UPDATE rep_tab t SET t.name = :new.name, t.address = :new.address, t.code = :new.code 
    WHERE t.pk = :new.pk; 
ELSIF updating THEN 
IF :new.pk <> :old.pk THEN 
    UPDATE rep_tab t 
     SET t.name = :new.name, t.address = :new.address, t.code =: new.code 
     WHERE t.pk = :old.pk ; 
    END IF; 
    MERGE INTO rep_tab d 
    USING DUAL ON (d.pk = :old.pk) 
    WHEN MATCHED THEN 
    UPDATE SET d.name = :new.name, d.address = :new.address, d.code =: new.code 
    WHEN NOT MATCHED THEN 
    INSERT (d.pk,d.name, d.address, d.code) VALUES (:new.pk,:new.name, new.address, new.code); 
END IF; 
END; 

इस समाधान के साथ, मैं मिलता है:

--------------------------------------------- 
| PK | Name | Address | Postal Code | 
--------------------------------------------- 
| 2 | BB | Street2 | 44444  | 
| 3 | CC | Dtreet7 | 33333  | 
--------------------------------------------- 

मैं जानता हूँ कि इसे कहीं डालने क्लॉस में है कि जब बयान को अद्यतन करने में, लेकिन मैं समझ नहीं कैसे इस क्लॉस मेरी आवश्यकता के अनुसार बदला है। कोई उपाय?

अग्रिम धन्यवाद।

उत्तर

20

आप इस की जरूरत है:

अपडेट प्रारंभ में, एक स्तंभ नाम एक को अपडेट करना सशर्त विधेय के साथ निर्दिष्ट किया जा सकता निर्धारित करने के लिए नामित स्तंभ अद्यतन किया जा रहा है।

CREATE OR REPLACE TRIGGER ... 
... UPDATE OF Sal, Comm ON Emp_tab ... 
BEGIN 

... IF UPDATING ('SAL') THEN ... END IF; 

END; 

से Oracle documentation(9i)

11gR2 documentation

+4

+1, लेकिन 9i डॉक्स: उदाहरण के लिए, मान लें कि एक ट्रिगर निम्नलिखित के रूप में परिभाषित किया गया है? यहाँ [11g संस्करण] है (http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/triggers.htm#sthref771) –

+2

यह अगर वें yolumn अद्यतन बयान का हिस्सा है को गति प्रदान करने लगता है। इतना ही नहीं अगर मान बदलता है। –

संबंधित मुद्दे