हाँ, बहुत से लोग एक बुरी प्रथा का पालन कर रहे हैं।
खराब शैली
मैं @Osy से सहमत हूं कि OPEN/FETCH/CLOSE पूरी तरह से अनावश्यक कोड जोड़ता है। मैं और भी आगे जाऊंगा, और कहूंगा कि आपको लगभग कभी भी CURSOR
. का उपयोग नहीं करना चाहिए ।
सबसे पहले, आप सामान्य रूप से सादा एसक्यूएल में जितना संभव हो उतना करना चाहते हैं। यदि आपको पीएल/एसक्यूएल का उपयोग करने की आवश्यकता है, तो एक निहित कर्सर का उपयोग करें। यह आपको कोड की एक पंक्ति बचाएगा और संबंधित तर्क को एक साथ रखने में आपकी सहायता करेगा।
मैं कोड की अलग-अलग इकाइयों को यथासंभव छोटा रखने में दृढ़ विश्वास रखता हूं। पहली नज़र में, यह एक CURSOR
जैसा लगता है ऐसा करने में आपकी मदद कर सकता है। आप अपने SQL को ऊपर एक स्थान पर परिभाषित कर सकते हैं, और फिर बाद में PL/SQL लूपिंग कर सकते हैं।
लेकिन वास्तव में, संकेत की वह अतिरिक्त परत लगभग कभी भी इसके लायक नहीं होती है। कभी-कभी SQL में बहुत सारे तर्क होते हैं, और कभी-कभी PL/SQL में बहुत सारे तर्क होते हैं। लेकिन व्यवहार में, दोनों में बहुत अधिक जटिल तर्क रखना शायद ही कभी समझ में आता है। आपका कोड आमतौर पर इनमें से किसी एक जैसा दिखता है:
for records in (<simple SQL>) loop
<complex PL/SQL>
end loop;
या:
for records in
(
<complex SQL>
) loop
<simple PL/SQL>;
end loop;
किसी भी तरह से, आपका एक कोड अनुभाग बहुत छोटा होगा। कोड के उन दो खंडों को अलग करने की जटिलता कोड के एक बड़े, एकल खंड की जटिलता से अधिक है। (लेकिन यह स्पष्ट रूप से मेरी राय है।)
खराब प्रदर्शन
ओपन/फ़ेच/क्लोज़ का उपयोग करने के साथ महत्वपूर्ण प्रदर्शन प्रभाव पड़ते हैं। वह तरीका बहुत धीमा है लूप या निहित कर्सर के लिए कर्सर का उपयोग करने के बजाय।
कंपाइलर स्वचालित रूप से लूप के लिए कुछ में बल्क कलेक्ट का उपयोग कर सकता है। लेकिन, Oracle प्रस्तुति से उद्धृत करने के लिए "PL/SQL प्रदर्शन—मिथकों को दूर करना" , पृष्ठ 122:
यहां एक त्वरित उदाहरण दिया गया है:
--Sample data
create table t(a number, b number);
insert into t select level, level from dual connect by level <= 100000;
commit;
--OPEN/FETCH/CLOSE
--1.5 seconds
declare
cursor test_cur is
select a, b from t;
test_rec test_cur%rowtype;
counter number;
begin
open test_cur;
loop
fetch test_cur into test_rec;
exit when test_cur%notfound;
counter := counter + 1;
end loop;
close test_cur;
end;
/
--Implicit cursor
--0.2 seconds
declare
counter number;
begin
for test_rec in (select a, b from t) loop
counter := counter + 1;
end loop;
end;
/