Theory
આંધળું Dashboard
કલ્પો કે તમે એવી કાર ચલાવો છો જેની આગળની બારી સંપૂર્ણપણે કાળી કરેલી છે, અને તમારે માત્ર radio પર અપાતી સૂચનાઓથી રસ્તો કાઢવો પડે. જો તમે CampusLib database માં મોડા students માટે fine balances update કરો, તો તમને કેવી રીતે ખબર પડે કે તમારા SQL statement એ ખરેખર 50 records બદલ્યા, 1 record બદલ્યો, કે બિલકુલ કંઈ ન મળ્યું? Status ના પ્રતિભાવ વગર database ની કામગીરી ચલાવવી અત્યંત ખતરનાક છે. Execution engine ની અંદર સલામત રીતે જોવા, PL/SQL ચાર built-in system સૂચકો આપે છે જેમને Cursor Attributes કહેવાય છે. એ dashboard ની status ની લાઈટો જેવા કામ કરે છે, છેલ્લા database વ્યવહાર દરમિયાન બિલકુલ શું થયું એ ઉજાગર કરતાં.
Theory
WhatsApp ની Read Receipt અને Odometer
%FOUND અને %NOTFOUND ને WhatsApp ની delivery ની ટીક જેવાં વિચારો. જ્યારે તમે એક fetch command ચલાવો, %FOUND એક તેજસ્વી ભૂરી બેવડી ટીકમાં ફેરવાય છે, સાબિત કરતાં કે તમારા programmatic હાથે સફળતાપૂર્વક એક ખરેખરી database ની હરોળ પકડી. જો પ્રવાહ સુકાઈ જાય અને તમે ખાલી જગ્યા પકડો, તો એને બદલે %NOTFOUND સળગે છે. દરમિયાન, %ROWCOUNT ને એક કારના trip meter (odometer) જેવું વિચારો. તમે data નો વાલ્વ ખોલો એ ક્ષણે એ શૂન્યથી શરૂ થાય છે, અને તમારા loop ના filter માંથી પસાર થતી દરેકે દરેક અલગ record ની હરોળ માટે એક-એક કરીને (+1) ઉપર વધે છે.
Theory
ચાર System Monitors
PL/SQL કોઈ પણ cursor ની ક્રિયા માટે ચાર પાયાના ગુણધર્મો track કરે છે. જો તમે હાથે બનાવેલા explicit cursor ને તપાસી રહ્યા હો, તો તમે આ tokens સીધા તમારા custom cursor handle સાથે જોડો છો (દા.ત. c_stud_cursor%FOUND). જો તમારે એક implicit statement તપાસવું હોય, જેમ કે એક standard એકલું UPDATE, DELETE, કે એક-હરોળનું SELECT INTO, તો તમે આ tokens ને સામાન્ય વૈશ્વિક prefix handle `SQL` સાથે જોડો છો (દા.ત. SQL%ROWCOUNT).
At a glance
PL/SQL cursor ના ગુણધર્મો માટે સ્થિતિનું matrix અને datatype નાં પરિણામો
| Attribute | Data Type | Explicit Cursors માટે વર્તન | Implicit Cursors માટે વર્તન (SQL%) |
|---|---|---|---|
| %ISOPEN | BOOLEAN | જો cursor ખુલ્લો અને RAM માં સક્રિય હોય તો TRUE આંકાય છે; બંધ હોય તો FALSE. | હંમેશા FALSE આંકાય છે કારણ કે Oracle execution પછી implicit statements તરત જાતે બંધ કરી દે છે. |
| %FOUND | BOOLEAN | જો છેલ્લા FETCH એ એક માન્ય હરોળ ખેંચી હોય તો TRUE પાછું આપે છે; કોઈ હરોળ ન લવાઈ હોય તો FALSE; fetch પહેલાં NULL. | જો એક INSERT/UPDATE/DELETE statement એ ઓછામાં ઓછી એક હરોળ બદલી હોય, કે એક SELECT INTO મળ્યું હોય તો TRUE પાછું આપે છે. |
| %NOTFOUND | BOOLEAN | જો છેલ્લો FETCH ખાલી નીકળ્યો હોય તો TRUE પાછું આપે છે; એક હરોળ સફળતાપૂર્વક ખેંચાઈ હોય તો FALSE; fetch પહેલાં NULL. | જો એક DML statement એ શૂન્ય rows ને અસર કરી હોય, કે એક SELECT INTO ને record ન મળ્યો હોય તો TRUE પાછું આપે છે. |
| %ROWCOUNT | NUMBER | એ cursor ના પ્રવાહમાંથી અત્યાર સુધી variables માં લવાયેલી rows ની બિલકુલ કુલ સંચિત સંખ્યા track કરે છે. | છેલ્લા execution block દ્વારા બદલાયેલી કે કાઢી નખાયેલી rows ની કુલ ગણતરી તરત દેખાડે છે. |
Practical
Auditing Rows Using Implicit and Explicit Status Hooks
-- An anonymous block capturing execution metrics using system attributes
DECLARE
CURSOR c_defaulters IS
SELECT member_id FROM members WHERE fine_balance > 200;
v_id members.member_id%TYPE;
BEGIN
-- 1. Testing Implicit Attributes on a DML Update
UPDATE members
SET status = 'SUSPENDED'
WHERE fine_balance > 500;
IF SQL%FOUND THEN
DBMS_OUTPUT.PUT_LINE('Suspension applied! Rows impacted: ' || SQL%ROWCOUNT);
ELSE
DBMS_OUTPUT.PUT_LINE('No members crossed the high-fine threshold.');
END IF;
-- 2. Testing Explicit Attributes through a manual lifecycle
OPEN c_defaulters;
-- State Check right after opening
IF c_defaulters%ISOPEN THEN
DBMS_OUTPUT.PUT_LINE('Cursor open. Rows fetched so far: ' || c_defaulters%ROWCOUNT);
END IF;
LOOP
FETCH c_defaulters INTO v_id;
EXIT WHEN c_defaulters%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('Processing item #' || c_defaulters%ROWCOUNT || ' for ID: ' || v_id);
END LOOP;
CLOSE c_defaulters;
END;
/Follow along
Explicit Attribute ની સ્થિતિ બદલાવાની સમયરેખા
- 1. OPEN પહેલાં %ISOPEN આંકતાં FALSE મળે છે. %FOUND, %NOTFOUND, કે %ROWCOUNT બોલાવવાનો પ્રયાસ તરત એક ORA-01001 Invalid Cursor crash ઊભો કરે છે.
- 2. OPEN ની તરત પછી %ISOPEN TRUE થઈ જાય છે. %ROWCOUNT બિલકુલ 0 વાંચે છે. %FOUND અને %NOTFOUND બંને કોરી NULL સ્થિતિ તરીકે જવાબ આપે છે.
- 3. સફળ FETCH ચક્રો %FOUND TRUE આંકાય છે, %NOTFOUND FALSE થાય છે, અને variables માં ખેંચાયેલા દરેક record માટે %ROWCOUNT 1 થી વધે છે.
- 4. પ્રવાહ ખૂટવો Pointer છેલ્લી હરોળ વટાવે છે. FETCH ને કંઈ મળતું નથી. %FOUND FALSE થાય છે, %NOTFOUND TRUE થાય છે, અને %ROWCOUNT અંતિમ ઊંચા આંકે થીજી જાય છે.
- 5. CLOSE પછીની સફાઈ %ISOPEN પાછું FALSE પર ઊતરે છે. બાકીના ત્રણ ગુણધર્મો તરત સંદર્ભ ગુમાવે છે અને ફરી સંદર્ભાય તો exceptions ફેંકશે.
Quiz
એક explicit cursor ખૂલ્યા પછી તરત, પણ સૌથી પહેલું FETCH statement ચાલે એની બરાબર પહેલાં, 'c_cursor%ROWCOUNT' ની ચોક્કસ value શું છે?
- એ NULL પાછું આપે છે કારણ કે હજી કોઈ extraction નો પ્રયાસ શરૂ થયો નથી.
- એ active set ના સંગ્રહમાં રાહ જોતી મળતી rows ની કુલ સંખ્યા પાછી આપે છે.
- એ 0 પાછું આપે છે.
- Oracle એક ORA-01001 Invalid Cursor exception ની error સ્થિતિ ફેંકે છે.
Show the answer
એ 0 પાછું આપે છે.
એક cursor ખોલવાથી engine ગોઠવાય છે અને પહેલી હરોળની બરાબર ઉપર ઈશારો થાય છે, પણ હજી કોઈ rows counter ના દરવાજેથી પસાર થઈ નથી. તેથી, %ROWCOUNT બિલકુલ 0 વાંચે છે. એ આ તબક્કે પરિણામના સમૂહનું કુલ કદ પહેલેથી ગણતું નથી.
Watch out
CLOSE પછીના Memory ના ભૂતનો ફાંદો
University theory exams માટે આ એક પાકો પ્રિય યુક્તિનો પ્રશ્ન છે! Students ઘણી વાર આવો cleanup code લખે છે: CLOSE c1; IF c1%NOTFOUND THEN.... આ એક ઘાતક તાર્કિક ફાંદો છે! તમે CLOSE c1; ચલાવો એ જ ક્ષણે, ખાનગી કાર્યક્ષેત્ર memory માંથી ભૂંસાઈ જાય છે અને cursor ની ઓળખ નાશ પામે છે. બંધ થયેલા cursor ને એની %NOTFOUND સ્થિતિ પૂછવાથી તમને TRUE કે FALSE નહીં મળે, એ તરત તમારો આખો program runtime એક INVALID_CURSOR exception સાથે crash કરી નાખશે!
Think first
ખાલી Implicit Update ના મૂલ્યાંકનની ચકાસણી
માનસિક પડકાર: જો તમે એક UPDATE query ચલાવો જે એક table માં શૂન્ય rows સાથે મળે, તો 'SQL%NOTFOUND' અને 'SQL%ROWCOUNT' શું આંકાય છે?
Show the answer
SQL%NOTFOUND TRUE આંકાય છે કારણ કે તમારા માપદંડ સાથે ફેરફાર માટે કોઈ database records મળ્યા નહીં. SQL%ROWCOUNT બિલકુલ 0 પાછું આપશે, પુષ્ટિ કરતાં કે disk પર શૂન્ય ફેરફારો થયા.
Theory
University Lab Exam માં ગુણની વ્યૂહરચના
બહારના laboratory મૂલ્યાંકનો માટે code લખતી વખતે, implicit statements આંકતી વખતે ક્યારેય explicit cursor ના નામનો prefix ન વાપરો. એક અનામી એકલા UPDATE command માટે IF c_my_cursor%FOUND લખવું એ તરત નાપાસ થવા બરાબર છે. બધી એકલી DML ક્રિયાઓ માટે, મૂલ્યાંકન panel પાસેથી સંપૂર્ણ performance ના marks મેળવવાની ખાતરી કરવા હંમેશા સીધો prefix SQL% વાપરો.
Summary
Key takeaways
- Cursor attributes એ જડેલા status flags છે જે સક્રિય statements વિશે નિર્ણાયક operational માપ પાછાં આપે છે.
- હાથે બનાવેલી pipelines માટે explicit cursor નું નામ વાપરો, અને implicit updates/deletes માટે સામાન્ય 'SQL' token.
- %ISOPEN સક્રિય memory માં હાજરી તપાસે છે; implicit statements હંમેશા FALSE હોય છે કારણ કે એ જાતે સમાપ્ત થાય છે.
- %FOUND અને %NOTFOUND એ દ્વિ-આધારી ચકાસણીના સૂચકો છે જે એક FETCH ચાલે ત્યાં સુધી સંપૂર્ણપણે NULL રહે છે.
- %ROWCOUNT એ ચાલુ ગણતરી છે જે database દ્વારા બહાર ખેંચાયેલી કે બદલાયેલી rows નું પ્રમાણ track કરે છે.
- બંધ થયેલા explicit cursor પર attributes સંદર્ભવાથી execution નો સંદર્ભ તરત એક Invalid Cursor error સાથે તૂટે છે.
- Memory hook: %ISOPEN લાઈન તપાસે છે, %FOUND data પકડે છે, %NOTFOUND બહાર નીકળવાનું સંભાળે છે, અને %ROWCOUNT ઢગલો ગણે છે!