हम सीधे PL / SQL ब्लॉक में ddl स्टेटमेंट क्यों नहीं लिख सकते


11

हम PL / SQL ब्लॉक में सीधे ddl स्टेटमेंट क्यों नहीं लिख सकते, उदाहरण के लिए जब मैं लिखता हूं

CREATE OR REPLACE PROCEDURE test IS
BEGIN
    truncate table table_name; // error
END test;
/

परंतु,

CREATE OR REPLACE PROCEDURE test IS
BEGIN
    execute immediate 'truncate table table_name'; // works fine
END test;
/

दूसरे को सफलतापूर्वक क्यों निष्पादित किया गया?


यह ब्लॉग पोस्ट, Oracle एक प्रक्रिया के अंदर DDL विवरणों की अनुमति नहीं देता है जो एक उत्तर प्रदान कर सकता है।
राजेश सरकार

जवाबों:


7

जैसा कि दस्तावेज में कहा गया है :

केवल गतिशील SQL PL / SQL प्रोग्राम इकाइयों के भीतर निम्नलिखित प्रकार के कथनों को निष्पादित कर सकता है:

  • डेटा परिभाषा भाषा (DDL) जैसे कथन, DROP, GRANT और REVOKE

एक TRUNCATEऑपरेशन है DDL

उपयोग करते समय EXECUTE IMMEDIATE, याद रखें कि DDLआपके द्वारा निष्पादित किए जाने वाले किसी भी ऑपरेशन COMMITमें वर्तमान लेनदेन होगा।


1

PL / SQL कोड के अंदर DDL वास्तविक आवश्यकता से अधिक अपवाद है। पार्स को संरचना सत्यापन के रूप में देखा जा सकता है, जो कि यदि आपकी संरचना निष्पादन पर बदलती है, तो खो जाती है। प्रक्रियाओं का उद्देश्य अन्य वस्तुओं (तालिकाओं, या अन्य pl / sql कोड, विचारों आदि) को फिर से पार्स किया जाना है। हर बार वस्तु परिवर्तन के आधार पर, इसे फिर से शुरू किया जाना चाहिए। इसलिए, परिवर्तन संरचना की तुलना में किसी चीज़ के पार्स किए गए कोड को सत्यापित नहीं किया जा सकता है और जैसा कि संकलित किया गया है। मामले पर विचार करें

DROP TABLE T1;

पार्स समय के दौरान, तालिका मिल जाएगी और प्रक्रिया सफलतापूर्वक संकलित की जाएगी लेकिन 1 निष्पादन पर, तालिका को गिरा दिया गया है और आपका कोड अब मान्य नहीं है (अगली बार DROP TABLE का परिणाम त्रुटि होगा)। इसी तरह, तालिका डीडीएल में कोई भी परिवर्तन करने के लिए फिर से तैयार करने की आवश्यकता होगी, इसलिए कोड पार्सिंग का लाभ खोना होगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.