মাইএসকিউএল-এ ডিলিমিটারগুলি


165

আমি প্রায়শই দেখতে পাই লোকেরা ডিলিমিটার ব্যবহার করছে। আমি নিজেকে চেষ্টা করেছিলাম কী কী সীমানা হয় এবং তাদের উদ্দেশ্য কী। 20 মিনিটের গুগল করার পরেও আমি এমন কোনও উত্তর খুঁজে পাইনি যা আমাকে সন্তুষ্ট করে। সুতরাং, এখন আমার প্রশ্নটি: ডিলিমিটারগুলি কী এবং আমি কখন তাদের ব্যবহার করব?

উত্তর:


245

ডিফল্ট ব্যতীত অন্য ডিলিমিটারগুলি ;সাধারণত ফাংশন, সঞ্চিত পদ্ধতি এবং ট্রিগারগুলির সংজ্ঞা দেওয়ার সময় ব্যবহৃত হয় যেখানে আপনাকে একাধিক বিবৃতি সংজ্ঞায়িত করতে হবে। আপনি একটি পৃথক ডিলিমিটার $$সংজ্ঞায়িত করেন যা পুরো প্রক্রিয়াটির সমাপ্তি সংজ্ঞায়িত করতে ব্যবহৃত হয় তবে এর অভ্যন্তরে পৃথক বিবৃতি প্রতিটি দ্বারা সমাপ্ত হয় ;। এইভাবে, যখন mysqlক্লায়েন্টে কোডটি চালানো হয় তখন ক্লায়েন্টটি সম্পূর্ণ পদ্ধতিটি কোথায় শেষ হয় তা বলতে পারে এবং অভ্যন্তরের স্বতন্ত্র বিবৃতিগুলি সম্পাদন করার পরিবর্তে ইউনিট হিসাবে এটি কার্যকর করতে পারে।

নোট করুন যে DELIMITERকীওয়ার্ডটি কমান্ড লাইন mysqlক্লায়েন্টের (এবং কিছু অন্যান্য ক্লায়েন্ট) কেবল একটি নিয়মিত মাইএসকিউএল ভাষা বৈশিষ্ট্য নয় a আপনি মাইএসকিউএল এ কোনও প্রোগ্রামিং ল্যাঙ্গুয়েজ এপিআইয়ের মাধ্যমে পাস করার চেষ্টা করলে এটি কাজ করবে না। পিএইচপিএমআইএডমিনের মতো আরও কিছু ক্লায়েন্টের অ-ডিফল্ট ডেলিফিটর নির্দিষ্ট করার জন্য অন্যান্য পদ্ধতি রয়েছে।

উদাহরণ:

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এটি সমর্থন না করে এমন কোনও ক্লায়েন্টের সাথে ব্যবহার করার চেষ্টা করা এটি সার্ভারে প্রেরণা সৃষ্টি করবে, যা সিনট্যাক্স ত্রুটির প্রতিবেদন করবে। উদাহরণস্বরূপ, পিএইচপি এবং মাইএসকিউএলি ব্যবহার:

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

এর সাথে ত্রুটিগুলি:

আপনার এসকিউএল সিনট্যাক্সে আপনার একটি ত্রুটি রয়েছে; লাইন 1 এ 'DELIMITER $$' এর কাছাকাছি ডান সিনট্যাক্স ব্যবহারের জন্য আপনার মাইএসকিউএল সার্ভার সংস্করণের সাথে সম্পর্কিত ম্যানুয়ালটি পরীক্ষা করুন


3
এমন একটি পরিস্থিতিতে যেখানে ডিলিমিটারটি ব্যবহার করা বোধগম্য হয়? আমি সত্যিই এটি পেলাম না।
সিস্টেম.ডাটা

2
@ সিস্টেম.ডাটা আমার উত্তরের প্রথম বাক্য - সঞ্চিত পদ্ধতি, কাস্টম ফাংশন এবং ট্রিগারগুলি সংজ্ঞায়িত করার সময়। যে কোনও সময় মাইএসকিউএল কমান্ড লাইনে একক হিসাবে একাধিক বিবৃতি কার্যকর করা হয়।
মাইকেল বারকোভস্কি

2
মনে রাখবেন যে DELIMITER কমান্ড কোনও পিএইচপিএমআইএডমিন এসকিউএল (কমপক্ষে, কিছু সংস্করণ) থেকে কাজ করে না। পরিবর্তে, আপনি এসকিউএল নিজেই পৃথক ক্ষেত্রে ডিলিমিটার সেট করতে পারেন। এটি আমাকে বেশ কিছু সময়ের জন্য বিভ্রান্ত করেছিল ... :-)
হাই অনিয়মিত

1
@ মিশেল বারকোভস্কি, আশা করি আমরা ভবিষ্যতে এটি করার একটি উপায় পেয়ে যাব।
পেসারিয়ার

1
@ স্টকবি এই উত্তরটি কেন সংরক্ষিত পদ্ধতিগুলি উপকারী তা সম্পর্কে সত্যই ছিল না, "এক ইউনিট" উল্লেখ করে মাইএসকিউএল এসপিটি বিশ্লেষণ করার সময় কীভাবে ব্যাখ্যা করতে সক্ষম হবে: ডিলিমিটার দ্বারা ইউনিটের সীমানা চিহ্নিত করুন, তারপরে স্বতন্ত্র বিবৃতিগুলি পার্স করুন। আপনি যেহেতু জিজ্ঞাসা করেছেন, একটি বহু-বিবৃতি এসপি ব্যবহার করে আপনাকে এসপি'র কাছে কল করার অ্যাপ্লিকেশন থেকে প্রয়োগের বিশদটি গোপন করতে দেয়। যতক্ষণ না এটি ধারাবাহিক ফলাফল দেয় ততক্ষণ এসকিউএল কার্যকর করা হয় (এবং আপনি প্রয়োজনে এটি পরিবর্তন করতে পারেন) অ্যাপ্লিকেশন কোডটির সাথে সম্পর্কিত হওয়ার দরকার নেই। ঠিক কোডের মধ্যে একটি ফাংশন মত।
মাইকেল বার্কোভস্কি

21

DELIMITER স্টেটমেন্টটি স্ট্যান্ডার্ড ডিলিমিটারটি পরিবর্তন করে যা সেমিকোলন (;) অন্যকে করে। ডিলিমিটারটি সেমিকোলন (;) থেকে ডাবল-স্ল্যাশে পরিবর্তন করা হয়েছে //।

কেন আমাদের সীমানা পরিবর্তন করতে হবে?

কারণ আমরা স্টোরেজ পদ্ধতি, কাস্টম ফাংশন ইত্যাদি পুরোপুরি সার্ভারের কাছে মাইএসকিএল সরঞ্জামকে এক সাথে প্রতিটি বিবৃতি ব্যাখ্যা করার পরিবর্তে পুরোপুরি পাস করতে চাই।


13

যখন আপনি একটি সঞ্চিত রুটিন তৈরি করেন যার একটি BEGIN...ENDব্লক থাকে, তখন ব্লকের মধ্যে থাকা বিবৃতিগুলি সেমিকোলন দ্বারা সমাপ্ত হয় (;)। তবে CREATE PROCEDUREবিবৃতিতেও একজন টার্মিনেটর প্রয়োজন। সুতরাং রুটিনের দেহের অভ্যন্তরে সেমিকোলনটি প্রক্রিয়াটির শরীরে অন্তর্ভূক্ত হওয়া CREATE PROCEDUREবা বিবৃতিগুলির কোনও একটিকে সমাপ্ত করে কিনা তা দ্ব্যর্থক হয়ে ওঠে ।

অস্পষ্টতা সমাধানের উপায় হ'ল মাইএসকিউএল ক্লায়েন্টটি CREATE PROCEDUREবিবৃতিটির সত্যিকারের টার্মিনেটর হিসাবে স্বীকৃত একটি স্বতন্ত্র স্ট্রিং (যা প্রক্রিয়ার মূল অংশের মধ্যে উপস্থিত না হওয়া উচিত) ঘোষণা করা ।


1
এটি সর্বোত্তম উত্তর কারণ এটি DELIMITER ব্যবহারের সঠিক কারণটি বলে দিচ্ছে সহজ পদ্ধতিতে এবং কোনও বিভ্রান্তির কারণ ছাড়াই। ধন্যবাদ
ফখর আনোয়ার

6

ডিলিমিটার হ'ল অক্ষরগুলির অক্ষর বা স্ট্রিং যা আপনি মাইএসকিউএল ক্লায়েন্টকে বলার জন্য ব্যবহার করবেন যে আপনি কোনও এসকিএল স্টেটমেন্টে টাইপিং শেষ করেছেন।


5

আপনি একটি বিবরণী, ফাংশন, সঞ্চিত পদ্ধতি বা সম্পূর্ণ বিবৃতি হিসাবে ট্রিগার ট্রিট করতে মাইএসকিএল ক্লায়েন্টকে বলতে একটি DELIMITER সংজ্ঞায়িত করেন। সাধারণত .sql ফাইলে আপনি আলাদা আলাদা করুন DELIMITER এর মতো $$ $$ DELIMITER কমান্ডটি মাইএসকিউএল কমান্ডের (যেমন;) স্ট্যান্ডার্ড ডিলিমিটার পরিবর্তন করতে ব্যবহৃত হয়। রুটিনগুলির মধ্যে বিবৃতিগুলি (ফাংশনগুলি, সঞ্চিত পদ্ধতি বা ট্রিগার) একটি আধা-কোলন (;) দিয়ে শেষ হয়, এটিকে আমরা ব্যবহার করি যৌগিক বিবৃতি হিসাবে বিবেচনা করি DELIMITER। যদি একই ফাইল বা কমান্ড লাইনে বিভিন্ন রুটিন ব্যবহার করার সময় সংজ্ঞা না দেওয়া হয় তবে এটি সিনট্যাক্স ত্রুটি দেবে।

মনে রাখবেন যে আপনি নিজের কাস্টম ডিলিমিটার তৈরি করতে বিভিন্ন ধরণের অনারक्षित অক্ষর ব্যবহার করতে পারেন। আপনার ব্যাকস্ল্যাশ (\) অক্ষর ব্যবহার এড়ানো উচিত কারণ এটি মাইএসকিউএল এর জন্য পালানোর চরিত্র।

DELIMITER আসলে কোনও মাইএসকিউএল ভাষা আদেশ নয়, এটি ক্লায়েন্ট আদেশ।

উদাহরণ

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 ;

আপনি আপনার মাইএসকিএল পদ্ধতি কোডের ব্যাপ্তি নির্ধারণ করতে ডিলিমিটার যুক্ত করতে পারেন। আরো বিস্তারিত জানার জন্য আমার টিউটোরিয়ালের শেষ অধ্যায় পড়ুন দয়া techflirt.com/mysql-stored-procedure-tutorial
অঙ্কুর কুমার সিং

1

DELIMITER মাইএসকিএল ক্লায়েন্টকে বিবৃতি, ফাংশন, সঞ্চিত পদ্ধতি বা সম্পূর্ণ বিবৃতি হিসাবে ট্রিগার হিসাবে আচরণ করতে বলুন। সাধারণত ক। sql ফাইলটি আপনি আলাদা করুন DELIMITER এর মতো set $$ DELIMITER কমান্ডটি মাইএসকিউএল কমান্ডগুলির স্ট্যান্ডার্ড ডিলিমিটার পরিবর্তন করতে ব্যবহৃত হয়


1

ডিলিমিটার এসকিউএল এর একটি চরিত্র যা ডেটাবেসে ডেটা আইটেমগুলি পৃথক করতে ব্যবহৃত হয়। এটি অক্ষরের স্ট্রিংয়ের শুরু এবং শেষ চিহ্নিত করে। সাধারণত, এসকিউএল-তে ব্যবহৃত ডিলিমিটারটি হ'ল ';'।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.