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 अंतर
| Feature | Implicit Cursor | Explicit Cursor |
|---|---|---|
| Creation | सारी single SQL queries के लिए Oracle द्वारा अपने-आप बनाया | DECLARE section में programmer द्वारा हाथ से परिभाषित |
| Row Capacity | single row operations या पूरे bulk sets के लिए design किया | कई rows को line-दर-line fetch और process करने के लिए ख़ास तौर पर बना |
| Lifecycle Control | शुरू से अंत तक पूरी तरह system द्वारा managed | explicit DECLARE, OPEN, FETCH, और CLOSE commands इस्तेमाल करके हाथ से नियंत्रित |
| Default Names | generic 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;
/Quiz
कौन सा explicit cursor lifecycle command संबंधित SELECT query execute करने और active memory space आवंटित करने के लिए ज़िम्मेदार है?
- DECLARE
- OPEN
- FETCH
- 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 करो!