Theory
તમારી Query ના ધબકારા તપાસવા
કલ્પો કે તમે TicketDesk માંથી તાકીદનું ધ્યાન માંગતી rows લાવવા એક loop ચલાવો છો. તમારો PL/SQL program ખરેખર કેવી રીતે જાણે કે છેલ્લું ticket ખેંચાઈ ગયું? જો તમે એવા cursor માંથી fetch કરવાનો પ્રયાસ કરો જેને ખોલવાનું તમે ભૂલી ગયા તો શું થાય, કે અત્યાર સુધી process થયેલા records ની કુલ સંખ્યા તમે કેવી રીતે દેખાડો? તમે તમારી ખુલ્લી આંખે database ની memory ની અંદર જોઈ શકતા નથી. તમને built-in સૂચકોનો એક સમૂહ જોઈએ જે કોઈ પણ મિલિસેકન્ડે તમારા cursor ની સ્થિતિ તરત ઉજાગર કરે.
Theory
કારના Dashboard નાં સૂચકો
એક cursor ને એક delivery van ચલાવવા જેવો વિચારો. ચાલતાં ચાલતાં તમે engine કે petrol ની ટાંકીની અંદર સીધું જોઈ શકતા નથી. એને બદલે, તમે તમારું dashboard જુઓ છો. Petrol નું માપ તમને કહે છે કે petrol બાકી છે કે નહીં (%FOUND કે %NOTFOUND). Odometer તમને બિલકુલ કહે છે કે તમે કેટલા કિલોમીટર મુસાફરી કરી (%ROWCOUNT). Ignition ની લાઈટ તમને કહે છે કે engine ચાલુ છે કે સંપૂર્ણપણે બંધ (%ISOPEN). આ dashboard નાં માપ તમને વાહન ખોલ્યા વગર જીવંત પ્રતિભાવ આપે છે.
Theory
Oracle PL/SQL માં Cursor Attributes
Oracle database ના dialect માં, cursor attributes એ system દ્વારા વ્યાખ્યાયિત ગુણધર્મો છે જે એક cursor માટે status ના નિશાનો તરીકે કામ કરે છે. જ્યારે પણ તમે એક SQL statement ચલાવો કે એક cursor ની કામગીરી કરો, Oracle આપોઆપ ખાનગી memory ના વિસ્તારમાં આ attributes update કરે છે. ટકાવારીના ચિહ્ન (%) વાપરીને તમારા cursor ના variable સાથે એક attribute નું નામ જોડીને, તમારો procedural code ગતિશીલ execution ની પસંદગીઓ કરવા હરોળની ગણતરી અને fetch ની સફળતા જેવા runtime ના ગુણધર્મો તપાસી શકે છે.
At a glance
Oracle PL/SQL programming engine માં મુખ્ય cursor ના status નાં attributes
| Attribute | Type | પાછી અપાતી Value નું વર્ણન |
|---|---|---|
| %FOUND | BOOLEAN | જો છેલ્લા FETCH એ એક હરોળ પાછી આપી હોય તો TRUE પાછું આપે છે: નિષ્ફળ ગયો હોય તો FALSE |
| %NOTFOUND | BOOLEAN | જો છેલ્લો FETCH એક હરોળ શોધવામાં નિષ્ફળ ગયો હોય તો TRUE પાછું આપે છે: સફળ થયો હોય તો FALSE |
| %ISOPEN | BOOLEAN | જો cursor હાલમાં ખુલ્લો અને memory માં સક્રિય હોય તો TRUE પાછું આપે છે: બંધ હોય તો FALSE |
| %ROWCOUNT | NUMBER | ખૂલ્યા પછી અત્યાર સુધી લવાયેલી કે અસર પામેલી rows ની કુલ સંખ્યા પાછી આપે છે |
Practical
Tracking Ticket Audits with Attributes
-- Enable console output in Oracle environment
SET SERVEROUTPUT ON;
DECLARE
CURSOR c_high_priority IS
SELECT id, title FROM tickets WHERE priority = 'High';
v_id tickets.id%TYPE;
v_title tickets.title%TYPE;
BEGIN
-- Check if cursor is already active before opening
IF NOT c_high_priority%ISOPEN THEN
OPEN c_high_priority;
END IF;
LOOP
FETCH c_high_priority INTO v_id, v_title;
-- Stop loop automatically when no rows remain
EXIT WHEN c_high_priority%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('Fetched row number ' || c_high_priority%ROWCOUNT || ': ' || v_title);
END LOOP;
DBMS_OUTPUT.PUT_LINE('Total tickets processed: ' || c_high_priority%ROWCOUNT);
CLOSE c_high_priority;
END;
/Quiz
ધારો કે એક explicit cursor એ એક loop ના execution દરમિયાન સફળતાપૂર્વક 5 rows મેળવી. Cursor સ્પષ્ટપણે બંધ થયા પછી તરત %ROWCOUNT ની value શું હશે?
- 5
- 0
- NULL
- એક INVALID_CURSOR exception ઊભી કરે છે
Show the answer
એક INVALID_CURSOR exception ઊભી કરે છે
એક explicit cursor બંધ થયા પછી એનું કોઈ પણ attribute વાપરવાથી Oracle માં તરત એક INVALID_CURSOR runtime error ઊભી થાય છે. એક વાર બંધ થયા પછી, cursor નો memory નો સંદર્ભ સંપૂર્ણપણે નાશ પામે છે, જેથી એના status ના નિશાનો ઉપલબ્ધ રહેતા નથી.
Watch out
Implicit સામે Explicit %NOTFOUND નો ફાંદો
ભારતીય BCA university ની laboratory ની practicals માં એક classic ભૂલ છે ખોટો cursor નો prefix વાપરવો. જો તમે c_tickets નામનો એક explicit cursor તપાસી રહ્યા હો, તમારે c_tickets%NOTFOUND વાપરવું જ પડશે. જો તમે ભૂલથી SQL%NOTFOUND લખો, Oracle તમારા explicit cursor ને બદલે છેલ્લી implicit SQL query ની સ્થિતિ તપાસશે! આનાથી loops ખોટી રીતે ચાલે છે કે અનંત સમય ચાલે છે કારણ કે તમે ખોટા dashboard ના સૂચકને પૂછી રહ્યા છો.
Think first
માનસિક પડકાર: %ROWCOUNT ની શરૂઆતની સ્થિતિ
કોઈ પણ FETCH statement ચાલે એ પહેલાં પણ એક explicit cursor સફળતાપૂર્વક ખૂલ્યા પછી તરત, તમને શું લાગે છે કે %ROWCOUNT કઈ આંકડાકીય value રાખે છે? Tap કરતાં પહેલાં મનમાં જવાબ કાઢો.
Show the answer
એ 0 પાછું આપે છે! જ્યારે તમે એક cursor ખોલો, Oracle query ચલાવે છે અને સક્રિય સમૂહ તૈયાર કરે છે, પણ ખરેખર શૂન્ય rows તમારા સ્થાનિક variables માં લવાઈ છે. તેથી, %ROWCOUNT 0 થી શરૂ થાય છે અને દર વખતે એક FETCH ની કામગીરી સફળતાપૂર્વક એક record મેળવે ત્યારે 1 થી વધે છે.
Theory
Database Audits અને ભવિષ્યનું Synchronization
Production ના helpdesk ના વાતાવરણોમાં વિગતવાર management ના reports બનાવતી વખતે કે જથ્થાબંધ processing ના આંકડા track કરતી વખતે cursor attributes અત્યંત મહત્ત્વનાં છે. તમે આગલા semester માં તમારા Sem 3 BCA303 ના SQLite mobile database ના course માં હરોળ ગણવાની ભાતો પર ખૂબ આધાર રાખશો. જ્યારે sync ની routines એક દૂરના master server માંથી updates લાવે, તમારો code mobile ના user interface ની screen પર પ્રગતિની ટકાવારી દોરવા સ્થાનિક loop ની ગણતરીઓ વાપરશે.
Summary
Key takeaways
- Cursor attributes એ ખાસ boolean કે આંકડાકીય નિશાનો છે જે execution ની સ્થિતિ વર્ણવે છે.
- એક OPEN કે CLOSE command ચલાવતાં પહેલાં cursor સક્રિય છે કે નહીં એ ચકાસવા %ISOPEN વાપરો.
- %FOUND અને %NOTFOUND નિશાનો દર્શાવે છે કે છેલ્લી FETCH ની કામગીરીએ સફળતાપૂર્વક data પાછો આપ્યો કે નહીં.
- %ROWCOUNT attribute cursor ખૂલ્યા પછી process થયેલી rows ની સંચિત સંખ્યા track કરે છે.
- એક બંધ થયેલા explicit cursor પર attributes નો સંદર્ભ લેવાનો પ્રયાસ તરત એક exception ની error માં પરિણમે છે.
- Memory hook: ISOPEN થી ખોલો, NOTFOUND થી ચકાસો, ROWCOUNT થી ગણો, અને બંધ કરતાં પહેલાં તપાસો!