PL/SQL-এ Cursor একটি বিশেষ সুবিধা, যা ডেটাবেস থেকে একাধিক রেকর্ড (বা রো) নির্বাচন এবং প্রক্রিয়াকরণে ব্যবহৃত হয়। Cursor একটি পয়েন্টার, যা SQL স্টেটমেন্টের রেজাল্ট সেটে একটিভ রেকর্ডের দিকে নির্দেশ করে।
PL/SQL-এ দুটি ধরণের Cursor রয়েছে:
- Implicit Cursor (অটো-ক্যারসার): এটি Oracle দ্বারা স্বয়ংক্রিয়ভাবে তৈরি হয় যখন আপনি
SELECT INTOস্টেটমেন্ট বাDML(INSERT, UPDATE, DELETE) স্টেটমেন্ট চালান। - Explicit Cursor (স্পষ্ট ক্যারসার): এটি ব্যবহারকারী দ্বারা নির্দিষ্ট করা হয় এবং তার মাধ্যমে একাধিক রেকর্ড রিটার্ন করা হয়।
১. Implicit Cursor (অটো-ক্যারসার)
Implicit Cursor হল এমন একটি ক্যারসার, যা Oracle দ্বারা স্বয়ংক্রিয়ভাবে ব্যবহৃত হয় যখন কোনো SQL স্টেটমেন্ট (যেমন SELECT INTO, INSERT, UPDATE, DELETE) চালানো হয়। এই ক্যারসারটি ব্যবহারকারীকে সরাসরি পরিচালনা করতে হয় না, Oracle স্বয়ংক্রিয়ভাবে এটি ম্যানেজ করে।
Implicit Cursor এর উদাহরণ:
DECLARE
v_employee_name VARCHAR2(50);
BEGIN
-- SELECT INTO স্টেটমেন্ট চালালে Implicit Cursor ব্যবহার হবে
SELECT employee_name
INTO v_employee_name
FROM employees
WHERE employee_id = 101;
DBMS_OUTPUT.PUT_LINE('Employee Name: ' || v_employee_name);
END;
এখানে, SELECT INTO স্টেটমেন্টটি Implicit Cursor ব্যবহার করছে এবং একক রেকর্ড নির্বাচন করা হচ্ছে।
Implicit Cursor এর সুবিধা:
- এটি স্বয়ংক্রিয়ভাবে তৈরি হয়, তাই ব্যবহারকারীর কোনো নির্দিষ্ট কাজ করার প্রয়োজন নেই।
- সাধারণ ডেটা ম্যানিপুলেশন (যেমন, একক রেকর্ড নির্বাচন বা
DMLঅপারেশন) এর জন্য আদর্শ।
২. Explicit Cursor (স্পষ্ট ক্যারসার)
Explicit Cursor হল এমন একটি ক্যারসার, যা ব্যবহারকারী স্বয়ং তৈরি এবং পরিচালনা করে। এটি সাধারণত বহু রেকর্ডের জন্য ব্যবহার করা হয়, যেখানে ডেটাবেস থেকে একাধিক রেকর্ড নির্বাচন করে তাদের প্রক্রিয়া করা হয়।
Explicit Cursor তৈরি এবং ব্যবহারের ধাপ:
- Cursor Declaration (ক্যারসার ডিক্লেয়ারেশন): একটি ক্যারসার ডিক্লেয়ার করা হয়, যেখানে একটি
SELECTস্টেটমেন্ট থাকবে। - Opening a Cursor (ক্যারসার খোলা): ক্যারসারটি খোলা হয় যাতে তা ডেটার রেজাল্ট সেটে পয়েন্ট করতে পারে।
- Fetching Data (ডেটা ফেচিং): ক্যারসারটি ব্যবহার করে ডেটা নির্বাচন করা হয়।
- Closing the Cursor (ক্যারসার বন্ধ করা): ক্যারসারটি বন্ধ করা হয় যখন কাজ শেষ হয়ে যায়।
Explicit Cursor এর উদাহরণ:
DECLARE
-- Cursor Declaration
CURSOR emp_cursor IS
SELECT employee_id, employee_name
FROM employees
WHERE department_id = 10;
-- Variables to hold the fetched data
v_employee_id employees.employee_id%TYPE;
v_employee_name employees.employee_name%TYPE;
BEGIN
-- Opening the Cursor
OPEN emp_cursor;
-- Fetching the data from the Cursor
LOOP
FETCH emp_cursor INTO v_employee_id, v_employee_name;
EXIT WHEN emp_cursor%NOTFOUND; -- Exit the loop if no more rows are found
DBMS_OUTPUT.PUT_LINE('Employee ID: ' || v_employee_id || ', Name: ' || v_employee_name);
END LOOP;
-- Closing the Cursor
CLOSE emp_cursor;
END;
এখানে:
CURSOR emp_cursor IS— এটি একটি ক্যারসার ডিক্লেয়ারেশন, যা ডিপার্টমেন্ট ১০ এর কর্মচারীদেরemployee_idএবংemployee_nameনির্বাচন করবে।OPEN emp_cursor— ক্যারসারটি খোলা হচ্ছে।FETCH emp_cursor INTO ...— ক্যারসার থেকে ডেটা নিয়ে ভেরিয়েবলে জমা হচ্ছে।EXIT WHEN emp_cursor%NOTFOUND— যখন আর কোনো রেকর্ড পাওয়া যাবে না, তখন লুপ বন্ধ হয়ে যাবে।CLOSE emp_cursor— কাজ শেষ হলে ক্যারসারটি বন্ধ করা হয়।
Explicit Cursor এর সুবিধা:
- একাধিক রেকর্ড পরিচালনার জন্য উপযুক্ত।
- ক্যারসারটি পরিষ্কারভাবে পরিচালনা করা যায় (খোলা, ডেটা ফেচ করা, বন্ধ করা)।
- এটি %FOUND, %NOTFOUND, %ROWCOUNT, এবং %ISOPEN অ্যাট্রিবিউটের মাধ্যমে ক্যারসার সম্পর্কে আরও তথ্য প্রদান করে।
৩. Cursor Attributes
PL/SQL-এ Cursor Attributes ব্যবহার করা হয় ক্যারসারের অবস্থা ট্র্যাক করতে। এগুলি স্বয়ংক্রিয়ভাবে প্রদান করা হয় Oracle দ্বারা এবং ক্যারসারগুলির বিভিন্ন অবস্থা সম্পর্কে তথ্য সরবরাহ করে।
Cursor Attributes:
- %FOUND: এটি বোঝায় যে, ক্যারসারটি কোনো রেকর্ড পেয়েছে কি না।
- %NOTFOUND: এটি বোঝায় যে, ক্যারসারটি কোনো রেকর্ড পায়নি।
- %ROWCOUNT: এটি ক্যারসারটি কতটি রেকর্ড ফেরত দিয়েছে তা দেখায়।
- %ISOPEN: এটি বোঝায় যে ক্যারসারটি খোলা আছে কি না।
Cursor Attributes এর উদাহরণ:
DECLARE
CURSOR emp_cursor IS
SELECT employee_id, employee_name
FROM employees
WHERE department_id = 10;
v_employee_id employees.employee_id%TYPE;
v_employee_name employees.employee_name%TYPE;
BEGIN
OPEN emp_cursor;
LOOP
FETCH emp_cursor INTO v_employee_id, v_employee_name;
EXIT WHEN emp_cursor%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('Employee ID: ' || v_employee_id || ', Name: ' || v_employee_name);
END LOOP;
DBMS_OUTPUT.PUT_LINE('Total Rows Processed: ' || emp_cursor%ROWCOUNT);
CLOSE emp_cursor;
END;
এখানে, emp_cursor%ROWCOUNT ব্যবহার করা হয়েছে মোট কতটি রেকর্ড প্রক্রিয়া করা হয়েছে তা জানার জন্য।
৪. Parameterized Cursors (প্যারামিটারাইজড ক্যারসার)
কিছু ক্ষেত্রে, আপনি ক্যারসার ডিক্লেয়ার করার সময় প্যারামিটার ব্যবহার করতে পারেন, যাতে ডাইনামিকভাবে ডেটা ফেচ করা যায়।
Parameterized Cursor এর উদাহরণ:
DECLARE
-- Parameterized Cursor
CURSOR emp_cursor(p_dept_id NUMBER) IS
SELECT employee_id, employee_name
FROM employees
WHERE department_id = p_dept_id;
v_employee_id employees.employee_id%TYPE;
v_employee_name employees.employee_name%TYPE;
BEGIN
-- Opening the cursor with a parameter
OPEN emp_cursor(10); -- Passing department ID as parameter
LOOP
FETCH emp_cursor INTO v_employee_id, v_employee_name;
EXIT WHEN emp_cursor%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('Employee ID: ' || v_employee_id || ', Name: ' || v_employee_name);
END LOOP;
CLOSE emp_cursor;
END;
এখানে, emp_cursor প্যারামিটার গ্রহণ করে, যা আপনাকে বিভিন্ন ডিপার্টমেন্টের জন্য ক্যারসার খুলতে সহায়তা করবে।
সারাংশ
PL/SQL-এ Cursor একটি শক্তিশালী টুল যা ডেটা নির্বাচন এবং প্রক্রিয়া করার জন্য ব্যবহৃত হয়। Implicit Cursor স্বয়ংক্রিয়ভাবে ব্যবহৃত হয় যখন SQL স্টেটমেন্ট চলানো হয়, এবং Explicit Cursor ব্যবহারকারী দ্বারা নিয়ন্ত্রিত হয়। এছাড়াও, Cursor Attributes এবং Parameterized Cursors এর মাধ্যমে ক্যারসারের কার্যক্রম আরও কার্যকরভাবে পরিচালনা করা যায়। Cursor Management ব্যবহারে ডেটাবেস থেকে একাধিক রেকর্ড নির্বাচন এবং কার্যকরভাবে প্রক্রিয়া করা সম্ভব।
PL/SQL এর Cursor একটি ডেটা-স্ট্রাকচার যা ডেটাবেস থেকে একাধিক সারি (rows) নিয়ে কাজ করতে সহায়ক। যখন SQL কোয়েরি একাধিক রেকর্ড রিটার্ন করে, তখন সেই রেকর্ডগুলির সাথে একে একে কাজ করতে কিউরসর ব্যবহার করা হয়। কিউরসর মূলত একটি pointer হিসেবে কাজ করে যা একে একে রেকর্ডগুলোকে প্রসেস করতে সাহায্য করে।
Cursor এর প্রয়োজনীয়তা:
- Multiple Rows Process করা: সাধারণ SQL স্টেটমেন্টের মাধ্যমে একাধিক সারি থেকে ডেটা নির্বাচিত করা যায়, কিন্তু যদি আপনি সেগুলি একে একে প্রক্রিয়া করতে চান, তবে কিউরসর অপরিহার্য। এটি একসাথে একাধিক সারির সাথে কাজ করতে সক্ষম।
- ফলস্বরূপ সহজতর ব্যবহার: যখন আপনি একটি SQL কুইরি চালান এবং ফলাফলগুলি একাধিক সারির মধ্যে বিভক্ত হয়, তখন কিউরসর সেই সারিগুলি লুপে ব্যবহার করে প্রতিটি রেকর্ডের উপর কাজ করতে সহায়ক।
- Memory Management: Cursor গুলি সারির উপর কাজ করার সময় মেমোরি ব্যবস্থাপনায় সহায়ক। এটি শুধুমাত্র প্রয়োজনীয় রেকর্ড মেমোরিতে লোড করে রাখে, অতিরিক্ত রেকর্ডকে নয়।
- ডাইনামিক প্রসেসিং: কিউরসর ব্যবহার করে ডাইনামিকভাবে রেকর্ডের উপর কাজ করা যায়, যেখানে সারির সংখ্যা এবং ভ্যালু পরিবর্তিত হতে পারে।
Cursor এর ধরন:
Implicit Cursor (অপ্রকাশিত কিউরসর):
- বর্ণনা: SQL কুইরি যখন প্ল/এসকিউএল ব্লকের মাধ্যমে রান হয়, তখন অটোমেটিক্যালি একটি Implicit Cursor তৈরি হয়। ডেটাবেসের দ্বারা তৈরি হয় এবং এটি ব্যবহারকারীর জন্য দৃশ্যমান না।
- প্রয়োজনীয়তা: যখন আপনি সাধারণ SQL কুইরি চালান, যেমন
SELECT,INSERT,UPDATE,DELETE, তখন Implicit Cursor ব্যবহৃত হয়।
উদাহরণ:
BEGIN UPDATE employees SET salary = salary * 1.1 WHERE department_id = 10; END;Explicit Cursor (প্রকাশিত কিউরসর):
- বর্ণনা: এটি ব্যবহারকারীর দ্বারা ডিফাইন করা কিউরসর। Explicit Cursor ব্যবহার করে আপনি একাধিক সারি নিয়ে কাজ করতে পারেন এবং সারির মধ্যে একে একে প্রক্রিয়া করতে পারেন।
- প্রয়োজনীয়তা: যখন আপনাকে একাধিক সারি নিয়ে লুপ চালিয়ে কাস্টম লজিক প্রয়োগ করতে হয়, তখন Explicit Cursor ব্যবহৃত হয়।
Explicit Cursor গঠন:
DECLARE CURSOR cursor_name IS SELECT column_name FROM table_name WHERE condition; record_name cursor_name%ROWTYPE; BEGIN OPEN cursor_name; FETCH cursor_name INTO record_name; WHILE cursor_name%FOUND LOOP -- Process the fetched record DBMS_OUTPUT.PUT_LINE(record_name.column_name); FETCH cursor_name INTO record_name; END LOOP; CLOSE cursor_name; END;
Cursor এর ব্যবহার:
- Cursor Open: Cursor কে
OPENকরলে সেটি ডাটাবেসের সাথে যুক্ত হয় এবং কুইরি রেজাল্টগুলো লোড হয়। - Cursor Fetch:
FETCHকমান্ডের মাধ্যমে একে একে রেকর্ড পাওয়া যায় এবং তা লুপের মাধ্যমে প্রক্রিয়া করা হয়। - Cursor Close: যখন কিউরসর আর প্রয়োজন হয় না, তখন সেটিকে
CLOSEকরা হয় যাতে মেমোরি সাশ্রয় হয়।
Cursor Attributes:
- %FOUND: এটি দেখায় যে, কিউরসরটি কোন রেকর্ড পেয়েছে কিনা।
- %NOTFOUND: এটি দেখায় যে, কিউরসরটি কোন রেকর্ড পায়নি।
- %ROWCOUNT: এটি জানায় কতটি রেকর্ড ফেচ করা হয়েছে।
- %ISOPEN: এটি জানায় যে, কিউরসরটি বর্তমানে খোলা আছে কিনা।
Cursor এর উদাহরণ:
DECLARE
CURSOR employee_cursor IS
SELECT employee_id, first_name, last_name FROM employees WHERE department_id = 10;
emp_record employee_cursor%ROWTYPE;
BEGIN
OPEN employee_cursor;
LOOP
FETCH employee_cursor INTO emp_record;
EXIT WHEN employee_cursor%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('Employee ID: ' || emp_record.employee_id || ', Name: ' || emp_record.first_name || ' ' || emp_record.last_name);
END LOOP;
CLOSE employee_cursor;
END;
এখানে, employee_cursor কিউরসর ব্যবহার করে ডিপার্টমেন্ট আইডি ১০ এর সকল কর্মচারীর তথ্য প্রিন্ট করা হচ্ছে।
সারাংশ:
- Cursor ডেটাবেসে একাধিক সারির উপর কাজ করার জন্য একটি শক্তিশালী টুল।
- Implicit Cursor সাধারণ SQL কুইরির জন্য ব্যবহৃত হয়, এবং Explicit Cursor বেশি কাস্টমাইজড এবং জটিল কুইরির জন্য ব্যবহৃত হয়।
- Cursor Attributes এর মাধ্যমে কিউরসরটির অবস্থান ও ডেটা প্রক্রিয়াকরণের তথ্য পাওয়া যায়।
PL/SQL-এ Cursors হল একটি বিশেষ ধরনের সিস্টেম যা ডেটাবেসের রেকর্ডগুলি প্রক্রিয়া করার জন্য ব্যবহৃত হয়। Cursors ডেটাবেসের তথ্য পেতে এবং সেগুলি প্রোগ্রাম কোডে ব্যবহারের জন্য ব্যবহৃত হয়। সাধারণভাবে, Cursors দুটি প্রকারের হয়: Implicit Cursors এবং Explicit Cursors।
১. Implicit Cursor (অটোমেটিক কার্সর)
Implicit Cursor হল Oracle ডাটাবেস দ্বারা অটোমেটিক্যালি তৈরি করা একটি cursor। যখন আপনি একটি SQL স্টেটমেন্ট (যেমন SELECT, INSERT, UPDATE, DELETE) চালান, তখন Oracle স্বয়ংক্রিয়ভাবে এই Implicit Cursor তৈরি করে। এটি ডেটাবেসের কনফিগারেশন অনুসারে, ডেটা ফেচ করার এবং প্রক্রিয়া করার জন্য কোনো কোড লিখতে হয় না।
বিশেষত্ব:
- স্বয়ংক্রিয়ভাবে তৈরি হয়: Oracle ডাটাবেস যখন একটি
SELECTবাDML(Data Manipulation Language) স্টেটমেন্ট চালায়, তখন এটি অটোমেটিকভাবে একটি Implicit Cursor তৈরি করে। - ডেটা রিটার্নের পর কাজ: এটা সাধারণত একক সারির রেকর্ড বা প্রভাবিত সারির সংখ্যা রিটার্ন করতে ব্যবহৃত হয়।
- পদক্ষেপ নির্ধারণ:
SQL%FOUND,SQL%NOTFOUND,SQL%ROWCOUNTএবংSQL%ISOPENএর মতো system attributes দ্বারা আপনি Implicit Cursor এর অবস্থা চেক করতে পারেন।
উদাহরণ:
DECLARE
v_emp_name VARCHAR2(50);
BEGIN
-- Implicit Cursor for SELECT query
SELECT employee_name INTO v_emp_name
FROM employees
WHERE employee_id = 101;
DBMS_OUTPUT.PUT_LINE('Employee Name: ' || v_emp_name);
END;
এখানে:
SELECTস্টেটমেন্টের জন্য Oracle নিজে থেকেই Implicit Cursor তৈরি করেছে।v_emp_nameভেরিয়েবলে একটি রেকর্ড ফেচ করা হয়েছে।
System Attributes:
SQL%FOUND: যখন কোনো রেকর্ড পাওয়া যায়, তখন এটিTRUEরিটার্ন করে।SQL%NOTFOUND: যখন কোনো রেকর্ড পাওয়া না যায়, তখন এটিTRUEরিটার্ন করে।SQL%ROWCOUNT: প্রভাবিত সারির সংখ্যা প্রদান করে।SQL%ISOPEN: যদি cursor খোলা থাকে, তবে এটিTRUEরিটার্ন করে।
২. Explicit Cursor (স্পষ্ট কার্সর)
Explicit Cursor হল একটি প্ল্যানড এবং কাস্টমাইজড Cursor যা প্রোগ্রামার দ্বারা ম্যানুয়ালি তৈরি করা হয়। এটি তখন ব্যবহৃত হয় যখন আপনি একাধিক রেকর্ড বা বড় ফলাফল সেটের সাথে কাজ করতে চান এবং ফলাফল সেটের উপর নির্দিষ্টভাবে কাজ করতে চান।
বিশেষত্ব:
- ম্যানুয়ালি তৈরি করতে হয়: Explicit Cursor ব্যবহার করার জন্য আপনাকে
DECLARE,OPEN,FETCH, এবংCLOSEস্টেটমেন্টগুলি ম্যানুয়ালি কোডে উল্লেখ করতে হয়। - একাধিক রেকর্ড: এটি একাধিক রেকর্ড ফেচ এবং পরিচালনা করার জন্য ব্যবহৃত হয়।
- ফলাফল সেট পরিচালনা: Explicit Cursor ব্যবহারের সময় আপনি সারি সারি রেকর্ড প্রক্রিয়া করতে পারেন।
Explicit Cursor এর ধাপসমূহ:
- DECLARE: Cursor এর ঘোষণা করা।
- OPEN: Cursor খোলা এবং query চালানো।
- FETCH: Cursor থেকে ডেটা বের করা।
- CLOSE: Cursor বন্ধ করা।
উদাহরণ:
DECLARE
CURSOR emp_cursor IS
SELECT employee_id, employee_name
FROM employees
WHERE department_id = 10;
v_emp_id employees.employee_id%TYPE;
v_emp_name employees.employee_name%TYPE;
BEGIN
OPEN emp_cursor; -- Cursor open
LOOP
FETCH emp_cursor INTO v_emp_id, v_emp_name; -- Fetch data into variables
EXIT WHEN emp_cursor%NOTFOUND; -- Exit loop if no data
DBMS_OUTPUT.PUT_LINE('Employee ID: ' || v_emp_id || ', Name: ' || v_emp_name);
END LOOP;
CLOSE emp_cursor; -- Close cursor
END;
এখানে:
emp_cursorহল একটি Explicit Cursor যাemployeesটেবিল থেকে ডেটা ফেচ করতে ব্যবহৃত হয়েছে।FETCHস্টেটমেন্ট ব্যবহার করে একটি করে রেকর্ড ডেটা বের করা হয় এবংEXITলুপটি ত্যাগ করে যদি কোনো রেকর্ড না থাকে।
System Attributes for Explicit Cursor:
%FOUND: যখন ফেচ করা রেকর্ড সফল হয়, এটিTRUEরিটার্ন করে।%NOTFOUND: যখন ফেচ করা রেকর্ড না থাকে, এটিTRUEরিটার্ন করে।%ROWCOUNT: ফেচ করা সারির সংখ্যা।%ISOPEN: Cursor খোলা থাকলে এটিTRUEরিটার্ন করে।
Implicit এবং Explicit Cursors এর মধ্যে পার্থক্য
| বিষয় | Implicit Cursor | Explicit Cursor |
|---|---|---|
| ডিফিনেশন | স্বয়ংক্রিয়ভাবে তৈরি হয়, কোন কোড লেখা লাগে না। | ম্যানুয়ালি তৈরি এবং পরিচালিত হয়। |
| ব্যবহার | সাধারণত একক SQL স্টেটমেন্টের জন্য ব্যবহৃত। | একাধিক রেকর্ড প্রক্রিয়া করার জন্য ব্যবহৃত। |
| ডেটা ফেচিং | একক রেকর্ড ফেচ করতে ব্যবহৃত। | একাধিক রেকর্ড ফেচ এবং প্রক্রিয়া করতে ব্যবহৃত। |
| রিটার্ন ভ্যালু | শুধুমাত্র একটি একক মান বা রেকর্ড রিটার্ন করে। | একাধিক রেকর্ড রিটার্ন করতে সক্ষম। |
| System Attributes | SQL%FOUND, SQL%NOTFOUND, SQL%ROWCOUNT, SQL%ISOPEN | cursor_name%FOUND, cursor_name%NOTFOUND, cursor_name%ROWCOUNT, cursor_name%ISOPEN |
| স্টেপস | শুধুমাত্র SQL স্টেটমেন্ট চালালেই চলে। | DECLARE, OPEN, FETCH, CLOSE ব্যবহার করতে হয়। |
| প্রকার | স্বয়ংক্রিয় (Implicit)। | ম্যানুয়ালি নির্ধারিত (Explicit)। |
সারাংশ:
- Implicit Cursor হল Oracle দ্বারা স্বয়ংক্রিয়ভাবে তৈরি একটি Cursor যা সাধারণত একক SQL স্টেটমেন্ট (যেমন
SELECT,INSERT,UPDATE,DELETE) কার্যকর করার জন্য ব্যবহৃত হয়। - Explicit Cursor হল একটি কাস্টমাইজড Cursor যা ম্যানুয়ালি তৈরি এবং পরিচালিত হয়, এবং এটি একাধিক রেকর্ড পরিচালনা করতে ব্যবহৃত হয়।
Explicit Cursor ব্যবহার করলে আপনি আরও অনেক বেশি নিয়ন্ত্রণ এবং ফাইন টিউনিং করতে পারবেন, বিশেষ করে যখন একাধিক রেকর্ডের সাথে কাজ করছেন।
PL/SQL কাসরস (Cursors) ব্যবহার করে আপনি SQL কুইরিগুলি এক্সিকিউট করতে পারেন এবং ডেটার প্রতি রেকর্ডে একে একে কাজ করতে পারেন। কাসরসের সাথে কাজ করার সময়, কিছু গুরুত্বপূর্ণ কাসর অ্যাট্রিবিউট ব্যবহার করা হয় যা কাসরের অবস্থা বা ফলাফল সম্পর্কে গুরুত্বপূর্ণ তথ্য প্রদান করে। এই অ্যাট্রিবিউটগুলি বিশেষভাবে ইমপ্লিসিট এবং এক্সপ্লিসিট কাসরদের সাথে ব্যবহৃত হয়।
নীচে কিছু সাধারণ কাসর অ্যাট্রিবিউট সম্পর্কে বিস্তারিত আলোচনা করা হলো:
১. %FOUND
- বর্ণনা:
%FOUNDঅ্যাট্রিবিউটটি চেক করে যে কাসরটি কোনো রেকর্ড পেয়েছে কিনা। এটি একটি বুলিয়ান মান ফেরত দেয়:- TRUE যদি কাসরটি কোনো রেকর্ড পেয়ে থাকে।
- FALSE যদি কাসরটি কোনো রেকর্ড না পায়।
- ব্যবহার: সাধারণত কাসর লুপে বা কাসরকে এক্সিকিউট করার পরে চেক করার জন্য এটি ব্যবহার করা হয়।
উদাহরণ:
DECLARE
CURSOR emp_cursor IS
SELECT employee_id, first_name FROM employees;
v_emp_id employees.employee_id%TYPE;
v_first_name employees.first_name%TYPE;
BEGIN
OPEN emp_cursor;
FETCH emp_cursor INTO v_emp_id, v_first_name;
IF emp_cursor%FOUND THEN
DBMS_OUTPUT.PUT_LINE('Employee found: ' || v_first_name);
ELSE
DBMS_OUTPUT.PUT_LINE('No employee found.');
END IF;
CLOSE emp_cursor;
END;
২. %NOTFOUND
- বর্ণনা:
%NOTFOUNDঅ্যাট্রিবিউটটি%FOUNDএর বিপরীত। এটি চেক করে যে কাসরটি কোনো রেকর্ড পায়নি কিনা। এটি TRUE ফেরত দেয় যদি কাসরটি কোনো রেকর্ড না পায় এবং FALSE ফেরত দেয় যদি কাসরটি রেকর্ড পায়। - ব্যবহার: এটি ব্যবহার করা হয় যখন আপনি চান, কাসরটি যদি কোনো রেকর্ড না পায়, তাহলে কিছু কাজ বা লগ সিস্টেমে তথ্য প্রদান করুন।
উদাহরণ:
DECLARE
CURSOR emp_cursor IS
SELECT employee_id, first_name FROM employees;
v_emp_id employees.employee_id%TYPE;
v_first_name employees.first_name%TYPE;
BEGIN
OPEN emp_cursor;
FETCH emp_cursor INTO v_emp_id, v_first_name;
IF emp_cursor%NOTFOUND THEN
DBMS_OUTPUT.PUT_LINE('No records found.');
ELSE
DBMS_OUTPUT.PUT_LINE('Record fetched: ' || v_first_name);
END IF;
CLOSE emp_cursor;
END;
৩. %ROWCOUNT
- বর্ণনা:
%ROWCOUNTঅ্যাট্রিবিউটটি কাসরটি কতটি রেকর্ড ফেরত দিয়েছে তার সংখ্যা দেখায়। এটি একটি ইনটিজার মান ফেরত দেয় এবং কাসরের সাথে করা সব ফেচ অপারেশনের পরে এটি আপডেট হয়। - ব্যবহার: এটি সাধারণত ব্যবহৃত হয় যখন আপনি জানতে চান কাসরটি কতটি রেকর্ড প্রক্রিয়া করেছে বা প্রক্রিয়া করতে সক্ষম হয়েছে।
উদাহরণ:
DECLARE
CURSOR emp_cursor IS
SELECT employee_id, first_name FROM employees;
v_emp_id employees.employee_id%TYPE;
v_first_name employees.first_name%TYPE;
BEGIN
OPEN emp_cursor;
LOOP
FETCH emp_cursor INTO v_emp_id, v_first_name;
EXIT WHEN emp_cursor%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('Employee: ' || v_first_name);
END LOOP;
DBMS_OUTPUT.PUT_LINE('Total rows fetched: ' || emp_cursor%ROWCOUNT);
CLOSE emp_cursor;
END;
এখানে %ROWCOUNT কাসরের মাধ্যমে কতটি রেকর্ড প্রক্রিয়া করা হয়েছে তা জানাবে।
৪. %ISOPEN
- বর্ণনা:
%ISOPENঅ্যাট্রিবিউটটি চেক করে যে কাসরটি ওপেন আছে কিনা। এটি একটি বুলিয়ান মান ফেরত দেয়:- TRUE যদি কাসরটি ওপেন থাকে।
- FALSE যদি কাসরটি বন্ধ থাকে।
- ব্যবহার: এটি সাধারণত কাসরটি ওপেন থাকা অবস্থায় ডেটা ফেচ করতে ব্যবহৃত হয়, এবং কাসরটি বন্ধ হওয়ার আগে এটি চেক করা যেতে পারে।
উদাহরণ:
DECLARE
CURSOR emp_cursor IS
SELECT employee_id, first_name FROM employees;
v_emp_id employees.employee_id%TYPE;
v_first_name employees.first_name%TYPE;
BEGIN
IF NOT emp_cursor%ISOPEN THEN
OPEN emp_cursor;
END IF;
FETCH emp_cursor INTO v_emp_id, v_first_name;
DBMS_OUTPUT.PUT_LINE('Employee: ' || v_first_name);
CLOSE emp_cursor;
END;
এখানে %ISOPEN ব্যবহার করে আমরা যাচাই করছি যে কাসরটি ওপেন আছে কিনা, যদি না থাকে তবে কাসরটি ওপেন করা হচ্ছে।
উপসংহার
PL/SQL কাসর অ্যাট্রিবিউটগুলি কাসরের অবস্থা জানার জন্য অত্যন্ত গুরুত্বপূর্ণ। এর মাধ্যমে আপনি কাসরটি কতটা কার্যকরভাবে ডেটা প্রক্রিয়া করছে, কবে কাসরটি কোনো রেকর্ড পেয়েছে বা পায়নি, এবং কাসরটি এখনও খোলা আছে কিনা তা নির্ধারণ করতে পারবেন। এগুলি কাসর ব্যবহারের প্রক্রিয়া উন্নত করার জন্য অপরিহার্য।
PL/SQL-এ Cursor হলো একটি বিশেষ ধরনের ডেটা স্ট্রাকচার যা ডেটাবেস টেবিলের মধ্যে এক বা একাধিক রেকর্ড প্রক্রিয়া করতে ব্যবহৃত হয়। এটি আপনাকে ডেটার ওপর লুপ করতে এবং প্রতিটি রেকর্ডের ওপর নির্দিষ্ট কার্যক্রম সম্পাদন করতে সক্ষম করে। PL/SQL-এ দুটি প্রধান ধরনের Cursor ব্যবহৃত হয়: Implicit Cursor এবং Explicit Cursor। এই অংশে আমরা আলোচনা করব Cursor FOR Loop এবং Parameterized Cursor এর ব্যাপারে।
১. Cursor FOR Loop
Cursor FOR Loop হল একটি সহজ এবং সুবিধাজনক উপায় যেখানে আমরা কোনো Cursors ঘোষণা না করেই একটি SELECT স্টেটমেন্টের মাধ্যমে ডেটা প্রক্রিয়া করতে পারি। Cursor FOR Loop স্বয়ংক্রিয়ভাবে Cursor খুলে, প্রতিটি রেকর্ডের জন্য লুপ করে এবং Cursor বন্ধ করে।
Cursor FOR Loop গঠন:
FOR record IN (SELECT column1, column2 FROM table_name WHERE condition) LOOP
-- Code to process each record
END LOOP;
এখানে, record হলো একটি রেকর্ড টাইপ ভেরিয়েবল যা SELECT স্টেটমেন্টের প্রতিটি রেকর্ড ধারণ করে। column1 এবং column2 কেবলমাত্র উদাহরণ হিসেবে ব্যবহার করা হয়েছে, আপনি আপনার টেবিলের বাস্তব কলাম ব্যবহার করবেন।
Cursor FOR Loop উদাহরণ:
DECLARE
-- No need to explicitly declare a cursor
BEGIN
FOR employee IN (SELECT employee_id, first_name, last_name, salary FROM employees WHERE department_id = 10) LOOP
DBMS_OUTPUT.PUT_LINE('Employee ID: ' || employee.employee_id || ', Name: ' || employee.first_name || ' ' || employee.last_name || ', Salary: ' || employee.salary);
END LOOP;
END;
এখানে, FOR employee IN (SELECT ...) LOOP একটি Cursor FOR Loop, যা employees টেবিল থেকে department_id = 10 এর মধ্যে সকল কর্মচারীর তথ্য প্রক্রিয়া করছে। প্রতিটি রেকর্ডের জন্য, তা কনসোলে প্রদর্শিত হবে।
২. Parameterized Cursor
Parameterized Cursor হলো এমন একটি Cursor, যেটি আর্গুমেন্ট গ্রহণ করতে পারে। এটি explicit cursor হিসেবে ব্যবহৃত হয় এবং কেবল তখনই ব্যবহার করা হয় যখন আপনাকে একটি বা একাধিক মান ফিল্টার হিসেবে ব্যবহৃত করতে হয়। এটি আপনাকে ডাইনামিকভাবে একটি Cursor তৈরি এবং ব্যবহার করতে সক্ষম করে।
Parameterized Cursor গঠন:
DECLARE
CURSOR cursor_name (param1 datatype1, param2 datatype2) IS
SELECT column1, column2
FROM table_name
WHERE condition1 = param1 AND condition2 = param2;
BEGIN
-- Cursor usage goes here
END;
এখানে, cursor_name একটি নাম যেটি আপনি আপনার cursor-এর জন্য নির্বাচন করবেন এবং param1, param2 হলো প্যারামিটার যা এই cursor-এ ব্যবহৃত হবে।
Parameterized Cursor উদাহরণ:
DECLARE
-- Declare a cursor with parameters
CURSOR employee_cursor (dept_id NUMBER) IS
SELECT employee_id, first_name, last_name, salary
FROM employees
WHERE department_id = dept_id;
-- Variable to hold department ID
v_dept_id NUMBER := 10;
BEGIN
-- Open the cursor with the parameter value (department_id = 10)
FOR emp_record IN employee_cursor(v_dept_id) LOOP
DBMS_OUTPUT.PUT_LINE('Employee ID: ' || emp_record.employee_id || ', Name: ' || emp_record.first_name || ' ' || emp_record.last_name || ', Salary: ' || emp_record.salary);
END LOOP;
END;
এখানে, employee_cursor একটি parameterized cursor, যেখানে dept_id একটি প্যারামিটার হিসেবে নেওয়া হয়েছে। যখন আমরা employee_cursor(v_dept_id) কল করি, তখন এটি dept_id = 10 এর ভিত্তিতে employees টেবিল থেকে ডেটা প্রক্রিয়া করে এবং কনসোলে প্রদর্শন করে।
৩. Parameterized Cursor এর সুবিধা
- পুনঃব্যবহারযোগ্যতা: Parameterized Cursor-এ প্যারামিটার ব্যবহার করে একই Cursor বিভিন্ন পরিস্থিতিতে ব্যবহার করা যায়।
- ফিল্টারিং এবং ডাইনামিক কুয়েরি: আপনি বিভিন্ন আর্গুমেন্টের ভিত্তিতে কুয়েরি ফিল্টার করতে পারেন, যা কুয়েরিকে আরো বেশি ডাইনামিক এবং নমনীয় করে তোলে।
- কোডের সুশৃঙ্খলতা: Parameterized Cursor আপনাকে কোডের পুনঃব্যবহারযোগ্যতা এবং সুশৃঙ্খলতা বজায় রাখতে সাহায্য করে।
৪. Implicit Cursor vs Explicit Cursor
| বৈশিষ্ট্য | Implicit Cursor | Explicit Cursor |
|---|---|---|
| ডিক্লারেশন | স্বয়ংক্রিয়ভাবে তৈরি হয়, আপনার ডিক্লারেশন প্রয়োজন হয় না | অবশ্যই ডিক্লারেশন করতে হয় |
| ব্যবহার | সাধারণ SELECT, INSERT, UPDATE বা DELETE কাজের জন্য | কাস্টম কুয়েরি এবং ডেটা প্রক্রিয়া করার জন্য |
| এটা কীভাবে ব্যবহৃত হয় | যখন আপনি সাধারণ কুয়েরি পরিচালনা করেন (যেমন, SELECT INTO) | যখন আপনাকে কাস্টম কুয়েরি বা ডাইনামিক কুয়েরি চালাতে হয় |
| কার্যকরিতা | দ্রুত এবং সহজ | উন্নত কন্ট্রোল এবং কাস্টমাইজেশন |
সারাংশ:
- Cursor FOR Loop একটি সহজ এবং সুবিধাজনক উপায়, যা Explicit Cursor ছাড়াই ডেটা প্রক্রিয়া করতে সাহায্য করে। এটি SELECT স্টেটমেন্টের সাথে কাজ করে এবং স্বয়ংক্রিয়ভাবে Cursor পরিচালনা করে।
- Parameterized Cursor একটি উন্নত উপায়, যা আর্গুমেন্ট গ্রহণ করে এবং ডাইনামিকভাবে কুয়েরি পরিচালনা করে। এটি সাধারণত যখন একই কুয়েরি বিভিন্ন প্যারামিটার নিয়ে কাজ করতে হয় তখন ব্যবহৃত হয়।
উল্লেখযোগ্য যে, Cursor FOR Loop সাধারণত ছোট এবং সহজ কুয়েরির জন্য ব্যবহার করা হয়, যেখানে Parameterized Cursor ডাইনামিক কুয়েরি এবং বেশি জটিল পরিস্থিতির জন্য উপযুক্ত।
Read more