Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

स्लैश या नो स्लैश?

यही सवाल है।

ओटीएन मंचों पर एक हालिया पोस्ट ने अर्धविराम और स्लैश का उपयोग कथन टर्मिनेटर के रूप में करने के बारे में पूछा। मैंने इस विषय पर 4 साल पहले हमारी विकास टीम के लिए लिखे एक लेख को धूल चटा दी थी। इस लेख को अच्छी समीक्षा मिली और अगर वांछित है तो ओटीएन मंचों पर उपलब्ध है। मैंने सोचा कि मैं इसे अपने ब्लॉग पर भी पोस्ट करूंगा। ये रहा लेख:

स्लैश या नो स्लैश

ब्रायन पीसलैंड द्वारा

हमारी कंपनी में, तैनात की गई SQL स्क्रिप्ट को Oracle की SQL*Plus कमांड-लाइन उपयोगिता में निष्पादित किया जाता है, जबकि कई डेवलपर PL/SQL डेवलपर या SQL डेवलपर जैसे GUI टूल का उपयोग करते हैं। फॉरवर्ड स्लैश का मतलब एसक्यूएल * प्लस के लिए कुछ है जो पीएल/एसक्यूएल डेवलपर या एसक्यूएल डेवलपर में जरूरी नहीं है। जैसे, यह जानना भ्रमित करने वाला हो सकता है कि आपको अपनी SQL स्क्रिप्ट में फ़ॉरवर्ड स्लैश शामिल करने की आवश्यकता है या नहीं। उम्मीद है, यह खंड कुछ प्रकाश डालेगा कि फ़ॉरवर्ड स्लैश क्या करता है, इसका उपयोग कब करना है, और कब इसका उपयोग नहीं करना है। सेमी-कोलन टर्मिनेटर अधिकांश SQL स्टेटमेंट के लिए, सेमी-कोलन स्टेटमेंट टर्मिनेटर होता है। उदाहरण के लिए, SQL*Plus में चलने वाले इस साधारण SQL कथन पर विचार करें:

SQL> दोहरे से sysdate चुनें;

SYSDATE

———

18-जून-12

जब SQL*Plus सेमी-कोलन देखता है, तो यह जानता है कि SQL स्टेटमेंट का अंत हो चुका है और यह अब कमांड को निष्पादित कर सकता है।

एसक्यूएल*प्लस बफर

आपको शायद इस बात की जानकारी न हो कि SQL*Plus में इसके कमांड के लिए एक बफर होता है। अगर मैं 'सूची' के लिए 'l' कुंजी दबाता हूं, तो मैं वर्तमान में अपने सत्र के बफर में कमांड देख सकता हूं।

एसक्यूएल> एल

1* दोहरे से sysdate चुनें

आश्चर्य की बात नहीं है, एक आदेश है जिसे मैंने अभी निष्पादित किया है। फिर मैंने एक और SQL कथन निष्पादित किया और यहाँ मेरा बफ़र अब कैसा दिखता है:

एसक्यूएल> एल

1 sysdate, उपयोगकर्ता चुनें

2* दोहरे से

जैसा कि आप देख सकते हैं, अब मेरे सत्र के SQL*Plus बफ़र में दो पंक्तियाँ हैं।

स्लैश =बफ़र निष्पादित करें

फॉरवर्ड स्लैश के बारे में समझने वाला पहला नियम यह है कि एसक्यूएल * प्लस के लिए, फॉरवर्ड स्लैश का मतलब बफर की सामग्री को निष्पादित करना है। इस अवधारणा को स्पष्ट करने के लिए, मैं एक SQL कथन निष्पादित करूँगा, कुछ सेकंड प्रतीक्षा करूँगा, और फिर बस उसी SQL कथन को फिर से निष्पादित करूँगा लेकिन केवल बफ़र निष्पादित करूँगा।

SQL> दोहरे से to_char(sysdate,'MM/DD/YYYY HH24:MI:SS') चुनें;

TO_CHAR(SYSDATE,'MM

———————

06/18/2012 15:20:40

SQL> /
TO_CHAR(SYSDATE,'MM

———————

06/18/2012 15:21:17

एसक्यूएल>/

TO_CHAR(SYSDATE,'MM

———————

06/18/2012 15:21:50

आप देख सकते हैं कि मैंने दूसरी और तीसरी बार सिर्फ '/' टाइप किया और एंटर दबाएं और एसक्यूएल*प्लस ने हर बार इसके कमांड बफर की सामग्री को निष्पादित किया।

PL/SQL ब्लॉक

सेमी-कोलन स्टेटमेंट टर्मिनेटर ने अपने आप में ठीक काम किया जब तक कि Oracle ने Oracle संस्करण 7 में PL/SQL को पेश नहीं किया। समस्या यह है कि PL/SQL ब्लॉक में उस ब्लॉक को बनाने वाले अलग-अलग स्टेटमेंट को समाप्त करने के लिए कई सेमी-कॉलन हो सकते हैं। इस बहुत ही सरल PL/SQL ब्लॉक पर विचार करें जो कुछ भी नहीं करता है:

SQL> प्रारंभ

2 शून्य;

3 शून्य;

4 छोर;

5

पंक्ति 2 और 3 में पूरी तरह से मान्य कथन हैं, जिनमें से प्रत्येक को अर्ध-बृहदान्त्र के साथ समाप्त किया गया है। और पंक्ति 4 में, हमारे पास PL/SQL ब्लॉक के अंत को दर्शाने वाला END कीवर्ड है। अगर हमें नेस्टेड BEGIN/END जोड़े की अनुमति नहीं थी, तो हर बार SQL*Plus "END;" देखता है। यह पता चल जाएगा कि PL/SQL ब्लॉक का अंत हो गया है, लेकिन हमें नेस्टेड BEGIN/END जोड़े की अनुमति है, इसलिए निम्नलिखित पूरी तरह से कानूनी और मान्य है:

SQL> प्रारंभ

2 शुरू

3 शून्य;

4 छोर;

5 शून्य;

6 अंत;

7

आप ऊपर से बता सकते हैं कि बस "END" की तलाश है। पर्याप्त नहीं है क्योंकि SQL*Plus ने लाइन 4 के बाद ब्लॉक को चलाने की कोशिश की होगी। तो Oracle ने यह कैसे तय किया कि PL/SQL ब्लॉक निष्पादित करने के लिए तैयार था? उत्तर फ़ॉरवर्ड स्लैश का उपयोग करके है जैसा कि आप पहले से ही जानते होंगे। समझने का दूसरा नियम यह है कि जब आप पीएल/एसक्यूएल ब्लॉक को समाप्त करने के लिए इसका इस्तेमाल करते हैं तो सभी फॉरवर्ड स्लैश कर रहे हैं, बफर में जो है उसे चलाने के लिए एसक्यूएल * प्लस को बताना है! Oracle 7 के लिए PL/SQL बनाए जाने से पहले से यह नहीं बदला है। निम्नलिखित नमूने पर विचार करें:

SQL> प्रारंभ

2 शून्य;

3 छोर;

4/

PL/SQL प्रक्रिया सफलतापूर्वक पूरी हुई।

एसक्यूएल> एल

1 शुरू
2 शून्य;

3* समाप्त;

लाइन 4 पर, मैंने पीएल/एसक्यूएल ब्लॉक को निष्पादित करने के लिए फॉरवर्ड स्लैश टाइप किया। आप देख सकते हैं कि मेरा ब्लॉक सफलतापूर्वक पूरा हुआ। यदि हम वापस जाते हैं और मेरे कमांड बफर की सामग्री को देखते हैं, तो आप देख सकते हैं कि इसमें फॉरवर्ड स्लैश के अलावा सब कुछ है। फॉरवर्ड स्लैश कमांड बफर का हिस्सा नहीं है। तो अब, मैं एक अलग PL/SQL ब्लॉक चलाऊंगा:

SQL> प्रारंभ

2 dbms_output.put_line('आज है'||to_char(sysdate,'MM/DD/YYYY HH24:MI:SS'));

3 छोर;

4/

आज 06/18/2012 15:39:32 है

PL/SQL प्रक्रिया सफलतापूर्वक पूरी हुई।

फ़ॉरवर्ड स्लैश ने SQL*प्लस से कहा कि जो उसके बफ़र में है उसे चलाने के लिए, और परिणाम प्रदर्शित होते हैं। अब बस फिर से स्लैश टाइप करते हैं और हमें अपने PL/SQL ब्लॉक को फिर से निष्पादित होते देखना चाहिए।

एसक्यूएल>/

आज है 06/18/2012 15:40:42

PL/SQL प्रक्रिया सफलतापूर्वक पूरी हुई।

मुझे अपना पीएल/एसक्यूएल ब्लॉक नए सिरे से टाइप करने की आवश्यकता नहीं थी क्योंकि यह वर्तमान में कमांड बफर में है।

PL/SQL और SQL डेवलपर और PL/SQL ब्लॉक

अधिकांश डेवलपर्स के लिए सबसे बड़ी समस्या यह है कि पीएल/एसक्यूएल डेवलपर और एसक्यूएल डेवलपर को आपको फॉरवर्ड स्लैश का उपयोग करने की आवश्यकता नहीं है। क्यों? क्योंकि आप अपने PL/SQL ब्लॉक को चलाने के लिए Execute (F8) या रन स्क्रिप्ट (F5) दबा सकते हैं। PL/SQL डेवलपर जानता है कि जिस क्षण आप F8 दबाते हैं, आप निष्पादित करने के लिए PL/SQL ब्लॉक सबमिट करने का इरादा रखते हैं। इस मामले में, PL/SQL डेवलपर में F8 SQL*Plus में फॉरवर्ड स्लैश के समान कार्य कर रहा है। इसी तरह, SQL डेवलपर में F5 के लिए।

मेरी कंपनी में समस्या यह है कि उत्पादन के लिए कोड की तैनाती करने वाली हमारी टीम पीएल/एसक्यूएल डेवलपर या एसक्यूएल डेवलपर के साथ कोड तैनात नहीं करती है। वे SQL*Plus का उपयोग करते हैं क्योंकि कमांड लाइन टूल के साथ कई निष्पादनों को स्क्रिप्ट करना आसान होता है। कई डेवलपर्स स्क्रिप्ट में पीएल/एसक्यूएल ब्लॉक के लिए फॉरवर्ड स्लैश को शामिल नहीं करने की गलती करते हैं क्योंकि उन्हें इसकी आवश्यकता नहीं है, लेकिन यदि आप उस कोड सेक्शन को एसक्यूएल स्क्रिप्ट में तैनात करना चाहते हैं, तो प्रत्येक पीएल के अंत में फॉरवर्ड स्लैश की आवश्यकता होती है। /एसक्यूएल ब्लॉक।

स्लैश का उपयोग कब नहीं करना है

इसलिए हमने देखा है कि हम फॉरवर्ड स्लैश का उपयोग कब और क्यों करते हैं, लेकिन इसका उपयोग करना कब खराब होता है? जानने का तीसरा नियम यह है कि एक एकल SQL कथन (PL/SQL ब्लॉक में नहीं) के बाद फ़ॉरवर्ड स्लैश का उपयोग करना बुरा है, खासकर जब वह स्लैश तुरंत DML स्टेटमेंट (INSERT, UPDATE, या DELETE) का अनुसरण करता है। अगर मेरी स्क्रिप्ट में निम्नलिखित शामिल हैं:

दोहरे से sysdate चुनें;

/

तब मुझे "डबल आउटपुट" मिलेगा जो कि मैं आमतौर पर एक स्क्रिप्ट में करने का इरादा नहीं रखता। मैं वास्तव में केवल एक पंक्ति लौटाना चाहता हूं, दो नहीं जैसा कि उपरोक्त स्क्रिप्ट करेगी:

SQL> दोहरे से sysdate चुनें;

SYSDATE

———

18-जून-12
एसक्यूएल> //

SYSDATE

———

18-जून-12

यह तब और भी बुरा होता है जब मैं डीएमएल स्टेटमेंट के बाद फॉरवर्ड स्लैश का उपयोग करता हूं क्योंकि उस स्टेटमेंट को दो बार निष्पादित किया जाएगा। निम्नलिखित स्क्रिप्ट पर विचार करें:

test_tab मानों में डालें (10);

/

अब हम जानते हैं कि जब मैं एक स्क्रिप्ट में उपरोक्त दो पंक्तियों को निष्पादित करता हूं, तो SQL * प्लस सेमी-कोलन स्टेटमेंट टर्मिनेटर के कारण इसे एक बार निष्पादित करेगा और फिर दूसरी बार निष्पादित करेगा क्योंकि फॉरवर्ड स्लैश SQL * प्लस को चलाने के लिए कहता है जो इसमें है कमांड बफर। जब मैं उपरोक्त दो-पंक्ति स्क्रिप्ट निष्पादित करता हूं, तो मुझे निम्न आउटपुट मिलता है:

SQL> test_tab मानों में डालें (10);

1 पंक्ति बनाई गई।

एसक्यूएल>

/

test_tab मानों में डालें (10) *

पंक्ति 1 पर त्रुटि:ORA-00001:अद्वितीय बाधा (PEASLAND.SYS_C00767176) का उल्लंघन किया गया

उफ़! पहला इंसर्ट काम किया (1 पंक्ति बनाई गई।) लेकिन जब फॉरवर्ड स्लैश दर्ज किया गया, तो SQL*Plus ने उसी डेटा को सम्मिलित करने का प्रयास किया और मैं एक अद्वितीय बाधा उल्लंघन पर पकड़ा गया।

निष्कर्ष

उम्मीद है, यह पृष्ठ दिखाता है कि फॉरवर्ड स्लैश की आवश्यकता क्यों है, क्या करता है, और इसका उपयोग कब नहीं करना है। संक्षेप में:

  • प्रत्येक PL/SQL ब्लॉक के अंत में फॉरवर्ड स्लैश शामिल करें
  • किसी भी SQL स्टेटमेंट के बाद फॉरवर्ड स्लैश शामिल न करें जो PL/SQL ब्लॉक में नहीं है।
  • एक एसक्यूएल स्टेटमेंट के बाद फॉरवर्ड स्लैश उस एसक्यूएल कमांड को दो बार निष्पादित करेगा।

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle MD5 हैश फ़ंक्शन को कैसे कॉल करें?

  2. ORA-04091:तालिका [blah] उत्परिवर्तित हो रही है, ट्रिगर/फ़ंक्शन इसे नहीं देख सकता है

  3. N+1 अतिरेक और सर्वर समेकन

  4. वर्तमान दृश्य क्या है APPL_TOP स्नैपशॉट

  5. ORACLE और TRIGGERS (सम्मिलित, अद्यतन, हटाए गए)