মাইএসকিউএল সঞ্চিত পদ্ধতি বনাম ফাংশন, আমি কখন ব্যবহার করব?


160

আমি মাইএসকিউএল সঞ্চিত পদ্ধতি এবং ফাংশনটি দেখছি। আসল পার্থক্য কী?

এগুলি দেখতে অনুরূপ, তবে একটি ফাংশনের আরও সীমাবদ্ধতা রয়েছে।

আমি সম্ভবত ভুল, তবে মনে হয় একটি সঞ্চিত পদ্ধতিটি সব কিছু করতে পারে এবং একটি সঞ্চিত ফাংশনটি পারে। কেন / কখন আমি একটি কার্য বনাম কোনও প্রক্রিয়া ব্যবহার করব?

উত্তর:


101

আপনি স্টোরড ক্রিয়াকলাপগুলিতে সাধারণ এসকিউএল এর সাথে মিশ্রিত করতে পারবেন না, তবে আপনি যে স্টোরেজ ফাংশনটি করতে পারেন তা মিশ্রণ করতে পারবেন না।

উদাহরণস্বরূপ SELECT get_foo(myColumn) FROM mytableযদি get_foo()কোনও পদ্ধতি হয় তবে তা বৈধ নয় , তবে আপনি যদি get_foo()কোনও ফাংশন হন তবে তা করতে পারেন । দামটি হ'ল কার্যবিধির চেয়ে ফাংশনগুলির আরও সীমাবদ্ধতা রয়েছে।


18
ফাংশনগুলির কি ধরণের সীমাবদ্ধতা রয়েছে?
ফ্যান্টিয়াস

11
আহ, আমি এখানে কিছু ভাল তথ্য পেয়েছি: dev.mysql.com/doc/refman/5.0/en/…
ফ্যানটিয়াস অক্টোব

262

পদ্ধতি এবং কার্যকারণের মধ্যে সর্বাধিক সাধারণ পার্থক্য হ'ল এগুলি আলাদাভাবে এবং বিভিন্ন উদ্দেশ্যে ডাকা হয়:

  1. একটি পদ্ধতি একটি মান দেয় না। পরিবর্তে, কোনও সারণি পরিবর্তন করা বা পুনরুদ্ধারকৃত রেকর্ডগুলি প্রক্রিয়াজাতকরণের মতো কোনও ক্রিয়াকলাপ সম্পাদনের জন্য এটি একটি কল স্টেটমেন্টের সাহায্যে আহ্বান জানানো হয়।
  2. একটি ক্রিয়াকলাপটি একটি অভিব্যক্তির মধ্যেই ডেকে আনা হয় এবং অভিব্যক্তিতে ব্যবহৃত কলের কাছে সরাসরি একক মান প্রদান করে।
  3. আপনি একটি কল বিবৃতি দিয়ে একটি ফাংশন প্রার্থনা করতে পারবেন না, বা আপনি একটি অভিব্যক্তি পদ্ধতিতে প্রার্থনা করতে পারেন।

রুটিন তৈরির জন্য সিনট্যাক্স পদ্ধতি এবং ফাংশনগুলির জন্য কিছুটা পৃথক:

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

    • একটি সঞ্চিত প্রক্রিয়া শুরু করতে, ব্যবহার করুন 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

সঞ্চিত প্রক্রিয়াটির জন্য একটি মাইএসকিউএল এক্সটেনশন (ফাংশন নয়) হ'ল কোনও পদ্ধতি ফলাফল ফলাফল, এমনকি একাধিক ফলাফল সেট তৈরি করতে পারে যা কলার একটি নির্বাচন বিবরণের ফলাফল হিসাবে একই পদ্ধতিতে প্রক্রিয়া করে। যাইহোক, এই জাতীয় ফলাফল সেটগুলির বিষয়বস্তু সরাসরি প্রকাশে ব্যবহার করা যায় না।

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

সঞ্চিত পদ্ধতি এবং ফাংশনগুলি একই নাম স্থানটি ভাগ করে না। ডাটাবেসে একই নামের একটি প্রক্রিয়া এবং একটি ফাংশন থাকা সম্ভব।

সঞ্চিত পদ্ধতিতে গতিশীল এসকিউএল ব্যবহার করা যেতে পারে তবে ফাংশন বা ট্রিগারগুলিতে নয়।

এসকিউএল প্রস্তুত স্টেটমেন্ট (প্রস্তুতি, এক্সিকিউটি, ডিফলকেট প্রস্তুতি) সঞ্চিত পদ্ধতিতে ব্যবহার করা যেতে পারে তবে সঞ্চিত ফাংশন বা ট্রিগার নয়। সুতরাং, সঞ্চিত ফাংশন এবং ট্রিগারগুলি ডায়নামিক এসকিউএল ব্যবহার করতে পারে না (যেখানে আপনি স্ট্রিং হিসাবে স্টেটমেন্টগুলি তৈরি করেন এবং সেগুলি সম্পাদন করে)। (মাইএসকিউএল সঞ্চিত রুটিনে গতিশীল এসকিউএল)

ফাংশন এবং স্টোরড পদ্ধতির মধ্যে আরও কিছু আকর্ষণীয় পার্থক্য:

  1. ( এই বিন্দু হয় একটি তালিকা শেখান থেকে অনুলিপি ) সঞ্চিত পদ্ধতি সঞ্চালনের পরিকল্পনা যেখানে যেমন ফাংশন নয় precompiled করা হয়। ফাংশন পার্সড এবং রানটাইমে সংকলিত। সঞ্চিত পদ্ধতি, ডাটাবেজে সিউডো কোড হিসাবে সংকলিত অর্থাৎ সংকলিত ফর্ম।

  2. ( আমি এই পয়েন্টের জন্য নিশ্চিত নই। )
    সঞ্চিত পদ্ধতিতে সুরক্ষা রয়েছে এবং এটি নেটওয়ার্ক ট্র্যাফিককে হ্রাস করে এবং আমরা যে কোনও নম্বরে সঞ্চিত পদ্ধতিতে কল করতে পারি। একবারে অ্যাপ্লিকেশন। উল্লেখ

  3. কার্যকারিতা সাধারণত গণনাগুলির জন্য ব্যবহৃত হয় যেখানে ব্যবসায়ের যুক্তি সম্পাদনের জন্য প্রক্রিয়া সাধারণত ব্যবহৃত হয়।

  4. ফাংশনগুলি ডাটাবেসের
    স্থিতিকে প্রভাবিত করতে পারে না (বিবৃতিগুলি যা স্পষ্টভাবে বা প্রকৃত প্রতিশ্রুতিবদ্ধ বা রোলব্যাক করে তা কার্যক্রমে অনুমোদিত নয়) যেখানে সঞ্চিত পদ্ধতিগুলি প্রতিশ্রুতিবদ্ধ ইত্যাদি ব্যবহার করে ডাটাবেসের অবস্থাকে প্রভাবিত করতে পারে : জে .১। সঞ্চিত রুটিন এবং ট্রিগারগুলিতে বিধিনিষেধ

  5. সঞ্চিত পদ্ধতিগুলি করতে পারে এমন ফাংশনগুলি FLUSH বিবৃতি ব্যবহার করতে পারে না।

  6. স্টোরড ক্রিয়াকলাপগুলি পুনরাবৃত্ত হতে পারে না যেখানে স্টোরড পদ্ধতিগুলি হতে পারে। দ্রষ্টব্য: পুনরাবৃত্তির দ্বারা সঞ্চিত পদ্ধতিগুলি ডিফল্টরূপে অক্ষম থাকে তবে ম্যাক্স_এসপি_রেচার্সন_ডেপথ সার্ভার সিস্টেমকে একটি ননজারো মানকে সেট করে সার্ভারে সক্ষম করা যায়। দেখুন অনুচ্ছেদ 5.2.3, "সিস্টেম ভেরিয়েবল" আরও তথ্যের জন্য।

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

দ্রষ্টব্য : যদিও কিছু বিধিনিষেধ সাধারনত সঞ্চিত ফাংশন এবং ট্রিগারগুলিতে প্রয়োগ হয় তবে সঞ্চিত প্রক্রিয়াগুলিতে নয়, এই সীমাবদ্ধতাগুলি যদি সঞ্চিত কার্য বা ট্রিগারের মধ্যে থেকে আহ্বান করা হয় তবে সঞ্চিত পদ্ধতিতে প্রযোজ্য। উদাহরণস্বরূপ, যদিও আপনি একটি সঞ্চিত পদ্ধতিতে FLUSH ব্যবহার করতে পারেন, এই জাতীয় সঞ্চিত পদ্ধতিটি কোনও সঞ্চিত কার্য বা ট্রিগার থেকে কল করা যায় না।


2
@ গ্রিজেশচৌহান, আপনি যখন "রানটাইমের সময় ফাংশন পার্সড এবং সংকলন" বলছেন তখন আপনার অর্থ কী ?
পেসারিয়ার

@ পেসারিয়ার অর্থ মাইএসকিউএল-এ ফাংশনগুলি হ'ল স্ক্রিপ্টগুলির মতো কিছু those আমি এটি কোনও ব্লগ পোস্ট থেকে অনুলিপি করেছি , তবে এই আচরণগুলি নিরীক্ষণের জন্য কোনও ব্যবহারিক প্রয়োগ করিনি।
গ্রিজেশ চৌহান

পদ্ধতিতে আপনি প্যারামিটার হিসাবে একটি আউট ভেরিয়েবল পাস করতে পারেন, তারপরে এটিকে একটি নির্বাচনী বিবৃতি দিয়ে কল করুন
LTroya

1
বুলেট পয়েন্ট # 4 এই উত্তরের নীচের বিভাগে, আমি মনে করি, পদ্ধতি এবং কার্যকারিতা মধ্যে পার্থক্য মূল। পদ্ধতিগুলি ডাটাবেস পরিবর্তন করতে পারে, ফাংশনগুলি পারে না। অন্যান্য সমস্ত পার্থক্য কেবল আরও কার্যকরভাবে সেই উদ্দেশ্যে পরিবেশন করা।
উড্রো বার্লো

51

একটি উল্লেখযোগ্য পার্থক্য হ'ল আপনি আপনার এসকিউএল কোয়েরিতে একটি ফাংশন অন্তর্ভুক্ত করতে পারেন , তবে সঞ্চিত পদ্ধতিগুলি কেবলমাত্র 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)

1
আপনার ফাংশন দুটি রিটার্ন আছে ? মানে এই লাইনটা কি? RETURNS CHAR(50) DETERMINISTIC?
মার্টিন এজে

RETURNS CHAR(50)রাজ্যের কি ডেটার প্রকারের ফেরত পাঠানো হবে। এই RETURN CONCAT(...তথ্যটিই ফেরত দেওয়া হচ্ছে। দুটোই দরকার। DETERMINISTICরাষ্ট্র প্রয়োজন হয় যে অন্তর্নিহিত তথ্য পরিবর্তন করা হবে।
lemming622

8

একটি সঞ্চিত ফাংশন একটি ক্যোয়ারির মধ্যে ব্যবহার করা যেতে পারে। তারপরে আপনি এটিকে প্রতিটি সারিতে প্রয়োগ করতে পারেন, বা যেখানে একটি শুল্কের মধ্যে।

CALL ক্যোয়ারী ব্যবহার করে একটি পদ্ধতি কার্যকর করা হয়।


0

সঞ্চিত পদ্ধতিটিকে পুনরাবৃত্তির সাথে বলা যেতে পারে তবে সঞ্চিত ফাংশনটি তা করতে পারে না

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