উত্তর:
আপনি স্টোরড ক্রিয়াকলাপগুলিতে সাধারণ এসকিউএল এর সাথে মিশ্রিত করতে পারবেন না, তবে আপনি যে স্টোরেজ ফাংশনটি করতে পারেন তা মিশ্রণ করতে পারবেন না।
উদাহরণস্বরূপ SELECT get_foo(myColumn) FROM mytable
যদি get_foo()
কোনও পদ্ধতি হয় তবে তা বৈধ নয় , তবে আপনি যদি get_foo()
কোনও ফাংশন হন তবে তা করতে পারেন । দামটি হ'ল কার্যবিধির চেয়ে ফাংশনগুলির আরও সীমাবদ্ধতা রয়েছে।
পদ্ধতি এবং কার্যকারণের মধ্যে সর্বাধিক সাধারণ পার্থক্য হ'ল এগুলি আলাদাভাবে এবং বিভিন্ন উদ্দেশ্যে ডাকা হয়:
রুটিন তৈরির জন্য সিনট্যাক্স পদ্ধতি এবং ফাংশনগুলির জন্য কিছুটা পৃথক:
ফাংশনগুলি মান ফেরত দেয়, সুতরাং প্রত্যাবর্তন মূল্যের ডেটা ধরণের নির্দেশ করতে কোনও ফাংশন সংজ্ঞাতে অবশ্যই একটি রিটার্নস ক্লজ থাকতে হবে। এছাড়াও, কলকারকে একটি মান ফেরত দিতে ফাংশন বডির মধ্যে কমপক্ষে একটি রিটার্ন বিবৃতি থাকতে হবে। প্রত্যাবর্তন এবং প্রত্যাবর্তন পদ্ধতি সংজ্ঞাতে উপস্থিত হয় না।
একটি সঞ্চিত প্রক্রিয়া শুরু করতে, ব্যবহার করুন CALL statement
। একটি সঞ্চিত ফাংশন প্রার্থনা করতে, এটি একটি অভিব্যক্তিতে উল্লেখ করুন। এক্সপ্রেশন মূল্যায়নের সময় ফাংশনটি একটি মান দেয়।
একটি পদ্ধতি একটি কল স্টেটমেন্ট ব্যবহার করে শুরু করা হয় এবং আউটপুট ভেরিয়েবলগুলি ব্যবহার করে কেবল ফিরে মানগুলি পাস করতে পারে pass কোনও ফাংশনকে অন্য কোনও ফাংশনের মতোই কোনও বিবৃতিটির ভিতরে থেকে ডেকে আনা যায় (এটি ফাংশনটির নামটি আহ্বান করে) এবং একটি স্কেলারের মান ফিরে আসতে পারে।
IN, OUT, বা INOUT হিসাবে কোনও পরামিতি নির্দিষ্ট করা কেবলমাত্র একটি প্রক্রিয়ার জন্য বৈধ। একটি ফাংশনের জন্য, পরামিতিগুলি সর্বদা IN পরামিতি হিসাবে বিবেচিত হয়।
প্যারামিটার নামের আগে যদি কোনও কীওয়ার্ড না দেওয়া হয় তবে এটি ডিফল্টরূপে একটি IN পরামিতি। সঞ্চিত ফাংশনগুলির জন্য প্যারামিটারগুলি IN, OUT বা INOUT এর আগে হয় না। সমস্ত ফাংশন পরামিতিগুলি IN পরামিতি হিসাবে বিবেচিত হয়।
একটি সঞ্চিত প্রক্রিয়া বা ফাংশন সংজ্ঞায়িত করতে যথাক্রমে তৈরি পদ্ধতি বা ক্রিয়েট ফাংশনটি ব্যবহার করুন:
CREATE PROCEDURE proc_name ([parameters])
[characteristics]
routine_body
CREATE FUNCTION func_name ([parameters])
RETURNS data_type // diffrent
[characteristics]
routine_body
সঞ্চিত প্রক্রিয়াটির জন্য একটি মাইএসকিউএল এক্সটেনশন (ফাংশন নয়) হ'ল কোনও পদ্ধতি ফলাফল ফলাফল, এমনকি একাধিক ফলাফল সেট তৈরি করতে পারে যা কলার একটি নির্বাচন বিবরণের ফলাফল হিসাবে একই পদ্ধতিতে প্রক্রিয়া করে। যাইহোক, এই জাতীয় ফলাফল সেটগুলির বিষয়বস্তু সরাসরি প্রকাশে ব্যবহার করা যায় না।
সঞ্চিত রুটিনগুলি (সঞ্চিত পদ্ধতি এবং সঞ্চিত ফাংশন উভয়কেই উল্লেখ করে) সারণী বা দর্শনগুলির মতো একটি নির্দিষ্ট ডাটাবেসের সাথে যুক্ত। আপনি যখন একটি ডেটাবেস ড্রপ করেন, ডাটাবেসের কোনও সঞ্চিত রুটিনগুলিও বাদ দেওয়া হয়।
সঞ্চিত পদ্ধতি এবং ফাংশনগুলি একই নাম স্থানটি ভাগ করে না। ডাটাবেসে একই নামের একটি প্রক্রিয়া এবং একটি ফাংশন থাকা সম্ভব।
সঞ্চিত পদ্ধতিতে গতিশীল এসকিউএল ব্যবহার করা যেতে পারে তবে ফাংশন বা ট্রিগারগুলিতে নয়।
এসকিউএল প্রস্তুত স্টেটমেন্ট (প্রস্তুতি, এক্সিকিউটি, ডিফলকেট প্রস্তুতি) সঞ্চিত পদ্ধতিতে ব্যবহার করা যেতে পারে তবে সঞ্চিত ফাংশন বা ট্রিগার নয়। সুতরাং, সঞ্চিত ফাংশন এবং ট্রিগারগুলি ডায়নামিক এসকিউএল ব্যবহার করতে পারে না (যেখানে আপনি স্ট্রিং হিসাবে স্টেটমেন্টগুলি তৈরি করেন এবং সেগুলি সম্পাদন করে)। (মাইএসকিউএল সঞ্চিত রুটিনে গতিশীল এসকিউএল)
ফাংশন এবং স্টোরড পদ্ধতির মধ্যে আরও কিছু আকর্ষণীয় পার্থক্য:
( এই বিন্দু হয় একটি তালিকা শেখান থেকে অনুলিপি । ) সঞ্চিত পদ্ধতি সঞ্চালনের পরিকল্পনা যেখানে যেমন ফাংশন নয় precompiled করা হয়। ফাংশন পার্সড এবং রানটাইমে সংকলিত। সঞ্চিত পদ্ধতি, ডাটাবেজে সিউডো কোড হিসাবে সংকলিত অর্থাৎ সংকলিত ফর্ম।
( আমি এই পয়েন্টের জন্য নিশ্চিত নই। )
সঞ্চিত পদ্ধতিতে সুরক্ষা রয়েছে এবং এটি নেটওয়ার্ক ট্র্যাফিককে হ্রাস করে এবং আমরা যে কোনও নম্বরে সঞ্চিত পদ্ধতিতে কল করতে পারি। একবারে অ্যাপ্লিকেশন। উল্লেখ
কার্যকারিতা সাধারণত গণনাগুলির জন্য ব্যবহৃত হয় যেখানে ব্যবসায়ের যুক্তি সম্পাদনের জন্য প্রক্রিয়া সাধারণত ব্যবহৃত হয়।
ফাংশনগুলি ডাটাবেসের
স্থিতিকে প্রভাবিত করতে পারে না (বিবৃতিগুলি যা স্পষ্টভাবে বা প্রকৃত প্রতিশ্রুতিবদ্ধ বা রোলব্যাক করে তা কার্যক্রমে অনুমোদিত নয়) যেখানে সঞ্চিত পদ্ধতিগুলি প্রতিশ্রুতিবদ্ধ ইত্যাদি ব্যবহার করে ডাটাবেসের অবস্থাকে প্রভাবিত করতে পারে : জে .১। সঞ্চিত রুটিন এবং ট্রিগারগুলিতে বিধিনিষেধ
সঞ্চিত পদ্ধতিগুলি করতে পারে এমন ফাংশনগুলি FLUSH বিবৃতি ব্যবহার করতে পারে না।
স্টোরড ক্রিয়াকলাপগুলি পুনরাবৃত্ত হতে পারে না যেখানে স্টোরড পদ্ধতিগুলি হতে পারে। দ্রষ্টব্য: পুনরাবৃত্তির দ্বারা সঞ্চিত পদ্ধতিগুলি ডিফল্টরূপে অক্ষম থাকে তবে ম্যাক্স_এসপি_রেচার্সন_ডেপথ সার্ভার সিস্টেমকে একটি ননজারো মানকে সেট করে সার্ভারে সক্ষম করা যায়। দেখুন অনুচ্ছেদ 5.2.3, "সিস্টেম ভেরিয়েবল" আরও তথ্যের জন্য।
কোনও সঞ্চিত ফাংশন বা ট্রিগারের মধ্যে, ফাংশন বা ট্রিগারকে অনুরোধ করে এমন বক্তব্য দ্বারা ইতিমধ্যে ব্যবহৃত টেবিলটি (পড়া বা লেখার জন্য) পরিবর্তন করার অনুমতি নেই। ভাল উদাহরণ: এমওয়াইএসকিউএল মুছে ফেলার ক্ষেত্রে একই টেবিলটি কীভাবে আপডেট করবেন?
দ্রষ্টব্য : যদিও কিছু বিধিনিষেধ সাধারনত সঞ্চিত ফাংশন এবং ট্রিগারগুলিতে প্রয়োগ হয় তবে সঞ্চিত প্রক্রিয়াগুলিতে নয়, এই সীমাবদ্ধতাগুলি যদি সঞ্চিত কার্য বা ট্রিগারের মধ্যে থেকে আহ্বান করা হয় তবে সঞ্চিত পদ্ধতিতে প্রযোজ্য। উদাহরণস্বরূপ, যদিও আপনি একটি সঞ্চিত পদ্ধতিতে FLUSH ব্যবহার করতে পারেন, এই জাতীয় সঞ্চিত পদ্ধতিটি কোনও সঞ্চিত কার্য বা ট্রিগার থেকে কল করা যায় না।
একটি উল্লেখযোগ্য পার্থক্য হ'ল আপনি আপনার এসকিউএল কোয়েরিতে একটি ফাংশন অন্তর্ভুক্ত করতে পারেন , তবে সঞ্চিত পদ্ধতিগুলি কেবলমাত্র CALL
বিবৃতি দিয়েই আহ্বান করা যেতে পারে :
ইউডিএফ উদাহরণ:
CREATE FUNCTION hello (s CHAR(20))
RETURNS CHAR(50) DETERMINISTIC
RETURN CONCAT('Hello, ',s,'!');
Query OK, 0 rows affected (0.00 sec)
CREATE TABLE names (id int, name varchar(20));
INSERT INTO names VALUES (1, 'Bob');
INSERT INTO names VALUES (2, 'John');
INSERT INTO names VALUES (3, 'Paul');
SELECT hello(name) FROM names;
+--------------+
| hello(name) |
+--------------+
| Hello, Bob! |
| Hello, John! |
| Hello, Paul! |
+--------------+
3 rows in set (0.00 sec)
স্প্রোক উদাহরণ:
delimiter //
CREATE PROCEDURE simpleproc (IN s CHAR(100))
BEGIN
SELECT CONCAT('Hello, ', s, '!');
END//
Query OK, 0 rows affected (0.00 sec)
delimiter ;
CALL simpleproc('World');
+---------------------------+
| CONCAT('Hello, ', s, '!') |
+---------------------------+
| Hello, World! |
+---------------------------+
1 row in set (0.00 sec)
RETURNS CHAR(50) DETERMINISTIC
?
RETURNS CHAR(50)
রাজ্যের কি ডেটার প্রকারের ফেরত পাঠানো হবে। এই RETURN CONCAT(...
তথ্যটিই ফেরত দেওয়া হচ্ছে। দুটোই দরকার। DETERMINISTIC
রাষ্ট্র প্রয়োজন হয় যে অন্তর্নিহিত তথ্য পরিবর্তন করা হবে।