Oracle PL/SQL डायनेमिक SQL ट्यूटोरियल: तत्काल निष्पादन और DBMS_SQL
डायनामिक एसक्यूएल क्या है?
गतिशील एसक्यूएल रन-टाइम पर स्टेटमेंट बनाने और चलाने के लिए एक प्रोग्रामिंग पद्धति है। इसका उपयोग मुख्य रूप से सामान्य-उद्देश्य और लचीले प्रोग्राम लिखने के लिए किया जाता है, जहाँ SQL स्टेटमेंट को आवश्यकता के आधार पर रन-टाइम पर बनाया और निष्पादित किया जाएगा।
गतिशील SQL लिखने के तरीके
PL/SQL गतिशील SQL लिखने के दो तरीके प्रदान करता है
- एनडीएस – नेटिव डायनेमिक एसक्यूएल
- डीबीएमएस_एसक्यूएल
एनडीएस (नेटिव डायनेमिक एसक्यूएल) – तत्काल निष्पादित करें
नेटिव डायनेमिक SQL डायनेमिक SQL लिखने का आसान तरीका है। यह रन-टाइम पर SQL बनाने और निष्पादित करने के लिए 'EXECUTE IMMEDIATE' कमांड का उपयोग करता है। लेकिन इस तरीके का उपयोग करने के लिए, रन टाइम पर उपयोग किए जाने वाले डेटाटाइप और वेरिएबल की संख्या पहले से पता होनी चाहिए। DBMS_SQL की तुलना में यह बेहतर प्रदर्शन और कम जटिलता भी देता है।
वाक्य - विन्यास
EXECUTE IMMEDIATE(<SQL>) [INTO<variable>] [USING <bind_variable_value>]
- उपरोक्त सिंटैक्स EXECUTE IMMEDIATE कमांड दर्शाता है।
- क्लॉज INTO वैकल्पिक है और इसका उपयोग केवल तभी किया जाता है जब डायनेमिक SQL में एक सेलेक्ट स्टेटमेंट होता है जो मान प्राप्त करता है। वेरिएबल टाइप को सेलेक्ट स्टेटमेंट के वेरिएबल टाइप से मेल खाना चाहिए।
- खंड USING वैकल्पिक है और इसका प्रयोग केवल तभी किया जाता है जब डायनेमिक SQL में कोई बाइंड वेरिएबल शामिल हो।
उदाहरण 1इस उदाहरण में, हम NDS कथन का उपयोग करके emp_no '1001' के लिए emp तालिका से डेटा प्राप्त करने जा रहे हैं।
DECLARE lv_sql VARCHAR2(500); lv_emp_name VARCHAR2(50): ln_emp_no NUMBER; ln_salary NUMBER; ln_manager NUMBER; BEGIN ly_sql:=;SELECT emp_name,emp_no,salary,manager FROM emp WHERE emp_no=:empmo:; EXECUTE IMMEDIATE lv_sql INTO lv_emp_name,ln_emp_no:ln_salary,ln_manager USING 1001; Dbms_output.put_line('Employee Name:‘||lv_emp_name); Dbms_output.put_line('Employee Number:‘||ln_emp_no); Dbms_output.put_line(‘Salary:'||ln_salaiy); Dbms_output.put_line('Manager ID:‘||ln_manager); END; /
उत्पादन
Employee Name : XXX Employee Number: 1001 Salary: 15000 Manager ED: 1000
कोड स्पष्टीकरण:
- कोड लाइन 2-6: चर घोषित करना.
- कोड लाइन 8: रन-टाइम पर SQL को फ़्रेम करना। SQL में बाइंड वैरिएबल को where कंडीशन ':empno' में शामिल किया जाता है।
- कोड लाइन 9: फ़्रेमयुक्त SQL पाठ को निष्पादित करना (जो कोड लाइन 8 में किया गया है) NDS कमांड 'EXECUTE IMMEDIATE' का उपयोग करके
- 'INTO' खंड में चर (lv_emp_name, ln_emp_no, ln_salary, ln_manager) का उपयोग SQL क्वेरी (emp_name, emp_no, salary, manager) से प्राप्त मानों को रखने के लिए किया जाता है।
- 'USING' क्लॉज़ SQL क्वेरी (:emp_no) में बाइंड वेरिएबल को मान देता है।
- कोड लाइन 10-13: प्राप्त मान प्रदर्शित करना.
डायनेमिक SQL के लिए DBMS_SQL
PL/SQL DBMS_SQL पैकेज प्रदान करता है जो आपको डायनेमिक SQL के साथ काम करने की अनुमति देता है। डायनेमिक SQL बनाने और निष्पादित करने की प्रक्रिया में निम्नलिखित प्रक्रिया शामिल है।
- खुला कर्सर: गतिशील SQL उसी तरह से निष्पादित होगा जैसे कि कर्सरइसलिए SQL स्टेटमेंट को निष्पादित करने के लिए, हमें कर्सर खोलना होगा।
- SQL पार्स करेंअगला चरण डायनेमिक SQL को पार्स करना है। यह प्रक्रिया केवल सिंटैक्स की जांच करेगी और क्वेरी को निष्पादित करने के लिए तैयार रखेगी।
- बाइंड वैरिएबल मानअगला चरण बाइंड वेरिएबल्स (यदि कोई हो) के लिए मान निर्दिष्ट करना है।
- कॉलम परिभाषित करेंअगला चरण चयन कथन में उनके सापेक्ष स्थिति का उपयोग करके कॉलम को परिभाषित करना है।
- निष्पादितअगला चरण पार्स की गई क्वेरी को निष्पादित करना है।
- मान प्राप्त करेंअगला चरण निष्पादित मानों को प्राप्त करना है।
- कर्सर बंद करें: एक बार परिणाम प्राप्त हो जाने पर, कर्सर बंद कर देना चाहिए।
उदाहरण 1इस उदाहरण में, हम DBMS_SQL कथन का उपयोग करके emp_no '1001' के लिए emp तालिका से डेटा प्राप्त करने जा रहे हैं।
DECLARE lv_sql VARCHAR2(500); lv_emp_name VARCHAR2(50); ln_emp_no NUMBER; ln_salary NUMBER; ln_manager NUMBER; ln_cursor_id NUMBER; ln_rows_processed; BEGIN lv_sql:=‘SELECT emp_name,emp_no,salary,manager FROM emp WHERE emp_no=:empmo’; in_cursor_id:=DBMS_SQL.OPEN_CURSOR; DBMS_SQL.PARSE(ln_cursor_id,lv_sql,DBMS_SQL.NATIVE); DBMS_SQL.BIXD_VARLABLE(ln_cursor_id,:‘empno‘,1001); DBMS_SQL.DEFINE_COLUMN(ln_cursor_ici,1,ln_emp_name); DBMS_SQL.DEFINE_COLUMN(ln_cursor_id,2,ln_emp_no); DBMS_SQL .DEFINE_COLUMN(ln_cursor_id,3,ln_salary); DBMS_SQL .DEFINE_COLUMN(ln_cursor_id,4,ln_manager); ln_rows__processed:=DBMS_SQL.EXECUTE(ln_cursor_id);
LOOP IF DBMS_SQL.FETCH_ROWS(ln_cursor_id)=0 THEN EXIT; ELSE DBMS_SQL.COLUMN_VALUE(ln_cursor_id,1,lv_emp_name); DBMS_SQL.COLUMN_VALUE(ln_cursor_id,2,ln_emp_no); DBMS_SQL.COLUMN_VALUE(ln_cursor_id,3,In_salary); DBMS_SQL.COLUMN_VALUE(ln_cursor_id,4,In_manager); Dbms_output.put_line('Employee Name:‘||lv_emp_name); Dbms_output.put_line('Employee Number:l‘||ln_emp_no); Dbms_output.put_line(‘Salary:‘||ln_salary); Dbms_output.put_line('Manager ID :‘| ln_manager); END IF; END LOOP; DBMS_SQL.CLOSE_ClIRSOR(ln_cursor_id); END: /
उत्पादन
Employee Name:XXX Employee Number:1001 Salary:15000 Manager ID:1000
कोड स्पष्टीकरण:
- कोड लाइन 1-9: चर घोषणा.
- कोड लाइन 10: SQL कथन को तैयार करना.
- कोड लाइन 11: DBMS_SQL.OPEN_CURSOR का उपयोग करके कर्सर खोलना। यह खोले गए कर्सर आईडी को लौटाएगा।
- कोड लाइन 12: कर्सर खुलने के बाद, SQL को पार्स किया जाता है।
- कोड लाइन 13: बाइंड वेरिएबल '1001' को कर्सर आईडी के स्थान पर ':empno' असाइन किया जा रहा है।
- कोड लाइन 14-17: SQL कथन में उनकी सापेक्ष स्थिति के आधार पर कॉलम नाम को परिभाषित करना। हमारे मामले में, सापेक्ष स्थिति (1) emp_name, (2) emp_no (3) salary (4) manager है। इसलिए इस स्थिति के आधार पर हम लक्ष्य चर को परिभाषित कर रहे हैं।
- कोड लाइन 18: DBMS_SQL.EXECUTE का उपयोग करके क्वेरी निष्पादित करना। यह संसाधित किए गए रिकॉर्ड की संख्या लौटाता है।
- कोड लाइन 19-33लूप का उपयोग करके रिकॉर्ड प्राप्त करना और उन्हें प्रदर्शित करना।
- कोड पंक्ति 20: DBMS_SQL.FETCH_ROWS प्रोसेस की गई पंक्तियों में से एक रिकॉर्ड प्राप्त करेगा। सभी पंक्तियों को प्राप्त करने के लिए इसे बार-बार कॉल किया जा सकता है। यदि यह पंक्तियों को प्राप्त नहीं कर सकता है, तो यह 0 लौटाएगा, इस प्रकार लूप से बाहर निकल जाएगा।
सारांश
इस खंड में, हमने डायनेमिक SQL और डायनेमिक SQL को निष्पादित करने के तरीकों पर चर्चा की है। हमने दोनों तरीकों से डायनेमिक SQL को निष्पादित करने के विभिन्न चरणों को भी देखा है। हमने ऐसे उदाहरण भी देखे हैं जिनमें रन-टाइम पर निष्पादन करने के लिए NDS और DBMS_SQL दोनों तरीकों से एक ही परिदृश्य को संभाला जाता है।