Theory
Multi-Row Traffic Jam
कल्पना कीजिए आप CampusLib desk पर एक ऐसे अकेले student के contact details खोजना चाहते हैं जिसके पास एक overdue book है। एक सरल SELECT INTO statement ख़ूबसूरती से काम करता है क्योंकि यह बिल्कुल एक row को एक local variable में map करता है। पर क्या होता है अगर 50 students के पास overdue books हैं? अगर आप वही standard query structure execute करते हैं, database engine घबराता है, एक 'TOO_MANY_ROWS' error फेंकता है, और आपकी application crash करता है। SQL स्वाभाविक रूप से पूरी tables या sets में सोचता है, पर PL/SQL केवल row-दर-row logic process कर सकता है। हम एक विशाल multi-row table result को एक sequential program में सुरक्षित रूप से कैसे feed करते हैं बिना एक system pile-up पैदा किए?
Theory
Restaurant Conveyor Belt बनाम Buffet Plate
एक Implicit Cursor को एक fast-food counter पर एक ख़ास combo meal order करने की तरह सोचिए, server बिल्कुल एक plate तैयार करता है, इसे आपको सौंपता है, और transaction तुरंत पूरी हो जाती है। एक Explicit Cursor एक घूमते sushi conveyor belt के बगल में बैठने जैसा है। kitchen विविध dishes का एक बड़ा collection (सक्रिय query result set) तैयार करता है और उन्हें temporary memory में belt पर load करता है। आप उन्हें एक साथ नहीं खाते; आप एक बार में एक plate पकड़ते हैं (FETCH), इसे process करते हैं, और अगली dish के दृश्य में सरकने का इंतज़ार करते हैं जब तक belt पूरी तरह ख़ाली न हो।
Theory
Context Memory Private Workspace परिभाषित करना
औपचारिक रूप से, एक cursor Oracle database engine द्वारा allocate किए एक private memory work area की ओर एक pointer है जिसे Context Area कहते हैं। यह workspace एक SQL query द्वारा return की rows को execution state flags के साथ रखता है। PL/SQL cursors को दो अलग operational models में बाँटता है: Implicit और Explicit। हर एक बार जब आप एक INSERT, UPDATE, DELETE, या एक single-row SELECT query चलाते हैं, Oracle आपके लिए चुपचाप एक implicit cursor बनाता और manage करता है। इसके उलट, जब आप उम्मीद करते हैं कि एक query कई rows को छुए, आपको program code के अंदर अपना ख़ुद का cursor स्पष्ट रूप से बनाना, नाम देना, और manage करना होगा।
At a glance
internal system cursors और programmer-defined loops के बीच कार्यात्मक अंतर।
| Architectural Feature | Implicit Cursor | Explicit Cursor |
|---|---|---|
| Management Control | पूरी तरह internal Oracle engine द्वारा बनाया और समाप्त। | application programmer द्वारा हाथ से declared, allocated, और closed। |
| Row Processing Limit | single-row updates या discrete table mutations तक सीमित। | बड़े multi-row result sets को stream और iterate करने के लिए ख़ास तौर पर design किया गया। |
| Naming Rule | Anonymous; generic keyword token 'SQL' इस्तेमाल करके globally reference किया गया। | declaration block में assigned एक unique, user-defined identifier चाहिए। |
| Operational Overhead | निरंतर auto-checks के कारण दोहराए tasks के लिए ज़्यादा runtime overhead। | programmatic loops और सटीक memory reclamation के लिए अत्यधिक optimized। |
Practical
Implicit Tracking को Explicit Cursor Blueprints से तुलना करना
-- An anonymous block demonstrating implicit cursor execution alongside explicit definition
DECLARE
-- Defining an explicit cursor layout for multi-row scanning
CURSOR c_overdue_members IS
SELECT name, member_id
FROM members
WHERE fine_balance > 100;
v_name members.name%TYPE;
v_id members.member_id%TYPE;
BEGIN
-- 1. Example of an Implicit Cursor action
UPDATE members
SET fine_balance = fine_balance + 10
WHERE department = 'BCA';
-- Checking implicit attributes using the global 'SQL' handle
DBMS_OUTPUT.PUT_LINE('Rows updated implicitly: ' || SQL%ROWCOUNT);
-- 2. Brief preview of the Explicit Cursor journey
OPEN c_overdue_members;
FETCH c_overdue_members INTO v_name, v_id;
DBMS_OUTPUT.PUT_LINE('First high-fine member caught: ' || v_name);
CLOSE c_overdue_members;
END;
/Follow along
एक Explicit Cursor Structure का Lifecycle
- 1. Declaration developer DECLARE section में एक named cursor handle register करता है, इसे एक ख़ास SELECT query blueprint से स्थायी रूप से map करते हुए।
- 2. Initialization (OPEN) program अंतर्निहित query execute करता है, मेल खाती rows को एक private active memory set में fetch करता है, और एक internal row pointer को पहली entry पर set करता है।
- 3. Extraction (FETCH) runtime engine मौजूदा row के column values को बाईं ओर local variables में copy करता है और pointer को अगले record तक नीचे बढ़ाता है।
- 4. Disposal (CLOSE) program cursor बंद करता है, active memory context area को वापस database server को release करता है और row pointer cache नष्ट करता है।
Quiz
निम्न में से कौन सा database event एक PL/SQL block के अंदर एक Implicit Cursor के automatic creation को trigger करेगा?
- एक custom composite record type declare करना।
- एक table row पर सीधे एक standard UPDATE या DELETE statement execute करना।
- एक FOR loop block के भीतर एक loop counter variable परिभाषित करना।
- executable section में एक named cursor statement open करना।
Show the answer
एक table row पर सीधे एक standard UPDATE या DELETE statement execute करना।
Oracle सारे internal SQL Data Manipulation Language (DML) operations, जैसे INSERT, UPDATE, और DELETE, साथ ही single-row SELECT INTO queries के लिए अपने-आप एक implicit cursor बनाता और operate करता है।
Watch out
Single-Row SELECT INTO जाल
यहाँ university theory exams के लिए एक परम पसंदीदा सवाल है! students अक्सर मानते हैं कि एक standard SELECT ... INTO query cursors इस्तेमाल नहीं करती क्योंकि कोई CURSOR keyword दिखाई नहीं देता। असल में, यह एक implicit cursor चलाती है। क्योंकि implicit cursors एक बिल्कुल 1-to-1 match की माँग करते हैं, अगर आपकी query शून्य rows return करती है, यह एक NO_DATA_FOUND exception के साथ crash होती है। अगर यह एक से ज़्यादा row return करती है, यह TOO_MANY_ROWS के साथ crash होती है। volatile, unvalidated कई rows के लिए basic implicit selections कभी इस्तेमाल मत कीजिए!
Think first
Unclosed Explicit Cursor Impact जाँच
अगर आप एक Explicit Cursor open करते हैं पर PL/SQL block execution पूरा होने से पहले एक CLOSE command जारी करना भूल जाते हैं, उस memory block का क्या होता है? server resource stability के बारे में सोचिए।
Show the answer
memory एक memory leak के रूप में locked रह जाती है! जबकि आधुनिक Oracle engines एक session पूरी तरह समाप्त होने पर ढीले blocks साफ़ करने की कोशिश करते हैं, explicit cursors open छोड़ना private context area को server RAM में सक्रिय रखता है। व्यस्त multi-user production systems में, यह बुरी आदत तेज़ी से shared server resources ख़त्म करती है और भारी performance slowdowns पैदा करती है।
Theory
University External Viva रणनीति
Semester 2 evaluations के दौरान external lab examiners का सामना करते समय, आपको keyword Active Set याद रखना होगा। examiner शायद पूछेगा: 'जब एक cursor open होता है rows कहाँ रहती हैं?' उन्हें तुरंत प्रभावित कीजिए जवाब देकर: 'rows disk storage से fetch होती हैं और server memory के private Context Area के भीतर Active Set नामक एक temporary collection के रूप में रखी जाती हैं।'
Summary
Key takeaways
- एक cursor एक समर्पित programmatic pointer है जो PL/SQL को एक SQL result collection में row-दर-row guide करता है।
- Implicit cursors 'SQL' नाम के हैं और discrete DML या single-row assignments के लिए अपने-आप चलते हैं।
- Explicit cursors multi-row outputs को सुरक्षित रूप से manipulate करने के लिए programmer द्वारा हाथ से declared हैं।
- एक explicit cursor initialization के दौरान load किया data collection औपचारिक रूप से Active Set के रूप में जाना जाता है।
- एक CLOSE operation execute करने में विफल होना explicit context area buffers को अटका छोड़ता है, server RAM leak करते हुए।
- Memory hook: Implicit cursors system automatic हैं; explicit cursors custom-built boxes हैं जिन्हें आपको Open, Fetch, और Close करना होगा!