2012-07-19 13 views
36

Iam का उपयोग करके materialized दृश्य ताज़ा करने के लिए कोशिश कर रहा है:कैसे ताज़ा करने के लिए ओरेकल में दृश्य materialized

DBMS_MVIEW.REFRESH('v_materialized_foo_tbl') 

लेकिन यह अमान्य एसक्यूएल बयान फेंक रहा है।

तो मैं इस तरह एक संग्रहीत प्रक्रिया बनाई है:

CREATE OR REPLACE 
PROCEDURE MAT_VIEW_FOO_TBL 
IS 
BEGIN 
    DBMS_MVIEW.REFRESH('v_materialized_foo_tbl') 
END MAT_VIEW_FOO_TBL IS; 

यह प्रक्रिया सफलतापूर्वक बना दिया गया है, लेकिन यह एक त्रुटि फिर से फेंक रहा है जब मैं

MAT_VIEW_FOO_TBL; 

के साथ इस प्रक्रिया बोल रहा हूँ।

कृपया इस मुद्दे के लिए समाधान का सुझाव दें।

धन्यवाद, श्रीनिवास

+4

क्या आप 'exec DBMS_MVIEW.REFRESH ('v_materialized_foo_tbl') का उपयोग कर रहे हैं;' या 'exec MAT_VIEW_FOO_TBL' या' BEGIN DBMS_MVIEW.REFRESH ('v_materialized_foo_tbl'); अंत; '? इनमें से कोई भी काम करना चाहिए। –

+0

मैंने निष्पादन MAT_VIEW_FOO_TBL के साथ प्रयास किया; BEGIN DBMS_MVIEW.REFRESH ('v_materialized_foo_tbl'); समाप्त; लेकिन काम नहीं किया। – Srinivas

+0

मुझे लगता है कि आप इसे php से SQL स्टेटमेंट के रूप में निष्पादित कर रहे हैं। इसे प्रक्रिया के रूप में निष्पादित किया जाना चाहिए। मैं php नहीं जानता। आप उन बयानों को कैसे कहते हैं। टॉड/एसक्यूएल डेवलपर या PHP के साथ? –

उत्तर

35

इस प्रयास करें:

DBMS_SNAPSHOT.REFRESH('v_materialized_foo_tbl','f'); 

पहले पैरामीटर mat_view का नाम और दूसराrefresh के प्रकार परिभाषित करता है। एफ तेजी से ताज़ा करने का संकेत देता है। लेकिन इस बात को ध्यान में रखें किसी भी अन्य ताज़ा समय विकल्प को ओवरराइड करेगा।

+2

यह SQL डेवलपर जैसे आईडीई में ठीक काम करता है, लेकिन यदि आप इसे कोड से निष्पादित कर रहे हैं (जैसे ODP.NET आदि ..) तो उसे BEGIN में लपेटना होगा @Waqas अली के रूप में & END सुझाव देता है। –

+1

@TomHalladay क्या इसके लिए 'EXECUTE' का उपयोग करने में कुछ गड़बड़ है? (कच्चे फ़ंक्शन निश्चित रूप से मेरे लिए SQL डेवलपर से काम नहीं करता है।) – jpmc26

44

भागो materialized दृश्य में डेटा को ताज़ा करने के लिए इस स्क्रिप्ट:

BEGIN 
DBMS_SNAPSHOT.REFRESH('Name here'); 
END; 
+0

ऊपर कोड कई बार परीक्षण किया जाता है, और यह काम करता है ठीक है, कोई अपवाद/त्रुटि नहीं है। आपके टूल/मेकेन इत्यादि में कुछ समस्या हो सकती है –

1

आप SQL डेवलपर के साथ काम कर रहे हैं, तो आप छोटे अक्षरों में dbms_view डाल करने के लिए की है। बाकी मेरे लिए ठीक संकलित हालांकि मैंने अभी तक कोड से प्रक्रिया नहीं बुलाई है।

CREATE OR REPLACE PROCEDURE "MAT_VIEW_FOO_TBL" AS 
BEGIN 
    dbms_mview.refresh('v_materialized_foo_tbl'); 
END; 
6

देर खेल के लिए एक सा है, लेकिन मैं अपने एमवी की स्कीमा को यह सवाल काम (मैं Oracle 11g पर हूँ)

** पहले स्विच में मूल वाक्य रचना बनाने के लिए एक रास्ता मिल गया * *

EXECUTE DBMS_MVIEW.REFRESH(LIST=>'MV_MY_VIEW'); 

वैकल्पिक रूप से आप कुछ विकल्प जोड़ सकते हैं:

EXECUTE DBMS_MVIEW.REFRESH(LIST=>'MV_MY_VIEW',PARALLELISM=>4); 

यह वास्तव में मेरे लिए काम करता है, और Parall जोड़ने एलिज़ विकल्प ने मेरे निष्पादन को लगभग 2.5 गुना बढ़ाया।

अधिक यहाँ जानकारी:

EXECUTE 
DBMS_SNAPSHOT.REFRESH('Materialized_VIEW_OWNER_NAME.Materialized_VIEW_NAME','COMPLETE'); 
4

आप इस प्रकार पूरी तरह से एक materialized दृश्य ताज़ा कर सकते हैं

begin 
dbms_mview.refresh('mview_name'); 
end; 

उदाहरण:

begin 
dbms_mview.refresh('inv_trans'); 
end; 

आशा है कि उपर्युक्त मदद करता है।

0

सर्वश्रेष्ठ विकल्प '?' का उपयोग करना है विधि के लिए तर्क। इस तरह डीबीएमएस_MVIEW रीफ्रेश करने का सबसे अच्छा तरीका चुन देगा, इसलिए यह आपके लिए सबसे तेज़ रीफ्रेश करेगा। , और अगर आप वास्तव में एक पूर्ण ताज़ा करने की आवश्यकता है तो विधि => 'f' जैसी कुछ कोशिश करने पर विफल नहीं होंगे। :-)

एसक्यूएल * प्लस शीघ्र से:

EXEC DBMS_MVIEW.REFRESH('my_schema.my_mview', method => '?'); 
-1

हम इनबिल्ट प्रक्रियाओं या संकुल हम उपयोग करने के लिए उपयोग करने के लिए जब "निष्पादित" आदेश तो यह काम करेंगे।

पूर्व:

('v_materialized_foo_tbl') कार्यकारी DBMS_MVIEW.REFRESH निष्पादित;

+2

स्टैक ओवरफ्लो में आपका स्वागत है। कृपया पढ़ने के लिए कुछ समय दें एक अच्छा जवाब लिखने के लिए ओउ। [यह] पढ़ें (http://meta.stackexchange.com/a/7659/338114) और [यह] (http://stackoverflow.com/help/how-to-answer) –

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