मुझे ओरेकल एसक्यूएल में स्लैश बनाम सेमीकोल का उपयोग करने की आवश्यकता कब होती है?


179

हम अपनी कंपनी में इस सप्ताह कुछ बहस कर रहे हैं कि हमें अपनी एसक्यूएल स्क्रिप्ट कैसे लिखनी चाहिए।

पृष्ठभूमि: हमारा डेटाबेस ओरेकल 10 जी है (जल्द ही 11 में अपग्रेड हो रहा है)। हमारी DBA टीम उत्पादन के लिए हमारी लिपियों को तैनात करने के लिए SQLPlus का उपयोग करती है।

अब, हमारे पास हाल ही में एक तैनाती थी जो विफल हो गई क्योंकि इसमें अर्धविराम और फॉरवर्ड स्लैश ( /) दोनों का उपयोग किया गया था । अर्धविराम प्रत्येक कथन के अंत में था और स्लेश बयानों के बीच था।

alter table foo.bar drop constraint bar1;
/
alter table foo.can drop constraint can1;
/

स्क्रिप्ट में बाद में कुछ ट्रिगर जोड़े जा रहे थे, कुछ दृश्य और साथ ही कुछ संग्रहीत कार्यविधियाँ भी बनाई गईं। दोनों ;और /कारण प्रत्येक कथन को दो बार चलाने के कारण त्रुटियां होती हैं (विशेषकर आवेषण पर, जिसे विशिष्ट होने की आवश्यकता होती है)।

SQL डेवलपर में ऐसा नहीं होता है, TOAD में ऐसा नहीं होता है। यदि आप कुछ कमांड चलाते हैं तो वे /उनके बिना काम नहीं करेंगे ।

PL / SQL में यदि आपके पास उपप्रोग्राम (DECLARE, BEGIN, END) है तो उपयोग किया जाने वाला अर्धविराम उपप्रोग्राम के हिस्से के रूप में माना जाएगा, इसलिए आपको स्लैश का उपयोग करना होगा।

तो मेरा सवाल यह है: यदि आपका डेटाबेस ओरेकल है, तो आपकी एसक्यूएल स्क्रिप्ट लिखने का उचित तरीका क्या है? चूंकि आप जानते हैं कि आपका DB Oracle है, तो क्या आपको हमेशा इसका उपयोग करना चाहिए /?


1
यदि कोई SQLDeveloper के साथ डेटाबेस निर्यात कर रहा है तो "टर्मिनेटर" नामक एक चेकबॉक्स होता है, जब चयनित प्रत्येक कथन को समाप्त करने के लिए अर्धविराम का उपयोग करता है। इस विकल्प का स्वयं ही चयन हो जाता है। अर्धविराम हटाने और डुप्लीकेट स्टेटमेंट निष्पादन से बचने के लिए अन-सेलेक्ट करें
रुस्लान उरलॉव्स

7
बस इस पुराने धागे को मौत के घाट उतारने के लिए, मैं उल्लेख करूंगा कि SQL भाषा में कोई अर्धविराम नहीं है। यह केवल एसक्यूएल * प्लस में डिफ़ॉल्ट टर्मिनेटर चरित्र (आप सेट कर सकते है sqlterminatorकरने के लिए !अगर आप की तरह) और इस सम्मेलन के अन्य उपकरणों के बाद किया जाता है। पीएल / एसक्यूएल भाषा एक अनिवार्य वाक्यविन्यास तत्व के रूप में अर्धविराम का उपयोग करती है।
विलियम रॉबर्टसन

जवाबों:


31

यह प्राथमिकता की बात है, लेकिन मैं उन लिपियों को देखना पसंद करता हूं जो लगातार स्लैश का उपयोग करते हैं - इस तरह से काम की सभी "इकाइयां" (पीएल / एसक्यूएल ऑब्जेक्ट का निर्माण, पीएल / एसक्यूएल अनाम ब्लॉक चलाना और डीएमएल स्टेटमेंट निष्पादित करना) हो सकता है। आँख से अधिक आसानी से बाहर निकाला।

इसके अलावा, अगर आप अंततः चींटी की तरह तैनाती के लिए आगे बढ़ते हैं, तो यह लक्ष्य की परिभाषा को सरल बना देगा एक सुसंगत कथन का परिसीमन।


1
इस जवाब क्यों की व्याख्या नहीं करता /या ;@a_horse_with_no_name या @Mr_Moneybags का जवाब अधिक संदर्भ के लिए देख
Kay

333

मुझे पता है कि यह एक पुराना धागा है, लेकिन मैं अभी इस पर अड़ा हुआ हूं और मुझे लगता है कि इसे पूरी तरह से समझाया नहीं गया है।

SQL * प्लस में अर्थ के बीच बहुत बड़ा अंतर है /और ;क्योंकि वे अलग तरह से काम करते हैं।

;समाप्त होता है एक एसक्यूएल बयान है, जबकि /कार्यान्वित जो वर्तमान में है "बफ़र"। इसलिए जब आप एक ; और एक /कथन का उपयोग करते हैं तो वास्तव में दो बार निष्पादित किया जाता है।

/कथन को चलाने के बाद आप आसानी से देख सकते हैं :

SQL*Plus: Release 11.2.0.1.0 Production on Wed Apr 18 12:37:20 2012

Copyright (c) 1982, 2010, Oracle.  All rights reserved.

Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning and OLAP options

SQL> drop table foo;

Table dropped.

SQL> /
drop table foo
           *
ERROR at line 1:
ORA-00942: table or view does not exist

इस मामले में एक त्रुटि वास्तव में नोटिस करती है।


लेकिन यह मानते हुए कि इस तरह एक एसक्यूएल स्क्रिप्ट है:

drop table foo;
/

और यह SQL * प्लस के भीतर से चलाया जाता है तो यह बहुत भ्रामक होगा:

SQL*Plus: Release 11.2.0.1.0 Production on Wed Apr 18 12:38:05 2012

Copyright (c) 1982, 2010, Oracle.  All rights reserved.


Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning and OLAP options

SQL> @drop

Table dropped.

drop table foo
           *
ERROR at line 1:
ORA-00942: table or view does not exist

/मुख्य रूप से आदेश बयान है कि एम्बेडेड है चलाने के लिए आवश्यक है ;एक तरह CREATE PROCEDUREबयान।


2
@amis, मैं Oracle में नया हूँ और उसी समस्या में हूँ। यह प्रश्न बहुत उपयोगी है, लेकिन सभी उत्तरों ने "क्यों" के बारे में एक स्पष्टीकरण दिया कि "काम करने के लिए" सबसे अच्छा तरीका नहीं है या इसे हल करने का कोई तरीका है। इसलिए, अगर मुझे सही समझ में आया, तो सिर्फ एक लिपि होने का कोई रास्ता नहीं है और इसे सभी साधनों के लिए प्रयोग करने योग्य रखा जाए ... या क्या आप कोई रास्ता खोजते हैं?
14

5
@ceinmart: "सबसे अच्छा तरीका" SQL स्क्रिप्ट को निष्पादित करने के लिए एक (और केवल एक) उपकरण को परिभाषित करना है - और उस टूल का उपयोग करके किसी स्क्रिप्ट की "शुद्धता" को मान्य किया जाता है। आपकी प्रोग्रामिंग भाषा के लिए एक संकलक या आपके रनटाइम वातावरण (जावा 7, .net 4.0, PHP 5.x, ...) के एक विशिष्ट संकलक के समान
a_horse_with_no_name

1
अच्छा उत्तर। क्या यह सिर्फ मैं है या अन्य DB की तुलना में Oracle नासमझ और पुरातन है? मैंने बहुत सीबेस का उपयोग किया है और यह बहुत अधिक सहज लगता है।
1947

1
@ splashout: ठीक है, यदि आप ऐसे बयान चलाना चाहते हैं, जिसमें डिफ़ॉल्ट सीमांकक ( ;) शामिल है, तो आपको एक वैकल्पिक
परिसीमा

97

मैं ;और के बीच कुछ और उपयोग को स्पष्ट करना चाहता था/

SQLPLUS में:

  1. ; इसका अर्थ है "वर्तमान कथन को समाप्त करें, इसे निष्पादित करें और इसे SQLPLUS बफर में संग्रहीत करें"
  2. <newline>DML (SELECT, UPDATE, INSERT, ...) स्टेटमेंट या कुछ प्रकार के DDL (टेबल्स और व्यूज बनाने के बाद) स्टेटमेंट्स (जिसमें कोई नहीं होता है ;), इसका मतलब है, स्टेटमेंट को बफर में स्टोर करें लेकिन इसे न चलाएं।
  3. /बफर में एक बयान दर्ज करने के बाद (रिक्त के साथ <newline>) का अर्थ है " बफर में डीएमएल या डीडीएल या पीएल / एसक्यूएल चलाएं।
  4. RUNया RSQL में बफ़र को चलाने और चलाने के लिए एक sqlsplus कमांड है। यह एक एसक्यूएल स्टेटमेंट को समाप्त नहीं करेगा।
  5. / DML या DDL या PL / SQL के प्रवेश के दौरान "वर्तमान कथन को समाप्त करें, इसे निष्पादित करें और इसे SQLPLUS बफर में संग्रहीत करें"

नोट: क्योंकि ;पीएल / एसक्यूएल के लिए एक स्टेटमेंट को समाप्त करने के लिए एसक्यूएलपीयूएस का ;उपयोग नहीं किया जा सकता है, जिसका मतलब है कि "वर्तमान स्टेटमेंट को समाप्त करें, इसे निष्पादित करें और इसे SQLPLUS बफर में स्टोर करें" क्योंकि हम चाहते हैं कि संपूर्ण पीएल / एसक्यूएल ब्लॉक पूरी तरह से हो। बफर, फिर इसे निष्पादित करें। पीएल / एसक्यूएल ब्लॉक के साथ समाप्त होना चाहिए:

END;
/

22

लगभग सभी ओरेकल तैनाती SQL * प्लस (जो अजीब डी कमांड लाइन टूल है जो आपके डीबीए का उपयोग करता है) के माध्यम से किया जाता है। और SQL * प्लस में एक अकेला स्लैश मूल रूप से "पिछले SQL या PL / SQL कमांड जिसे मैंने अभी निष्पादित किया है, उसे फिर से निष्पादित करें"।

देख

http://ss64.com/ora/syntax-sqlplus.html

अंगूठे का नियम उन चीजों से स्लैश का उपयोग करना होगा जो आप करते हैं BEGIN .. ENDया जहां आप उपयोग कर सकते हैं CREATE OR REPLACE

आवेषण के लिए जो अद्वितीय उपयोग की आवश्यकता है

INSERT INTO my_table ()
SELECT <values to be inserted>
FROM dual
WHERE NOT EXISTS (SELECT 
                  FROM my_table
                  WHERE <identify data that you are trying to insert>)

14

मेरी समझ से, सभी SQL स्टेटमेंट को आगे स्लैश की आवश्यकता नहीं है क्योंकि वे डीडीएल, डीएमएल, डीसीएल और टीसीएल स्टेटमेंट सहित अर्धविराम के अंत में स्वचालित रूप से चलेंगे।

अन्य पीएल / एसक्यूएल ब्लॉकों के लिए, जिनमें प्रक्रियाएं, कार्य, पैकेज और ट्रिगर शामिल हैं, क्योंकि वे कई लाइन प्रोग्राम हैं, ओरेकल को ब्लॉक को चलाने के लिए जानने का एक तरीका चाहिए, इसलिए हमें प्रत्येक ब्लॉक के अंत में एक फॉरवर्ड स्लैश लिखना होगा। ओरेकल को इसे चलाने दें।


1

मैं केवल प्रत्येक स्क्रिप्ट के अंत में फॉरवर्ड स्लैश का उपयोग करता हूं, ताकि sqlplus को बता सके कि कोड की अधिक लाइनें नहीं हैं। एक स्क्रिप्ट के बीच में, मैं एक स्लैश का उपयोग नहीं करता हूं।


तो क्या आप उन चीजों को ऑर्डर करते हैं, जिनके लिए अंत में / (जैसे सबप्रोग्राम और ट्रिगर्स) की आवश्यकता होती है? यदि आपके पास कई ट्रिगर हैं तो क्या होगा? मैंने एक परीक्षण चलाया और केवल पहला एक निष्पादित करता है जब तक कि इसमें प्रत्येक के बीच एक / नहीं हो। क्या मैं कुछ भूल रहा हूँ?
amischiefr

मैं इससे बचने की कोशिश करता हूं (यदि संभव हो तो), लेकिन अगर मैं (ट्रिगर्स की तरह) नहीं कर सकता, तो मैं अर्धविराम और स्लैश का उपयोग ठीक उसी तरह करता हूं जैसा कि आधिकारिक स्क्रिप्ट में इस्तेमाल किया जाता है जो ओरेकल के नमूने स्कीमा उत्पन्न करते हैं: download.oracle.com/docs /cd/B19306_01/server.102/b14198/… आवेषण समस्या के लिए, मैं उन स्क्रिप्ट को अलग करने का प्रयास करता हूं जो उन लोगों से ऑब्जेक्ट्स बनाते हैं जो तालिकाओं को आबाद करते हैं।
जोनाथन

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