Concepts of Cursors: Implicit & Explicit

एक cursor database memory में एक temporary work area है जो एक pointer की तरह काम करता है, PL/SQL को query results को एक साथ नहीं बल्कि row-दर-row process करने देते हुए।

10 min read · 11 cards · 2 checks

Read in: English · हिन्दी · ગુજરાતી


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 FeatureImplicit CursorExplicit Cursor
Management Controlपूरी तरह internal Oracle engine द्वारा बनाया और समाप्त।application programmer द्वारा हाथ से declared, allocated, और closed।
Row Processing Limitsingle-row updates या discrete table mutations तक सीमित।बड़े multi-row result sets को stream और iterate करने के लिए ख़ास तौर पर design किया गया।
Naming RuleAnonymous; 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;
/

Copy करके Oracle FreeSQL खोलें
Oracle FreeSQL, Oracle SQL का मुफ़्त online editor है। Code पहले copy हो जाता है: उसे वहां paste करके Run करें।

Follow along

एक Explicit Cursor Structure का Lifecycle

  1. 1. Declaration developer DECLARE section में एक named cursor handle register करता है, इसे एक ख़ास SELECT query blueprint से स्थायी रूप से map करते हुए।
  2. 2. Initialization (OPEN) program अंतर्निहित query execute करता है, मेल खाती rows को एक private active memory set में fetch करता है, और एक internal row pointer को पहली entry पर set करता है।
  3. 3. Extraction (FETCH) runtime engine मौजूदा row के column values को बाईं ओर local variables में copy करता है और pointer को अगले record तक नीचे बढ़ाता है।
  4. 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 करेगा?

  1. एक custom composite record type declare करना।
  2. एक table row पर सीधे एक standard UPDATE या DELETE statement execute करना।
  3. एक FOR loop block के भीतर एक loop counter variable परिभाषित करना।
  4. 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 करना होगा!

Study this properly

This page is the lesson to read. In Gri-Learn the same topic is a graded deck: the self-checks are scored and your weak topics are tracked. Free to start.

Start this topic

Already have an account? Sign in

More from Cursors and Exception Handling

Gri-Learn · syllabus-mapped B.C.A. lessons in English, Hindi and Gujarati

Concepts of Cursors: Implicit & Explicit · Concepts of Relational Database Management Systems · Gri-Learn