Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

क्या Oracle में CURSORs के माध्यम से लूपिंग करते समय EXIT WEN निर्देश का उपयोग करना एक बुरा अभ्यास है?

हाँ, बहुत से लोग एक बुरी प्रथा का पालन कर रहे हैं।

खराब शैली

मैं @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;
/


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. मैं Oracle में समूह द्वारा लापता तिथियों को कैसे भर सकता हूँ?

  2. Stroredprocedure निष्पादित करते समय त्रुटि आ रही है

  3. प्राथमिक कुंजी संयोजन कैसे प्राप्त करें जिसमें शून्य मान हो सकते हैं?

  4. यदि मान नहीं बदलता है तो केवल दिनांक रिकॉर्ड को संक्षिप्त करना - Oracle SQL

  5. oci_connect कनेक्शन विफल