डीडीएल स्टेटमेंट में बाइंड वैरिएबल की अनुमति नहीं है। तो निम्नलिखित कथन त्रुटियों का कारण बनेंगे:
-
उदाहरण #1:DDL विवरण . ORA-01027 का कारण होगा:डेटा परिभाषा संचालन के लिए बाध्य चर की अनुमति नहीं है
EXECUTE IMMEDIATE 'CREATE TABLE dummy_table ( dummy_column NUMBER DEFAULT :def_val )' USING 42;
-
उदाहरण #2:DDL विवरण . कारण होगा ORA-00904::अमान्य पहचानकर्ता
EXECUTE IMMEDIATE 'CREATE TABLE dummy_table ( :col_name NUMBER )' USING var_col_name;
-
उदाहरण #3:SCL विवरण . ORA-02248 का कारण बनेगा:ALTER SESSION के लिए अमान्य विकल्प
EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_CALENDAR = :cal' USING var_calendar_option;
समस्या
ऐसा क्यों होता है यह समझने के लिए, हमें यह देखना होगा कि गतिशील SQL कथन कैसे संसाधित होते हैं।
<ब्लॉककोट>आमतौर पर, एक एप्लिकेशन प्रोग्राम उपयोगकर्ता को SQL स्टेटमेंट के टेक्स्ट और स्टेटमेंट में उपयोग किए गए होस्ट वेरिएबल्स के मानों के लिए संकेत देता है। फिर Oracle SQL स्टेटमेंट को पार्स करता है। अर्थात्, Oracle यह सुनिश्चित करने के लिए SQL कथन की जाँच करता है कि यह सिंटैक्स नियमों का पालन करता है और मान्य डेटाबेस ऑब्जेक्ट को संदर्भित करता है। पार्सिंग में डेटाबेस एक्सेस अधिकारों की जांच करना भी शामिल है , आवश्यक संसाधनों को आरक्षित करना, और इष्टतम पहुंच पथ खोजना।
<उप>उत्तर देने वाले ने जोर दिया
ध्यान दें कि पार्सिंग चरण पहले होता है डायनेमिक स्टेटमेंट के लिए किसी भी वेरिएबल को बाइंड करना। यदि आप उपरोक्त चार उदाहरणों की जांच करते हैं, तो आप महसूस करेंगे कि बाइंड वैरिएबल के मूल्यों को जाने बिना इन गतिशील SQL कथनों की वाक्यात्मक वैधता की गारंटी देने के लिए पार्सर के पास कोई रास्ता नहीं है।
- उदाहरण #1 :पार्सर यह नहीं बता सकता कि बाइंड वैल्यू मान्य होगी या नहीं। क्या होगा अगर
USING 42
, प्रोग्रामर ने लिखाUSING 'forty-two'
? - उदाहरण #2 :पार्सर यह नहीं बता सकता कि
:col_name
एक मान्य कॉलम नाम होगा। क्या होगा यदि बाउंड कॉलम नाम'identifier_that_well_exceeds_thirty_character_identifier_limit'
था ? - उदाहरण #3 :
NLS_CALENDAR
. के लिए मान स्थिरांक में निर्मित होते हैं (किसी दिए गए Oracle संस्करण के लिए?) पार्सर यह नहीं बता सकता कि बाउंड वेरिएबल का वैध मान होगा या नहीं।
तो इसका उत्तर यह है कि आप डायनेमिक SQL में तालिका नाम, स्तंभ नाम जैसे स्कीमा तत्वों को बाइंड नहीं कर सकते हैं। न ही आप बिल्ट इन कॉन्स्टेंट को बाइंड कर सकते हैं ।
समाधान
डायनेमिक SQL स्टेटमेंट में स्ट्रिंग कॉन्सटेनेशन का उपयोग करने के लिए डायनेमिक रूप से स्कीमा तत्वों/स्थिरांक को संदर्भित करने का एकमात्र तरीका है।
-
उदाहरण #1:
EXECUTE IMMEDIATE 'CREATE TABLE dummy_table ( dummy_column NUMBER DEFAULT ' || to_char(42) || ')';
-
उदाहरण #2:
EXECUTE IMMEDIATE 'CREATE TABLE dummy_table (' || var_col_name || ' NUMBER )';
-
उदाहरण #3:
EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_CALENDAR = ''' || var_calendar_option || '''';