टिप्पणियों से:
ऐसा नहीं है कि यह कैसे काम करता है।
यह समझने के लिए, आपको यह समझने की आवश्यकता है कि mysql . कैसे सीएलआई - और कोई अन्य प्रोग्राम जो इस तरह डंप फ़ाइल को पढ़ और निष्पादित कर सकता है - वास्तव में इसे संभालता है।
DELIMITER ऐसा कुछ नहीं है जिसे सर्वर समझता है।
DELIMITER क्लाइंट-साइड पार्सर . को बताने के लिए प्रयोग किया जाता है वर्तमान स्टेटमेंट डिलीमीटर क्या होना चाहिए, ताकि क्लाइंट-साइड पार्सर स्टेटमेंट को सही ढंग से विभाजित कर सके और निष्पादन के लिए सर्वर पर एक बार में एक डिलीवर कर सके।
डॉक्स से। ध्यान से नोट करें कि mysql , हर बार इसका उपयोग यहां किया जाता है, mysql . को संदर्भित करता है ग्राहक उपयोगिता -- सर्वर नहीं।
तो, ऐसी फ़ाइल को संभालने के लिए, आपको क्लाइंट-साइड पार्सर की आवश्यकता होती है जो वही काम करता है mysql करता है... और यहां, आप जो कोड लिख रहे हैं वह है (होने की जरूरत है) क्लाइंट-साइड स्टेटमेंट पार्सर। तो आप ही हैं जिन्हें सीमांकक को संभालने के लिए तर्क लिखने की आवश्यकता है।
आप जो चाहते हैं उसे करने के लिए, आपको DELIMITER . की व्याख्या करनी होगी स्टेटमेंट, वर्तमान स्टेटमेंट डिलीमीटर का ट्रैक रखने के लिए उनका उपयोग करें, लेकिन उन्हें सर्वर पर न भेजें।
फिर, आपको एक बार में इनपुट एक लाइन को पढ़ना होगा, जो आपने पढ़ा है उसे बफर करना, जब तक कि आपको लाइन के अंत में निर्दिष्ट डिलीमीटर नहीं मिल जाता है, और परिणामी स्टेटमेंट सर्वर को भेजना होता है - छोड़कर आप जो भेजते हैं उससे वास्तविक विवरण सीमांकक... इसलिए, उदाहरण के लिए, आप अंतिम $$ नहीं भेजेंगे प्रक्रिया निकाय के बाद (जब तक कि वर्तमान विवरण सीमांकक ; . है , जिसे आप या तो भेज सकते हैं या नहीं भेज सकते हैं -- सर्वर परवाह नहीं करता है।) फिर बफ़र खाली करें और फिर से पढ़ना शुरू करें जब तक कि आप एक सीमांकक का एक और उदाहरण नहीं देखते (और सर्वर को स्टेटमेंट भेजें) या एक DELIMITER कथन और अपने कोड के वर्तमान सीमांकक चर को उसका मिलान करने के लिए सेट करें ताकि आप अगले कथन के अंत की सही पहचान कर सकें।