2012-12-13 19 views
5

में सम्मिलित rowtype डेटा मैं एक मेज घटना कहा जाता है, और एक ही कॉलम और परिभाषा घटना के साथ साथ एक और वैश्विक अस्थायी तालिका tmp_event बनाया है। क्या इस घटना का उपयोग tmp_event करने के लिए रिकॉर्ड में सम्मिलित करना संभव है?ओरेकल: एक और तालिका

DECLARE 
    v_record event%rowtype; 
BEGIN 
    Insert into tmp_event values v_record; 
END; 

ईवेंट तालिका में बहुत सारे कॉलम हैं, मैं इसे आजमा देना चाहता हूं क्योंकि मैं सभी कॉलम सूचीबद्ध नहीं करना चाहता हूं।

उल्लेख करने के लिए भूल जाएं: मैं इसे ट्रिगर में उपयोग करूंगा, क्या यह v_record ऑब्जेक्ट हो सकता है: EVENT तालिका पर डालने के बाद नया?

+0

'ट्रिगर' में उपयोग के साथ उत्तर को अपडेट किया गया। – Annjawn

+0

मैं यहाँ समान प्रश्न पर जवाब दे दिया है: [http://stackoverflow.com/a/26343423/2235483][1] [1]: http://stackoverflow.com/a/26343423/2235483 – Rusty

उत्तर

17

event से सभी पंक्तियों को सम्मिलित करने के लिए एक row-

DECLARE 
    v_record event%rowtype; 
BEGIN 
    SELECT * INTO v_record from event where rownum=1; --or whatever where clause 
    Insert into tmp_event values v_record; 
END; 

या एक अधिक विस्तृत संस्करण सम्मिलित करने के लिए -

DECLARE 
    TYPE t_bulk_collect_test_tab IS TABLE OF event%ROWTYPE; 

    l_tab t_bulk_collect_test_tab; 

    CURSOR c_data IS 
    SELECT * 
    FROM event; 
BEGIN 
    OPEN c_data; 
    LOOP 
    FETCH c_data 
    BULK COLLECT INTO l_tab LIMIT 10000; 
    EXIT WHEN l_tab.count = 0; 

    -- Process contents of collection here. 
    Insert into tmp_event values v_record; 
    END LOOP; 
    CLOSE c_data; 
END; 
/

एक ट्रिगर में, हां यह संभव है, लेकिन इसके चिकन या की तरह अंडा। आप जैसे

v_record.col1 := :new.col1; 
v_record.col2 := :new.col2; 
v_record.col3 := :new.col3; 
.... 

जाहिर है, PLSQL उदाहरण के ऊपर एक ट्रिगर में नहीं किया जा सकता :new स्तंभ मान के साथ rowtype के हर क्षेत्र प्रारंभ करने के बाद से यह एक परिवर्तनशील ट्रिगर त्रुटि फेंक होगा। और जैसा कि मैंने ऊपर बताया है, प्रत्येक कॉलम को अलग से एक्सेस करने के अलावा ट्रिगर में पूरी पंक्ति प्राप्त करने का कोई अन्य तरीका नहीं है, इसलिए यदि आप यह सब करते हैं तो INSERT into temp_event में सीधे उपयोग क्यों न करें, आपको बहुत सारे काम बचाएंगे ।


इसके अलावा जब से तुम कहना है कि यह बहुत काम (ओरेकल 11gR2 में) सभी स्तंभों का उल्लेख करने के लिए यहाँ कर रही है कि INSERT बयान पैदा करने और यह गतिशील क्रियान्वित करते हुए (हालांकि के लिए परीक्षण नहीं की एक त्वरित तरीका है प्रदर्शन)।

CREATE OR REPLACE TRIGGER event_air --air stands for "after insert of row" 
AFTER INSERT ON EVENT 
FOR EACH ROW 
    L_query varchar2(2000); --size it appropriately 
BEGIN 

    SELECT 'INSERT INTO tmp_event VALUES ('|| listagg (':new.'||column_name, ',') 
              WITHIN GROUP (ORDER BY column_name) ||')' 
    INTO l_query 
    FROM all_tab_columns 
    WHERE table_name='EVENT'; 

    EXECUTE IMMEDIATE l_query; 

EXCEPTION 
    WHEN OTHERS THEN 
     --Meaningful exception handling here 
END; 
+0

मैं डेटा को tmp_event तालिका में संग्रहीत करता हूं ताकि ट्रिगर त्रुटि को म्यूट करने से बचें। मैं इवेंट टेबल में अद्यतन या सम्मिलित करता हूं, और tmp_event तालिका में नया रिकॉर्ड भी जोड़ता हूं, फिर tmp_table में सामग्री पर जाता हूं, क्या यह काम करेगा? – Frank

+0

हां यह होगा। जब तक आप उस तालिका से 'चयन' नहीं करते हैं जहां ट्रिगर होता है, तो यह म्यूटेटिंग ट्रिगर त्रुटि को फेंक नहीं देगा। – Annjawn

+0

@LucM क्या विशेषता है? 'उत्परिवर्ती ट्रिगर' एक त्रुटि है जो ओरेकल डेटाबेस के सभी संस्करणों पर लागू होती है। – Annjawn

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