MySQL में डेलिमिटर


165

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

जवाबों:


246

;फ़ंक्शंस, संग्रहीत कार्यविधियाँ और ट्रिगर करने के दौरान डिफ़ॉल्ट रूप से डिफ़ॉल्ट के अलावा अन्य डिलिमीटर का आमतौर पर उपयोग किया जाता है, जिसमें आपको कई स्टेटमेंट को परिभाषित करना होगा। आप एक अलग परिसीमन $$को परिभाषित करते हैं जैसे कि पूरी प्रक्रिया के अंत को परिभाषित करने के लिए उपयोग किया जाता है, लेकिन इसके अंदर, व्यक्तिगत विवरण प्रत्येक द्वारा समाप्त किए जाते हैं ;। इस तरह, जब कोड mysqlक्लाइंट में चलाया जाता है , तो क्लाइंट यह बता सकता है कि पूरी प्रक्रिया कहां समाप्त होती है और इसे अलग-अलग स्टेटमेंट को निष्पादित करने के बजाय एक इकाई के रूप में निष्पादित करता है।

ध्यान दें कि DELIMITERकीवर्ड केवल कमांड लाइन mysqlक्लाइंट (और कुछ अन्य क्लाइंट) का एक फ़ंक्शन है, न कि एक नियमित MySQL भाषा सुविधा। यदि आप इसे प्रोग्रामिंग भाषा API के माध्यम से MySQL में पास करने का प्रयास करते हैं तो यह काम नहीं करेगा। PHPMyAdmin जैसे कुछ अन्य ग्राहकों के पास एक गैर-डिफ़ॉल्ट सीमांकक निर्दिष्ट करने के लिए अन्य तरीके हैं।

उदाहरण:

DELIMITER $$
/* This is a complete statement, not part of the procedure, so use the custom delimiter $$ */
DROP PROCEDURE my_procedure$$

/* Now start the procedure code */
CREATE PROCEDURE my_procedure ()
BEGIN    
  /* Inside the procedure, individual statements terminate with ; */
  CREATE TABLE tablea (
     col1 INT,
     col2 INT
  );

  INSERT INTO tablea
    SELECT * FROM table1;

  CREATE TABLE tableb (
     col1 INT,
     col2 INT
  );
  INSERT INTO tableb
    SELECT * FROM table2;
  
/* whole procedure ends with the custom delimiter */
END$$

/* Finally, reset the delimiter to the default ; */
DELIMITER ;

DELIMITERएक क्लाइंट के साथ उपयोग करने का प्रयास जो इसका समर्थन नहीं करता है, वह इसे सर्वर पर भेजा जाएगा, जो एक सिंटैक्स त्रुटि की रिपोर्ट करेगा। उदाहरण के लिए, PHP और MySQLi का उपयोग करना:

$mysqli = new mysqli('localhost', 'user', 'pass', 'test');
$result = $mysqli->query('DELIMITER $$');
echo $mysqli->error;

त्रुटियों के साथ:

आपके SQL सिंटैक्स में कोई त्रुटि है; लाइन पर 'DELIMITER $ $' के पास उपयोग करने के लिए सही सिंटैक्स के लिए अपने MySQL सर्वर संस्करण से मेल खाती पुस्तिका की जाँच करें 1


3
ऐसे परिदृश्य क्या हैं जहां यह एक सीमांकक का उपयोग करने के लिए समझ में आता है? मैं वास्तव में यह नहीं मिला।
System.Data

2
@ System.Data मेरे उत्तर का पहला वाक्य - संग्रहीत प्रक्रियाओं, कस्टम फ़ंक्शंस और ट्रिगर्स को परिभाषित करते समय। किसी भी समय कई बयानों को MySQL कमांड लाइन पर एक इकाई के रूप में निष्पादित किया जाता है।
माइकल बर्कोव्स्की

2
ध्यान दें कि DELIMITER कमांड PhpMyAdmin SQL (कम से कम, कुछ संस्करण) से काम नहीं करता है। इसके बजाय, आप सीमांकक को अलग क्षेत्र में SQL पर ही सेट कर सकते हैं। यह मुझे काफी समय से उलझन में था ... :-)
अत्यधिक अनियमित

1
@MichaelBerkowski, उम्मीद है कि हम भविष्य में इसे करने का एक तरीका प्राप्त करेंगे।
पचेरियर

1
@StockB यह जवाब वास्तव में नहीं था कि संग्रहीत कार्यविधियाँ क्यों फायदेमंद हैं, "एक इकाई" का उल्लेख संदर्भित करता है कि कैसे MySQL सपा को व्याख्या करने में सक्षम होगा जब इसे पार्स करते हैं: सीमांकक द्वारा इकाई सीमाओं का पता लगाएं, फिर व्यक्तिगत बयानों को पार्स करें। लेकिन जब से आपने पूछा, मल्टी-स्टेटमेंट एसपी का उपयोग करने से आपको एसपी को कॉल करने वाले एप्लिकेशन से कार्यान्वयन विवरण छिपाने की अनुमति मिलेगी। जब तक यह एक सुसंगत परिणाम देता है तब तक एप्लिकेशन कोड को SQL द्वारा निष्पादित (और यदि आवश्यक हो तो आप इसे बदल सकते हैं) से संबंधित होने की आवश्यकता नहीं है। कोड में एक समारोह की तरह।
माइकल बर्कोव्स्की

21

DELIMITER कथन मानक परिसीमन को परिवर्तित करता है जो अर्धविराम (;) से दूसरे में है। सीमांकक (?) से परिसीमन को डबल-स्लैश // में बदल दिया जाता है।

हमें परिसीमन को क्यों बदलना होगा?

क्योंकि हम एक बार में प्रत्येक कथन की व्याख्या करने के लिए mysql टूल को अनुमति देने के बजाय सर्वर के रूप में संग्रहीत कार्यविधि, कस्टम फ़ंक्शन आदि को पास करना चाहते हैं।


13

जब आप एक संग्रहीत दिनचर्या बनाते हैं जिसमें एक BEGIN...ENDब्लॉक होता है, तो ब्लॉक के भीतर बयान अर्धविराम द्वारा समाप्त हो जाते हैं (;)। लेकिन CREATE PROCEDUREबयान के लिए एक टर्मिनेटर की भी जरूरत होती है। तो यह अस्पष्ट हो जाता है कि क्या दिनचर्या के शरीर के भीतर अर्धविराम CREATE PROCEDUREप्रक्रिया के शरीर के भीतर एक बयान को समाप्त करता है , या समाप्त करता है।

अस्पष्टता को हल करने का तरीका एक अलग स्ट्रिंग घोषित करना है (जो कि प्रक्रिया के शरीर के भीतर नहीं होनी चाहिए) जिसे MySQL क्लाइंट CREATE PROCEDUREकथन के लिए सही टर्मिनेटर के रूप में पहचानता है ।


1
यह सबसे अच्छा जवाब है क्योंकि यह DELIMITER को सरल तरीके से उपयोग करने का सही कारण बता रहा है और बिना किसी भ्रम के। धन्यवाद
फखर अनवर

6

सीमांकक वर्ण या वर्ण का स्ट्रिंग है जिसका उपयोग आप MySQL क्लाइंट को बताने के लिए करेंगे कि आपने Sql कथन में टाइपिंग पूरी कर ली है।


5

आप स्टेटमेंट, फंक्शन्स, स्टोर की हुई प्रक्रियाओं या ट्रिगर्स को पूरे स्टेटमेंट के रूप में व्यवहार करने के लिए mysql क्लाइंट को बताने के लिए एक DELIMITER को परिभाषित करते हैं। आम तौर पर एक .sql फ़ाइल में आप $ $ की तरह एक अलग DELIMITER सेट करते हैं। DELIMITER कमांड का उपयोग MySQL कमांड (यानी;) के मानक सीमांकक को बदलने के लिए किया जाता है। जैसा कि रूटीन (फ़ंक्शन, संग्रहीत कार्यविधियाँ या ट्रिगर) के भीतर बयान एक अर्ध-कोलोन (?) के साथ समाप्त होते हैं, उन्हें एक कंपाउंड स्टेटमेंट के रूप में माना जाता है जिसे हम DELIMITER का उपयोग करते हैं। यदि एक ही फ़ाइल या कमांड लाइन में विभिन्न रूटीन का उपयोग करते समय परिभाषित नहीं किया गया है, तो यह सिंटैक्स त्रुटि देगा।

ध्यान दें कि आप अपने स्वयं के कस्टम सीमांकक बनाने के लिए विभिन्न प्रकार के गैर-आरक्षित वर्णों का उपयोग कर सकते हैं। आपको बैकस्लैश (\) वर्ण के उपयोग से बचना चाहिए क्योंकि यह MySQL के लिए एस्केप कैरेक्टर है।

DELIMITER वास्तव में एक MySQL भाषा कमांड नहीं है, यह एक क्लाइंट कमांड है।

उदाहरण

DELIMITER $$

/*This is treated as a single statement as it ends with $$ */
DROP PROCEDURE IF EXISTS `get_count_for_department`$$

/*This routine is a compound statement. It ends with $$ to let the mysql client know to execute it as a single statement.*/ 
CREATE DEFINER=`student`@`localhost` PROCEDURE `get_count_for_department`(IN the_department VARCHAR(64), OUT the_count INT)
BEGIN
    
    SELECT COUNT(*) INTO the_count FROM employees where department=the_department;

END$$

/*DELIMITER is set to it's default*/
DELIMITER ;

आप अपने mysql प्रक्रिया कोड की सीमा को परिभाषित करने के लिए सीमांकक जोड़ सकते हैं। अधिक विस्तार के लिए मेरी ट्यूटोरियल के अंतिम अनुभाग को देखें techflirt.com/mysql-stored-procedure-tutorial
अंकुर कुमार सिंह

1

संपूर्ण विवरण के रूप में कथन, कार्य, संग्रहीत कार्यविधियाँ या ट्रिगर करने के लिए mysql क्लाइंट को बताने के लिए DELIMITER। आम तौर पर ए में। sql फ़ाइल आपने $ DEL जैसे एक अलग DELIMITER सेट की है। DELIMITER कमांड का उपयोग MySQL कमांड के मानक सीमांकक को बदलने के लिए किया जाता है


1

सीमांकक SQL में एक चरित्र है जो डेटाबेस में डेटा आइटम को अलग करने के लिए उपयोग किया जाता है। यह चरित्र स्ट्रिंग की शुरुआत और अंत की पहचान करता है। आम तौर पर, एसक्यूएल में इस्तेमाल किया जाने वाला सीमांकक ';' है।

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