मैं ऐसा करने के लिए एक स्पष्ट कर्सर का उपयोग नहीं करूंगा। स्टीव एफ. अब लोगों को स्पष्ट कर्सर का उपयोग करने की सलाह नहीं देते हैं जब एक निहित कर्सर का उपयोग किया जा सकता है।
count(*)
. के साथ विधि असुरक्षित है। यदि कोई अन्य सत्र count(*)
. के साथ पंक्ति के बाद की शर्त को पूरा करने वाली पंक्ति को हटा देता है , और लाइन से पहले select ... into
, कोड एक अपवाद फेंक देगा जिसे संभाला नहीं जाएगा।
मूल पोस्ट के दूसरे संस्करण में यह समस्या नहीं है, और इसे आम तौर पर पसंद किया जाता है।
उस ने कहा, अपवाद का उपयोग करते हुए एक मामूली ओवरहेड है, और यदि आप 100% सुनिश्चित हैं कि डेटा नहीं बदलेगा, तो आप count(*)
का उपयोग कर सकते हैं , लेकिन मैं इसके खिलाफ अनुशंसा करता हूं।
मैंने इन बेंचमार्क को Oracle 10.2.0.1 . पर चलाया 32 बिट विंडोज़ . पर . मैं केवल बीता हुआ समय देख रहा हूं। अन्य परीक्षण हार्नेस हैं जो अधिक विवरण दे सकते हैं (जैसे कि लैच काउंट और उपयोग की गई मेमोरी)।
SQL>create table t (NEEDED_FIELD number, COND number);
SQL>insert into t (NEEDED_FIELD, cond) values (1, 0);
declare
otherVar number;
cnt number;
begin
for i in 1 .. 50000 loop
select count(*) into cnt from t where cond = 1;
if (cnt = 1) then
select NEEDED_FIELD INTO otherVar from t where cond = 1;
else
otherVar := 0;
end if;
end loop;
end;
/
declare
otherVar number;
begin
for i in 1 .. 50000 loop
begin
select NEEDED_FIELD INTO otherVar from t where cond = 1;
exception
when no_data_found then
otherVar := 0;
end;
end loop;
end;
/