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

'कहां मान में...' खंड में पैरामीटर का उपयोग कैसे करें?

कोडिंग के दृष्टिकोण से डायनेमिक SQL का उपयोग करना सबसे सरल तरीका है। हालाँकि, डायनेमिक SQL के साथ समस्या यह है कि आपको क्वेरी के हर विशिष्ट संस्करण को हार्ड पार्स करना होगा, जिसमें न केवल आपके CPU पर कर लगाने की क्षमता है, बल्कि आपके साझा पूल को बहुत सारे गैर-साझा करने योग्य SQL कथनों के साथ बाढ़ने की क्षमता है, धक्का दे रहा है आउट स्टेटमेंट जिन्हें आप कैश करना चाहते हैं, जिससे अधिक कठिन पार्स और साझा पूल फ़्रेग्मेंटेशन त्रुटियां हो सकती हैं। यदि आप इसे दिन में एक बार चला रहे हैं, तो शायद यह कोई बड़ी चिंता नहीं है। यदि सैकड़ों लोग इसे दिन में हज़ारों बार क्रियान्वित कर रहे हैं, तो यह संभवतः एक बड़ी चिंता का विषय है।

गतिशील SQL दृष्टिकोण का एक उदाहरण

SQL> ed
Wrote file afiedt.buf

  1  declare
  2    l_deptnos  varchar2(100) := '10,20';
  3    l_rc       sys_refcursor;
  4    l_dept_rec dept%rowtype;
  5  begin
  6    open l_rc for 'select * from dept where deptno in (' || l_deptnos || ')';
  7    loop
  8      fetch l_rc into l_dept_rec;
  9      exit when l_rc%notfound;
 10      dbms_output.put_line( l_dept_rec.dname );
 11    end loop;
 12    close l_rc;
 13* end;
SQL> /
ACCOUNTING
RESEARCH

PL/SQL procedure successfully completed.

वैकल्पिक रूप से, आप एक संग्रह का उपयोग कर सकते हैं। इसका एक एकल, साझा करने योग्य कर्सर बनाने का लाभ है, इसलिए आपको साझा पूल को हार्ड पार्सिंग या बाढ़ के बारे में चिंता करने की ज़रूरत नहीं है। लेकिन इसके लिए शायद थोड़ा और कोड चाहिए। संग्रह से निपटने का सबसे आसान तरीका

SQL> ed
Wrote file afiedt.buf

  1  declare
  2    l_deptnos  tbl_deptnos := tbl_deptnos(10,20);
  3  begin
  4    for i in (select *
  5                from dept
  6               where deptno in (select column_value
  7                                  from table(l_deptnos)))
  8    loop
  9      dbms_output.put_line( i.dname );
 10    end loop;
 11* end;
SQL> /
ACCOUNTING
RESEARCH

PL/SQL procedure successfully completed.

यदि, दूसरी तरफ, आपको वास्तव में मूल्यों की अल्पविराम से अलग सूची से शुरू करना है, तो आपको उस स्ट्रिंग को संग्रह में उपयोग करने से पहले उसे एक संग्रह में पार्स करना होगा। एक सीमांकित स्ट्रिंग को पार्स करने के कई तरीके हैं-- मेरा व्यक्तिगत पसंदीदा एक पदानुक्रमित क्वेरी में नियमित अभिव्यक्तियों का उपयोग करना है, लेकिन आप निश्चित रूप से एक प्रक्रियात्मक दृष्टिकोण भी लिख सकते हैं

SQL> ed
Wrote file afiedt.buf

  1  declare
  2    l_deptnos     tbl_deptnos;
  3    l_deptno_str  varchar2(100) := '10,20';
  4  begin
  5    select regexp_substr(l_deptno_str, '[^,]+', 1, LEVEL)
  6      bulk collect into l_deptnos
  7      from dual
  8   connect by level <= length(replace (l_deptno_str, ',', NULL));
  9    for i in (select *
 10                from dept
 11               where deptno in (select column_value
 12                                  from table(l_deptnos)))
 13    loop
 14      dbms_output.put_line( i.dname );
 15    end loop;
 16* end;
 17  /
ACCOUNTING
RESEARCH

PL/SQL procedure successfully completed.


  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. Oracle में संगतता स्तर की जाँच करने के 2 तरीके (SQLcl और SQL*Plus)

  3. JDBC - Oracle ArrayIndexOutOfBoundsException

  4. ओरेकल को ओआरए-12704 फेंकने के लिए ईएफ क्वेरी:चरित्र सेट मेल नहीं खाता

  5. पुनरावर्ती सबक्वेरी फैक्टरिंग के साथ साइकिल का पता लगाना