PL/SQL ফাংশন এবং প্রোসিডিউর দুটি গুরুত্বপূর্ণ ধারণা যা ডেটাবেসের কাজের জন্য ব্যবহৃত হয়। ফাংশন এবং প্রোসিডিউর আপনাকে কোডের পুনঃব্যবহারযোগ্যতা বৃদ্ধি করতে, কোডের সঠিকতা নিশ্চিত করতে এবং পরিচালনা সহজ করতে সহায়ক। এই দুটি সম্পর্কিত হলেও, তাদের মধ্যে কিছু মূল পার্থক্য রয়েছে।
১. PL/SQL ফাংশন (Function)
PL/SQL ফাংশন একটি বিশেষ ধরনের সাবপ্রোগ্রাম যা একটি মান (value) ফেরত দেয়। এটি সাধারণত কোন নির্দিষ্ট কাজ সম্পাদন করার জন্য ব্যবহার করা হয় এবং শেষপর্যন্ত একটি মান বা ফলাফল প্রদান করে। ফাংশনকে সাধারণত SELECT স্টেটমেন্টে ব্যবহার করা হয়, বা অন্য কোন প্রোগ্রাম বা কোডের অংশ হিসাবে রিটার্ন ভ্যালু ব্যবহার করতে হয়।
ফাংশনের গঠন:
CREATE [OR REPLACE] FUNCTION function_name
[parameter_list]
RETURN return_type
IS
BEGIN
-- function logic
RETURN value; -- return statement
END function_name;
ফাংশন তৈরি করার উদাহরণ:
CREATE OR REPLACE FUNCTION get_employee_salary (emp_id IN NUMBER)
RETURN NUMBER IS
v_salary NUMBER;
BEGIN
SELECT salary
INTO v_salary
FROM employees
WHERE employee_id = emp_id;
RETURN v_salary; -- return the employee's salary
END get_employee_salary;
এখানে, get_employee_salary নামের একটি ফাংশন তৈরি করা হয়েছে যা একটি emp_id আর্গুমেন্ট গ্রহণ করে এবং ঐ কর্মচারীর বেতন (salary) রিটার্ন করে।
ফাংশন ব্যবহার:
DECLARE
v_salary NUMBER;
BEGIN
-- Function call
v_salary := get_employee_salary(101);
DBMS_OUTPUT.PUT_LINE('Employee Salary: ' || v_salary);
END;
এখানে, get_employee_salary ফাংশনকে কল করে কর্মচারীর বেতন পাওয়া যাচ্ছে এবং তা কনসোলে প্রদর্শন করা হচ্ছে।
২. PL/SQL প্রোসিডিউর (Procedure)
PL/SQL প্রোসিডিউর একটি ডেটাবেস প্রোগ্রাম যা একটি নির্দিষ্ট কাজ বা কাজের গ্রুপ সম্পাদন করে, তবে এটি কোনো মান (value) ফেরত দেয় না। প্রোসিডিউরটি সাধারণত ডেটাবেসে কোনো ডেটা ইনসার্ট, আপডেট বা ডিলিট করার জন্য ব্যবহৃত হয়। এটি ফাংশনের তুলনায় আরও জটিল কাজ করতে সক্ষম।
প্রোসিডিউরের গঠন:
CREATE [OR REPLACE] PROCEDURE procedure_name
[parameter_list]
IS
BEGIN
-- procedure logic
END procedure_name;
প্রোসিডিউর তৈরি করার উদাহরণ:
CREATE OR REPLACE PROCEDURE update_employee_salary (emp_id IN NUMBER, new_salary IN NUMBER) IS
BEGIN
UPDATE employees
SET salary = new_salary
WHERE employee_id = emp_id;
COMMIT; -- Commit the transaction
END update_employee_salary;
এখানে, update_employee_salary নামের একটি প্রোসিডিউর তৈরি করা হয়েছে যা একটি কর্মচারীর বেতন আপডেট করতে ব্যবহৃত হয়।
প্রোসিডিউর ব্যবহার:
BEGIN
-- Procedure call
update_employee_salary(101, 5000);
DBMS_OUTPUT.PUT_LINE('Employee salary updated.');
END;
এখানে, update_employee_salary প্রোসিডিউরটি কল করে কর্মচারীর বেতন পরিবর্তন করা হচ্ছে।
৩. ফাংশন এবং প্রোসিডিউরের মধ্যে পার্থক্য
| ফিচার | ফাংশন (Function) | প্রোসিডিউর (Procedure) |
|---|---|---|
| রিটার্ন ভ্যালু | ফাংশন একটি মান (value) ফেরত দেয়। | প্রোসিডিউর কোনো মান ফেরত দেয় না। |
| ব্যবহার | SELECT স্টেটমেন্টে বা এক্সপ্রেশনে ব্যবহৃত হয়। | সাধারণত ডেটা ম্যানিপুলেশন বা কাজ করার জন্য ব্যবহৃত হয়। |
| কলিং মেথড | ফাংশনকে এক্সপ্রেশন বা স্টেটমেন্টের অংশ হিসাবে কল করা হয়। | প্রোসিডিউরকে EXECUTE বা PL/SQL ব্লকের মাধ্যমে কল করা হয়। |
| ফাংশন এবং প্রোসিডিউর কলের পার্থক্য | কলের পর মান (value) ফেরত আসে। | কলের পর কোন মান ফেরত আসে না। |
৪. Parameter Modes: IN, OUT, IN OUT
ফাংশন এবং প্রোসিডিউরে আর্গুমেন্ট পাস করার সময় IN, OUT, এবং IN OUT মোড ব্যবহার করা হয়। এগুলো আর্গুমেন্টের মান এবং পরিচালনার ধরন নির্ধারণ করে।
- IN: এটি একটি ইনপুট প্যারামিটার, যার মাধ্যমে ফাংশন বা প্রোসিডিউরে ডেটা পাঠানো হয়।
- OUT: এটি একটি আউটপুট প্যারামিটার, যা প্রোসিডিউর বা ফাংশনের মধ্যে মান ফেরত পাঠায়।
- IN OUT: এটি এমন একটি প্যারামিটার, যা ইনপুট এবং আউটপুট উভয় ধরনের ডেটা প্রক্রিয়া করতে ব্যবহৃত হয়।
IN, OUT, IN OUT উদাহরণ:
CREATE OR REPLACE PROCEDURE update_salary (emp_id IN NUMBER, new_salary IN OUT NUMBER) IS
BEGIN
-- Update salary and return the updated salary value
UPDATE employees
SET salary = new_salary
WHERE employee_id = emp_id;
new_salary := new_salary + 1000; -- Increment salary
END update_salary;
এখানে, new_salary আর্গুমেন্টটি IN OUT হিসেবে ঘোষণা করা হয়েছে, অর্থাৎ এটি ইনপুট হিসেবে নতুন বেতন গ্রহণ করবে এবং আউটপুট হিসেবে আপডেট করা বেতন ফেরত দেবে।
৫. Recursive Functions (পুনরাবৃত্ত ফাংশন)
ফাংশনগুলি পুনরাবৃত্তি (recursive) হতে পারে, অর্থাৎ ফাংশন নিজেই নিজেকে কল করতে পারে। এটি সাধারণত এমন সমস্যা সমাধানে ব্যবহৃত হয় যা ছোট অংশে ভাগ করা যায়, যেমন ফিবোনাচ্চি সিকোয়েন্স বা ফ্যাক্টোরিয়াল ক্যালকুলেশন।
Recursive Function Example:
CREATE OR REPLACE FUNCTION factorial (n IN NUMBER) RETURN NUMBER IS
BEGIN
IF n = 0 THEN
RETURN 1;
ELSE
RETURN n * factorial(n - 1); -- Recursive call
END IF;
END factorial;
এখানে, factorial ফাংশনটি পুনরাবৃত্তি করে গুনতে গুনতে ফ্যাক্টোরিয়াল ক্যালকুলেট করছে।
সারাংশ
- ফাংশন (Function): একটি মান ফেরত দেয়, এবং সাধারণত SELECT বা এক্সপ্রেশনে ব্যবহার করা হয়।
- প্রোসিডিউর (Procedure): কোনো মান ফেরত দেয় না, তবে এটি একটি নির্দিষ্ট কাজ সম্পাদন করে (যেমন ডেটা আপডেট করা, ইনসার্ট করা)।
- ফাংশন এবং প্রোসিডিউরের মধ্যে পার্থক্য বুঝে উপযুক্ত ক্ষেত্রে তাদের ব্যবহার করা উচিত।
PL/SQL ফাংশন এবং প্রোসিডিউরের মাধ্যমে আপনি কোডের পুনঃব্যবহারযোগ্যতা বৃদ্ধি করতে পারেন, এবং সিস্টেমের জটিলতা কমিয়ে কার্যক্ষমতা বাড়াতে সহায়ক হতে পারেন।
PL/SQL-এ Function এবং Procedure দুটোই একটি নির্দিষ্ট কার্যকারিতা সম্পাদন করতে ব্যবহৃত হয়, তবে তাদের মধ্যে কিছু গুরুত্বপূর্ণ পার্থক্য রয়েছে। নিচে Function এবং Procedure এর মধ্যে পার্থক্যগুলোর বিস্তারিত ব্যাখ্যা দেওয়া হলো।
১. Function:
একটি Function হল একটি নামকরা ব্লক যা এক বা একাধিক ইনপুট প্যারামিটার গ্রহণ করে এবং একটি মান (value) রিটার্ন করে। এটি সাধারণত গাণিতিক হিসাব, মান যাচাই, অথবা কিছু লজিক্যাল কাজ করার জন্য ব্যবহৃত হয়।
বিশেষত্ব:
- রিটার্ন ভ্যালু: একটি Function সর্বদা একটি মান (value) রিটার্ন করে। এটি একটি একক মান রিটার্ন করতে পারে (যেমন
NUMBER,VARCHAR2,DATEইত্যাদি)। - প্যারামিটার: Function ইনপুট প্যারামিটার গ্রহণ করতে পারে এবং এর মাধ্যমে ক্যালকুলেশন বা প্রসেসিং করে রিটার্ন মান প্রদান করতে পারে।
- ব্যবহার: Function সাধারণত
SELECTস্টেটমেন্টে অথবা এক্সপ্রেশনে ব্যবহৃত হয়। যেমন:SELECT function_name(parameters) FROM dual;
উদাহরণ:
CREATE OR REPLACE FUNCTION calculate_salary (p_emp_id NUMBER)
RETURN NUMBER IS
v_salary NUMBER;
BEGIN
SELECT salary INTO v_salary FROM employees WHERE employee_id = p_emp_id;
RETURN v_salary;
END;
এখানে:
calculate_salaryএকটি Function যাemployee_idএর ভিত্তিতে একজন কর্মচারীর বেতন রিটার্ন করে।
২. Procedure:
একটি Procedure হল একটি নামকরা ব্লক যা এক বা একাধিক ইনপুট প্যারামিটার গ্রহণ করতে পারে, তবে এটি কোনো মান রিটার্ন করে না। এটি সাধারণত কোনো কাজ সম্পাদন করতে ব্যবহৃত হয়, যেমন ডেটাবেসে ইনসার্ট, আপডেট, বা ডিলিট অপারেশন।
বিশেষত্ব:
- রিটার্ন ভ্যালু: একটি Procedure কখনোই কোনো মান রিটার্ন করে না। এটি কাজ করে কিন্তু কোনো ভ্যালু রিটার্ন না করে (তবে
OUTপ্যারামিটার ব্যবহার করে আউটপুট পাঠানো সম্ভব)। - প্যারামিটার: Procedure প্যারামিটার গ্রহণ করতে পারে এবং এই প্যারামিটারগুলির মাধ্যমে কার্যক্রম চালানো হয়।
- ব্যবহার: Procedure সাধারণত SQL স্টেটমেন্টের বাইরে কল করা হয়, যেমন
EXECUTE procedure_name(parameters);
উদাহরণ:
CREATE OR REPLACE PROCEDURE update_salary (p_emp_id NUMBER, p_new_salary NUMBER) IS
BEGIN
UPDATE employees
SET salary = p_new_salary
WHERE employee_id = p_emp_id;
COMMIT;
END;
এখানে:
update_salaryএকটি Procedure যাemployee_idএর ভিত্তিতে একজন কর্মচারীর বেতন আপডেট করে। এটি কোন মান রিটার্ন করে না।
Function এবং Procedure এর পার্থক্য:
| বিষয় | Function | Procedure |
|---|---|---|
| রিটার্ন ভ্যালু | অবশ্যই একটি মান রিটার্ন করে। | কোন মান রিটার্ন করে না। (তবে OUT প্যারামিটার ব্যবহার করে আউটপুট পাঠানো যায়) |
| ব্যবহার | সাধারণত SQL কিউরিতে বা এক্সপ্রেশন হিসেবে ব্যবহার হয়। | সাধারণত কাজ বা কার্যকলাপ সম্পাদন করতে ব্যবহার হয়। |
| প্যারামিটার | ইনপুট প্যারামিটার গ্রহণ করে এবং একটি মান রিটার্ন করে। | ইনপুট, আউটপুট, অথবা ইন/আউট প্যারামিটার গ্রহণ করতে পারে। |
| বিভাগ | সাধারণত গণনা, মান বের করা ইত্যাদির জন্য ব্যবহৃত হয়। | সাধারণত ডেটাবেস অপারেশন (INSERT, UPDATE, DELETE) সম্পাদনের জন্য ব্যবহৃত হয়। |
| SQL এ ব্যবহৃত | SELECT স্টেটমেন্টের অংশ হিসেবে ব্যবহার করা যায়। | সাধারণত EXECUTE স্টেটমেন্ট বা কোড ব্লকের বাইরে কল করা হয়। |
| অফসেটের সুবিধা | একটি একক মান রিটার্ন করে, যা পরবর্তী কাজের জন্য ব্যবহার করা যায়। | অনেক ধরনের কার্যকলাপ একসাথে সম্পাদন করতে পারে, যেমন একাধিক ডেটাবেস অপারেশন। |
সংক্ষেপে:
- Function হল একটি গাণিতিক বা লজিক্যাল ব্লক যা একক মান রিটার্ন করে এবং সাধারণত এক্সপ্রেশন বা
SELECTস্টেটমেন্টের মধ্যে ব্যবহৃত হয়। - Procedure একটি কার্যকরী ব্লক যা একাধিক প্যারামিটার গ্রহণ করতে পারে এবং বিভিন্ন ধরনের কার্যক্রম সম্পাদন করে, তবে কোনো মান রিটার্ন করে না।
আপনার প্রয়োজনে উপযুক্ত ব্যবহার নির্বাচন করে আপনি Function বা Procedure ব্যবহার করতে পারেন।
PL/SQL (Procedural Language for SQL) প্রোগ্রামিং ভাষায় ফাংশন (Function) এবং প্রোসিডিউর (Procedure) দুইটি গুরুত্বপূর্ণ কনসেপ্ট। এই দুটি ব্যবহার করে আপনি SQL এবং PL/SQL-এর কার্যক্রমকে আরও মডুলার ও পুনঃব্যবহারযোগ্য করতে পারেন। এই দুটি প্রোগ্রাম ইউনিটের মধ্যে কিছু মৌলিক পার্থক্য রয়েছে, তবে তাদের কাজের ধরন ও গঠন অনেকটা একই।
এখানে আমরা দেখব কিভাবে ফাংশন এবং প্রোসিডিউর তৈরি এবং ব্যবহার করা যায়।
১. PL/SQL Function
PL/SQL ফাংশন হল এমন একটি প্রোগ্রাম ইউনিট যা একটি নির্দিষ্ট কাজ সম্পাদন করে এবং একটি মান (value) রিটার্ন করে। ফাংশন সাধারণত ব্যবহার করা হয় যখন একটি নির্দিষ্ট কাজ করার পর কোনো মান বা ফলাফল প্রাপ্তি জরুরি থাকে।
ফাংশন তৈরি করার সাধারণ গঠন:
CREATE [OR REPLACE] FUNCTION function_name
(parameter1 datatype, parameter2 datatype, ...)
RETURN return_datatype
IS
BEGIN
-- Function body
RETURN result;
END function_name;
- parameter1, parameter2, ...: ইনপুট প্যারামিটারগুলি (যা ব্যবহারকারীর কাছ থেকে মান গ্রহণ করবে)।
- return_datatype: ফাংশন যে ডেটা টাইপের মান রিটার্ন করবে (যেমন
NUMBER,VARCHAR2,DATE, ইত্যাদি)। - result: রিটার্ন করা মান।
ফাংশন উদাহরণ:
ধরা যাক, একটি ফাংশন তৈরি করতে হবে যা দুটি সংখ্যার যোগফল রিটার্ন করবে:
CREATE OR REPLACE FUNCTION add_numbers (p_num1 NUMBER, p_num2 NUMBER)
RETURN NUMBER
IS
BEGIN
RETURN p_num1 + p_num2;
END add_numbers;
এখানে add_numbers ফাংশন দুটি ইনপুট প্যারামিটার নেয় এবং তাদের যোগফল রিটার্ন করে।
ফাংশন ব্যবহার:
ফাংশন ব্যবহার করার জন্য, আপনি এটি একটি SELECT কুইরি বা PL/SQL ব্লক-এ কল করতে পারেন।
ফাংশন কল করা (PL/SQL ব্লক):
DECLARE
v_result NUMBER;
BEGIN
v_result := add_numbers(10, 20); -- Function call
DBMS_OUTPUT.PUT_LINE('Sum: ' || v_result); -- Display the result
END;
ফাংশন কল করা (SQL কুইরি):
SELECT add_numbers(10, 20) FROM dual;
২. PL/SQL Procedure
PL/SQL প্রোসিডিউর হল একটি প্রোগ্রাম ইউনিট যা একাধিক কাজ সম্পাদন করে কিন্তু এটি কোনো মান রিটার্ন করে না। প্রোসিডিউর সাধারণত ব্যবহৃত হয় যখন একটি নির্দিষ্ট কাজ একাধিক ধাপে সম্পন্ন করতে হয়, কিন্তু কোন ফলাফল বা রিটার্ন মান দরকার নেই।
প্রোসিডিউর তৈরি করার সাধারণ গঠন:
CREATE [OR REPLACE] PROCEDURE procedure_name
(parameter1 datatype, parameter2 datatype, ...)
IS
BEGIN
-- Procedure body
END procedure_name;
- parameter1, parameter2, ...: ইনপুট (IN), আউটপুট (OUT), বা ইন/আউট (IN OUT) প্যারামিটার।
- প্রোসিডিউর রিটার্ন মান দেয় না, তবে তা প্রক্রিয়া সম্পাদন করতে ব্যবহৃত হয়।
প্রোসিডিউর উদাহরণ:
ধরা যাক, একটি প্রোসিডিউর তৈরি করতে হবে যা দুটি সংখ্যা যোগ করে এবং তাদের যোগফল একটি আউটপুট প্যারামিটার হিসেবে ফেরত দেয়।
CREATE OR REPLACE PROCEDURE add_numbers_proc
(p_num1 IN NUMBER, p_num2 IN NUMBER, p_sum OUT NUMBER)
IS
BEGIN
p_sum := p_num1 + p_num2; -- Perform the addition
END add_numbers_proc;
এখানে add_numbers_proc প্রোসিডিউরটি দুটি ইনপুট প্যারামিটার নেয় এবং একটি আউটপুট প্যারামিটার p_sum এ তাদের যোগফল প্রদান করে।
প্রোসিডিউর ব্যবহার:
প্রোসিডিউর ব্যবহার করতে, আপনি EXECUTE স্টেটমেন্ট ব্যবহার করবেন অথবা একটি PL/SQL ব্লক থেকে কল করবেন।
প্রোসিডিউর কল করা (PL/SQL ব্লক):
DECLARE
v_result NUMBER; -- Variable to hold the sum
BEGIN
add_numbers_proc(10, 20, v_result); -- Procedure call
DBMS_OUTPUT.PUT_LINE('Sum: ' || v_result); -- Display the result
END;
প্রোসিডিউর কল করা (SQL কুইরি):
EXEC add_numbers_proc(10, 20, :result);
৩. Function এবং Procedure-এর মধ্যে পার্থক্য
| বৈশিষ্ট্য | Function | Procedure |
|---|---|---|
| রিটার্ন ভ্যালু | একটি একক মান রিটার্ন করে | কোন মান রিটার্ন করে না |
| ব্যবহার | সাধারণত ব্যবহৃত হয় যখন একটি মান প্রয়োজন | সাধারণত ব্যবহৃত হয় যখন অনেক কাজ একত্রে করতে হয় |
| ডেটাবেস কিউরির সাথে ব্যবহার | SELECT কুইরির মাধ্যমে কল করা যেতে পারে | EXECUTE বা CALL দ্বারা কল করা হয় |
| সামান্য কাজ | একক কাজ বা গণনা করা হয় | একাধিক কাজ সম্পাদন করা হয় |
৪. Parameter Modes: IN, OUT, IN OUT
- IN: ইনপুট প্যারামিটার, যা ফাংশন বা প্রোসিডিউরে পাঠানোর সময় সেট করা হয়।
- OUT: আউটপুট প্যারামিটার, যা প্রোসিডিউর বা ফাংশনটি প্রক্রিয়া করার পর ফলাফল ফেরত দেয়।
- IN OUT: ইনপুট এবং আউটপুট প্যারামিটার, যা পাঠানোর সময় একটি মান গ্রহণ করে এবং প্রোসিডিউর বা ফাংশন শেষে মান পরিবর্তন করে ফেরত দেয়।
Parameter Mode উদাহরণ:
CREATE OR REPLACE PROCEDURE update_salary
(p_emp_id IN NUMBER, p_new_salary IN OUT NUMBER)
IS
BEGIN
p_new_salary := p_new_salary * 1.1; -- Increase salary by 10%
END update_salary;
এখানে p_new_salary প্যারামিটারটি IN OUT হিসেবে ব্যবহার করা হয়েছে, যার মান প্রোসিডিউরটি রান করার পর পরিবর্তিত হবে।
৫. Recursive Functions
ফাংশন বা প্রোসিডিউরগুলি recursive হতে পারে, অর্থাৎ একটি ফাংশন বা প্রোসিডিউর নিজেই কল করতে পারে। তবে, আপনি যখন রিকর্শন ব্যবহার করবেন, তখন এটি অবশ্যই একেবারে সঠিকভাবে সীমাবদ্ধ হতে হবে, নতুবা ইনফিনিট লুপ হতে পারে।
রিকর্শন ফাংশনের উদাহরণ:
CREATE OR REPLACE FUNCTION factorial (n NUMBER)
RETURN NUMBER
IS
BEGIN
IF n = 0 THEN
RETURN 1;
ELSE
RETURN n * factorial(n - 1); -- Recursive call
END IF;
END factorial;
এখানে factorial ফাংশনটি একটি সংখ্যা n এর ফ্যাক্টোরিয়াল হিসাব করে।
উপসংহার:
PL/SQL-এ ফাংশন এবং প্রোসিডিউর তৈরি ও ব্যবহার করার মাধ্যমে আপনি আপনার ডেটাবেস অ্যাপ্লিকেশনে মডুলারিটি এবং পুনঃব্যবহারযোগ্যতা আনতে পারবেন। যেখানে ফাংশন একটি মান রিটার্ন করে এবং প্রোসিডিউর একাধিক কাজ সম্পন্ন করে। এগুলির মাধ্যমে আপনি আপনার কোডের কার্যকারিতা বাড়াতে এবং ডেটাবেস অপারেশনগুলোকে আরও কার্যকরী ও নির্ভরযোগ্য করতে পারবেন।
PL/SQL-এ ফাংশন এবং প্রোসিডিউর ব্যবহার করার সময় প্যারামিটার পাস করা হয়, যা ইনপুট এবং আউটপুট ডেটা প্রসেস করতে সাহায্য করে। এই প্যারামিটারগুলো তিনটি প্রধান মোডে থাকে: IN, OUT, এবং IN OUT। এই মোডগুলো ফাংশন বা প্রোসিডিউরের মধ্যে ডেটা স্থানান্তর এবং ব্যবহারের প্রক্রিয়া নির্ধারণ করে।
১. IN Parameter Mode
IN প্যারামিটার হলো ইনপুট প্যারামিটার। এটি ব্যবহারকারী বা কলিং প্রোগ্রাম থেকে একটি মান গ্রহণ করে এবং তা ফাংশন বা প্রোসিডিউরে পাস করা হয়। IN প্যারামিটারগুলি শুধুমাত্র পড়ার জন্য ব্যবহৃত হয়, এর মান পরিবর্তন করা সম্ভব নয়।
উদাহরণ:
CREATE OR REPLACE PROCEDURE GetEmployeeSalary (
emp_id IN NUMBER, -- IN প্যারামিটার
salary OUT NUMBER -- OUT প্যারামিটার
) IS
BEGIN
-- IN প্যারামিটার emp_id ব্যবহার করে employee টেবিল থেকে salary বের করা হচ্ছে
SELECT employee_salary
INTO salary
FROM employees
WHERE employee_id = emp_id;
END;
এখানে, emp_id প্যারামিটারটি একটি IN প্যারামিটার, যা কেবলমাত্র পড়ার জন্য ব্যবহৃত হয়। এটি প্রোসিডিউরের ভিতরে পরিবর্তিত হয় না।
২. OUT Parameter Mode
OUT প্যারামিটার হলো আউটপুট প্যারামিটার। এটি ফাংশন বা প্রোসিডিউরের মাধ্যমে আউটপুট মান ফিরিয়ে দেয়। OUT প্যারামিটারটি ইনপুট হিসেবে ব্যবহার করা যায় না, শুধুমাত্র এটি প্রোগ্রাম বা ফাংশনের আউটপুট হিসেবে ব্যবহৃত হয়।
উদাহরণ:
CREATE OR REPLACE PROCEDURE GetEmployeeSalary (
emp_id IN NUMBER, -- IN প্যারামিটার
salary OUT NUMBER -- OUT প্যারামিটার
) IS
BEGIN
-- employee_id এর ভিত্তিতে salary বের করা এবং OUT প্যারামিটার salary তে সেট করা
SELECT employee_salary
INTO salary
FROM employees
WHERE employee_id = emp_id;
END;
এখানে, salary প্যারামিটারটি একটি OUT প্যারামিটার, যা প্রোগ্রামের বাইরে ফাংশন বা প্রোসিডিউরের মাধ্যমে আউটপুট হিসাবে ফেরত দেওয়া হয়। এই প্যারামিটারটির মান ফাংশন বা প্রোসিডিউরের ভিতরে সেট করা হয়।
৩. IN OUT Parameter Mode
IN OUT প্যারামিটার হলো দ্বৈত (দ্বৈত উদ্দেশ্য) প্যারামিটার, যা ইনপুট এবং আউটপুট উভয় কাজ করতে পারে। এটি ফাংশন বা প্রোসিডিউরে পাস করার সময় একটি মান গ্রহণ করে এবং সেই মানটি পরিবর্তন করতে পারে এবং সেই পরিবর্তিত মানটি আউটপুট হিসেবে ফিরে পাঠানো হয়।
উদাহরণ:
CREATE OR REPLACE PROCEDURE UpdateEmployeeSalary (
emp_id IN NUMBER, -- IN প্যারামিটার
new_salary IN OUT NUMBER -- IN OUT প্যারামিটার
) IS
BEGIN
-- salary আপডেট করার পূর্বে, প্যারামিটার new_salary পড়া হবে
SELECT employee_salary
INTO new_salary
FROM employees
WHERE employee_id = emp_id;
-- salary আপডেট করা হবে এবং new_salary প্যারামিটারটি পরিবর্তিত হবে
UPDATE employees
SET employee_salary = new_salary
WHERE employee_id = emp_id;
-- আপডেট করা salary আউটপুট হিসেবে প্রেরণ করা হচ্ছে
DBMS_OUTPUT.PUT_LINE('Updated Salary: ' || new_salary);
END;
এখানে, new_salary প্যারামিটারটি একটি IN OUT প্যারামিটার। এটি প্রথমে IN হিসাবে ব্যবহৃত হয়, যেখানে পুরানো মানটি পাস করা হয়। তারপর, এটি OUT হিসাবে ব্যবহৃত হয়, যেখানে এর মান পরিবর্তিত হয়ে প্রোগ্রাম থেকে ফেরত আসে।
IN, OUT, এবং IN OUT প্যারামিটার মোডের পার্থক্য:
| মোড | কাজ | প্যারামিটার পরিবর্তন | ব্যবহারের উদাহরণ |
|---|---|---|---|
| IN | ইনপুট প্যারামিটার, মান গ্রহণ করে | পরিবর্তন করা যায় না | emp_id IN NUMBER |
| OUT | আউটপুট প্যারামিটার, মান প্রদান করে | পরিবর্তন করা যায় | salary OUT NUMBER |
| IN OUT | ইনপুট এবং আউটপুট, মান গ্রহণ এবং প্রদান | পরিবর্তন করা যায় | new_salary IN OUT NUMBER |
সারাংশ:
PL/SQL-এ IN, OUT, এবং IN OUT প্যারামিটারগুলো ফাংশন বা প্রোসিডিউরকে ভিন্নভাবে ডেটা প্রক্রিয়া করতে সহায়ক। IN প্যারামিটারটি কেবলমাত্র ইনপুট হিসেবে ব্যবহৃত হয়, OUT প্যারামিটারটি কেবলমাত্র আউটপুট হিসেবে ব্যবহৃত হয়, এবং IN OUT প্যারামিটারটি ইনপুট এবং আউটপুট উভয় কাজ করতে পারে, যার মান প্রোগ্রাম চলাকালীন সময় পরিবর্তন করা যায়।
একটি Recursive Function হল এমন একটি ফাংশন যা নিজেই নিজেকে কল করে। এটি সাধারণত তখন ব্যবহৃত হয়, যখন একটি সমস্যা ছোট অংশে বিভক্ত করে সমাধান করা যায় এবং প্রতিটি অংশের সমাধান একে অপরের উপর নির্ভর করে।
PL/SQL-এ recursive function তৈরি করার সময় এটি খুবই গুরুত্বপূর্ণ যে একটি base case (বেস কেস) বা terminating condition থাকা উচিত, যা নিশ্চিত করবে যে রিকার্সন সীমিত থাকবে এবং ইনফিনিট লুপ তৈরি করবে না।
Recursive Function এর গঠন:
একটি recursive function দুটি অংশে বিভক্ত:
- Base Case (Termination Condition): যখন রিকার্সন থামবে, অর্থাৎ যখন ফাংশন নিজেকে কল করতে থাকবে না।
- Recursive Case: যেখানে ফাংশন নিজেকে আবার কল করবে, যাতে সমস্যা ছোট ছোট অংশে বিভক্ত হতে পারে।
সিনট্যাক্স:
FUNCTION function_name (parameter) RETURN datatype IS
BEGIN
-- Base case
IF (condition) THEN
RETURN value;
ELSE
-- Recursive call
RETURN function_name(parameter);
END IF;
END;
উদাহরণ ১: ফ্যাক্টোরিয়াল (Factorial) গণনা করা
ফ্যাক্টোরিয়াল একটি ক্লাসিক উদাহরণ যেখানে রিকার্সন ব্যবহৃত হয়। একটি সংখ্যা n এর ফ্যাক্টোরিয়াল হল n * (n-1) * (n-2) * ... * 1। এই ফাংশনটি নিজেকে কল করে ছোট ছোট অংশে বিভক্ত হবে, যতক্ষণ না বেস কেস (যেমন n = 1) পৌঁছায়।
ফ্যাক্টোরিয়াল রিকার্সিভ ফাংশন:
CREATE OR REPLACE FUNCTION factorial(n IN NUMBER) RETURN NUMBER IS
BEGIN
-- Base Case: If n is 1, return 1
IF n = 1 THEN
RETURN 1;
ELSE
-- Recursive Case: n * factorial(n-1)
RETURN n * factorial(n-1);
END IF;
END;
ব্যবহার:
DECLARE
v_result NUMBER;
BEGIN
v_result := factorial(5); -- Calling the recursive function
DBMS_OUTPUT.PUT_LINE('Factorial of 5 is: ' || v_result);
END;
Output:
Factorial of 5 is: 120
এখানে, factorial(5) প্রথমে 5 * factorial(4) কল করে, এরপর factorial(4) কল হয় 4 * factorial(3) কল করার জন্য, এবং এইভাবে এটি চলতে থাকে যতক্ষণ না n = 1 (বেস কেস) হয়, যেখানে এটি থেমে গিয়ে 1 ফেরত দেয়।
উদাহরণ ২: Fibonacci সিরিজ
ফিবোনাচ্চি সিরিজ একটি জনপ্রিয় গাণিতিক সিরিজ যেখানে প্রতিটি সংখ্যা আগের দুইটি সংখ্যার যোগফল। উদাহরণস্বরূপ: 0, 1, 1, 2, 3, 5, 8, 13, ...
ফিবোনাচ্চি সিরিজ গণনার জন্য একটি recursive function ব্যবহার করা যেতে পারে।
ফিবোনাচ্চি সিরিজ রিকার্সিভ ফাংশন:
CREATE OR REPLACE FUNCTION fibonacci(n IN NUMBER) RETURN NUMBER IS
BEGIN
-- Base Case: Fibonacci(0) = 0, Fibonacci(1) = 1
IF n = 0 THEN
RETURN 0;
ELSIF n = 1 THEN
RETURN 1;
ELSE
-- Recursive Case: Fibonacci(n) = Fibonacci(n-1) + Fibonacci(n-2)
RETURN fibonacci(n-1) + fibonacci(n-2);
END IF;
END;
ব্যবহার:
DECLARE
v_result NUMBER;
BEGIN
v_result := fibonacci(6); -- Calling the recursive function
DBMS_OUTPUT.PUT_LINE('Fibonacci number at position 6 is: ' || v_result);
END;
Output:
Fibonacci number at position 6 is: 8
এখানে, fibonacci(6) কল করলে এটি প্রথমে fibonacci(5) + fibonacci(4) হিসাব করবে, এবং এইভাবে ছোট ছোট সাব-সমস্যাগুলোর সমাধান করবে।
Recursive Functions এর সুবিধা ও সমস্যা:
সুবিধা:
- সহজ সমস্যা সমাধান: কিছু সমস্যা যেমন ফ্যাক্টোরিয়াল, ফিবোনাচ্চি, ট্রী traversal ইত্যাদি সহজেই রিকার্সন দিয়ে সমাধান করা যায়।
- কম কোড: অনেক ক্ষেত্রে, রিকার্সিভ ফাংশন সাধারণত কম কোডে সমস্যার সমাধান করতে সক্ষম।
- অবজেক্ট-মডেল প্রোগ্রামিং: রিকার্সন অবজেক্ট বা ডেটা স্ট্রাকচার ভিত্তিক সমস্যা সমাধানে কার্যকর হতে পারে (যেমন ট্রী, গ্রাফ ইত্যাদি)।
সমস্যা:
- স্ট্যাক ওভারফ্লো: যদি রিকার্সন খুব গভীর হয়, তাহলে স্ট্যাক ওভারফ্লো হতে পারে। এই কারণে ফাংশনটি অধিক রিকার্সন সীমিত হতে হবে।
- পারফরম্যান্স: রিকার্সিভ ফাংশনগুলো অনেক সময় অকার্যকর হতে পারে, কারণ অনেক সাব-ফাংশন কল হয় এবং এগুলো পুনরাবৃত্তি হতে পারে (যেমন ফিবোনাচ্চি সিরিজে একাধিক বার একই মান হিসাব করা হয়)।
- মেমরি খরচ: রিকার্সন গভীর হতে থাকলে মেমরি ব্যবহার অনেক বেশি হতে পারে।
Recursive Function এ Optimization:
- Memoization: একে অপরকে পুনরাবৃত্তি না করার জন্য ফলাফলগুলো মেমোরিতে সংরক্ষণ করা যায় (যেমন ফিবোনাচ্চি সিরিজে একটি বার হিসাব করা মান পুনরায় ব্যবহার করা)।
- Tail Recursion: PL/SQL সাধারণত tail recursion সমর্থন করে না, কিন্তু আপনি tail recursion স্টাইল ব্যবহার করার মাধ্যমে রিকার্সন সমস্যার কিছুটা সমাধান পেতে পারেন।
সারাংশ:
- Recursive Function হলো এমন একটি ফাংশন যা নিজেকে কল করে এবং এটি সাধারণত একটি সমস্যাকে ছোট ছোট অংশে বিভক্ত করার জন্য ব্যবহার করা হয়।
- Base Case এবং Recursive Case এর মাধ্যমে একটি ফাংশন নিজেকে কল করে এবং একে অপরের উপর নির্ভরশীল সমস্যাগুলোর সমাধান করে।
- ফ্যাক্টোরিয়াল এবং ফিবোনাচ্চি সিরিজের মতো সমস্যা সমাধান করার জন্য রিকার্সন খুবই কার্যকর, তবে এটি কখনও কখনও পারফরম্যান্স ও মেমরি সমস্যার সৃষ্টি করতে পারে।
Read more