Concepts of Cursors: Implicit & Explicit; Declare, open, fetch, close

Cursors database pointers की तरह काम करते हैं जो आपके programs को multi row query results सुरक्षित रूप से line-दर-line fetch, जाँचने, और process करने देते हैं।

10 min read · 10 cards · 2 checks

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


Theory

single row की सीमा

कल्पना कीजिए TicketDesk पर आपके manager आपसे मौजूदा हर एक ticket जो Open चिह्नित है उसकी details दिखाने को कहते हैं। आप आत्मविश्वास से एक PL/SQL block के अंदर एक standard SQL SELECT statement लिखते हैं। पर जिस पल आपकी query एक से ज़्यादा row return करती है, Oracle database engine तुरंत एक बुरा TOO_MANY_ROWS exception फेंकता है और आपका program crash कर देता है। Standard PL/SQL variables एक बार में केवल एक value या row रख सकते हैं। आप अपने database system को crash किए बिना कई rows को क्रमिक रूप से कैसे सुरक्षित रूप से fetch और process करें?

Theory

Warehouse Conveyor Belt

अपनी database table को हज़ारों product boxes से भरे एक बड़े warehouse storage कमरे की तरह सोचिए। अगर आप बिल्कुल एक ही समय पर सारे boxes अपनी बाँहों में ले जाने की कोशिश करते हैं, आप उन्हें गिरा देंगे और एक पूर्ण आपदा पैदा कर देंगे। इसके बजाय, आप एक संकरा conveyor belt set up करते हैं। warehouse supervisor एक बार में belt पर एक box रखता है। आप अंत में खड़े होते हैं, अकेला box उठाते हैं, इसे process करते हैं, और अगले के आने का इंतज़ार करते हैं। एक cursor आपकी data rows के लिए वह conveyor belt है।

Theory

Oracle PL/SQL में Cursors को परिभाषित करना

Oracle database dialect में, एक cursor एक private memory क्षेत्र है जो system द्वारा आवंटित होता है ताकि SQL statements execute करे और return किया active row set store करे। Cursors pointers की तरह काम करते हैं जो आपको एक multi row query result को line-दर-line fetch और process करने देते हैं। Oracle cursors की दो categories इस्तेमाल करता है: implicit cursors, जो हर एक DML statement के लिए system द्वारा अपने-आप बनते हैं, और explicit cursors, जो multi row queries के लिए programmer द्वारा पूरी तरह declared और managed हैं।

At a glance

Oracle databases में implicit और explicit cursors के बीच structural अंतर

FeatureImplicit CursorExplicit Cursor
Creationसारी single SQL queries के लिए Oracle द्वारा अपने-आप बनायाDECLARE section में programmer द्वारा हाथ से परिभाषित
Row Capacitysingle row operations या पूरे bulk sets के लिए design कियाकई rows को line-दर-line fetch और process करने के लिए ख़ास तौर पर बना
Lifecycle Controlशुरू से अंत तक पूरी तरह system द्वारा managedexplicit DECLARE, OPEN, FETCH, और CLOSE commands इस्तेमाल करके हाथ से नियंत्रित
Default Namesgeneric keyword SQL इस्तेमाल करके संदर्भितprogrammer द्वारा assigned एक custom नाम से पहचाना गया

Practical

एक Open Tickets Query Lifecycle से गुज़रना

-- Enable text printing in Oracle SQL*Plus
SET SERVEROUTPUT ON;

DECLARE
  -- Step 1: Declare the explicit cursor with its query
  CURSOR c_open_tickets IS
    SELECT id, title FROM tickets
    WHERE status = 'Open';
    
  v_id tickets.id%TYPE;
  v_title tickets.title%TYPE;
BEGIN
  -- Step 2: Open the cursor to allocate memory and run query
  OPEN c_open_tickets;
  
  LOOP
    -- Step 3: Fetch the current row data into local variables
    FETCH c_open_tickets INTO v_id, v_title;
    
    -- Exit loop when no more rows are found
    EXIT WHEN c_open_tickets%NOTFOUND;
    
    DBMS_OUTPUT.PUT_LINE('Processing Ticket ID: ' || v_id || ' - ' || v_title);
  END LOOP;
  
  -- Step 4: Close the cursor to release database server resources
  CLOSE c_open_tickets;
END;
/

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

Quiz

कौन सा explicit cursor lifecycle command संबंधित SELECT query execute करने और active memory space आवंटित करने के लिए ज़िम्मेदार है?

  1. DECLARE
  2. OPEN
  3. FETCH
  4. CLOSE
Show the answer

OPEN

जबकि DECLARE code में structural blueprint बनाता है, OPEN statement असल में database engine के अंदर अंतर्निहित SQL query execute करता है और active area को rows से भरता है। FETCH बस मौजूदा row पाता है, और CLOSE memory space release करता है।

Think first

Mental Challenge: Variables का क्रम

मान लीजिए आपका cursor tickets table से पहले id फिर title चुनता है। क्या होता है अगर आप FETCH c_open_tickets INTO v_title, v_id लिखते हैं जहाँ variables ग़लती से अदल-बदल गए? reveal करने को tap करने से पहले परिणाम मन में सोचिए।

Show the answer

Oracle values को सख़्ती से क्रमिक position द्वारा map करता है, variable names द्वारा नहीं। अगर v_title एक VARCHAR2 है और id एक NUMBER है, Oracle एक conversion की कोशिश करेगा। अगर यह एक alphanumeric title को एक numeric ID variable में convert नहीं कर सकता, आपका block तुरंत एक runtime VALUE_ERROR exception के साथ विफल होगा। हमेशा variables को cursor SELECT column sequence से ठीक-ठीक match कीजिए।

Watch out

तैरता Cursor Memory Leak

university lab exams में भारतीय BCA students द्वारा की गई सबसे बार-बार होने वाली ग़लती explicit CLOSE command भूलना है। implicit cursors के उलट, एक explicit cursor आपके PL/SQL block का execution पूरा होने के बाद भी database server memory के अंदर पूरी तरह खुला रहता है। अगर यह block एक application loop के भीतर बार-बार चलता है, यह लगातार active context areas leak करता है जब तक database पूरी तरह cursor slots से बाहर न हो जाए और डरावना maximum open cursors exceeded crash न फेंके।

Theory

Enterprise Record Navigation और Mobile Frameworks

helpdesk ticket routers जैसे बड़े enterprise customer support platforms में, explicit cursors server RAM overload किए बिना लाखों rows भर भारी batch migrations और रोज़ के SLA status sweeps सुरक्षित रूप से सँभालते हैं। आप इस बिल्कुल pointer extraction अवधारणा का अगले semester अपने Sem 3 SQLite mobile database course में फिर से इस्तेमाल करेंगे, जहाँ आप database records को एक smartphone screen list view पर रँगने के लिए structural Android loop cursor adapters इस्तेमाल करेंगे।

Summary

Key takeaways

  • एक cursor एक private database memory क्षेत्र है जो query results को line-दर-line सुरक्षित रूप से सँभालने के लिए इस्तेमाल होता है।
  • Implicit cursors standard single row queries और updates के लिए Oracle द्वारा अपने-आप managed हैं।
  • Explicit cursors को एक सख़्त हाथ का चार-कदम cycle चाहिए: DECLARE, OPEN, FETCH, और CLOSE।
  • FETCH statement active dataset से values को local variables में क्रमिक रूप से copy करता है।
  • ज़्यादा server memory leaks और context slot थकावट रोकने के लिए हमेशा explicit cursors बंद कीजिए।
  • Memory hook: loop Declare करो, line Open करो, row 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, Packages, Triggers

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

Concepts of Cursors: Implicit & Explicit; Declare, open, fetch, close · Mastering SQL - PL/SQL (SEC-02 option A) · Gri-Learn