डायनेमिक SQL क्या है?
डायनेमिक SQL रन-टाइम पर स्टेटमेंट बनाने और चलाने के लिए एक प्रोग्रामिंग पद्धति है। यह मुख्य रूप से सामान्य-उद्देश्य और लचीले कार्यक्रमों को लिखने के लिए उपयोग किया जाता है जहां एसक्यूएल स्टेटमेंट बनाए जाएंगे और आवश्यकता के आधार पर रन-टाइम पर निष्पादित किए जाएंगे।
इस ट्यूटोरियल में, आप सीखेंगे-
- गतिशील SQL लिखने के तरीके
- NDS (नेटिव डायनेमिक SQL) - तत्काल निष्पादित करें
- DBMS_SQL डायनामिक SQL के लिए
गतिशील SQL लिखने के तरीके
PL / SQL गतिशील SQL लिखने के लिए दो तरीके प्रदान करता है
- NDS - नेटिव डायनेमिक SQL
- DBMS_SQL
NDS (नेटिव डायनेमिक SQL) - तत्काल निष्पादित करें
Native Dynamic SQL डायनामिक SQL लिखने का सबसे आसान तरीका है। यह रन-टाइम पर SQL बनाने और निष्पादित करने के लिए 'EXECUTE IMMEDIATE' कमांड का उपयोग करता है। लेकिन इस तरह से उपयोग करने के लिए, एक रन टाइम पर उपयोग किए जाने वाले डेटाटाइप और चर की संख्या को पहले जानने की आवश्यकता होती है। DBMS_SQL की तुलना में यह बेहतर प्रदर्शन और कम जटिलता भी देता है।
वाक्य - विन्यास
EXECUTE IMMEDIATE()[INTO ][USING ]
- उपरोक्त सिंटैक्स EXECUTE IMMEDIATE कमांड दिखाता है।
- क्लॉज INTO वैकल्पिक है और इसका उपयोग केवल तभी किया जाता है जब डायनेमिक SQL में चयन कथन होता है जो मूल्यों को प्राप्त करता है। चर प्रकार को चयन कथन के चर प्रकार के साथ मेल खाना चाहिए।
- क्लॉज़ का उपयोग वैकल्पिक है और इसका उपयोग केवल तभी किया जाता है जब डायनेमिक SQL में कोई बाइंड चर हो।
उदाहरण 1 : इस उदाहरण में, हम एनडीएस कथन का उपयोग करते हुए एम्प_no '1001' के लिए एंपायर टेबल से डेटा लाने जा रहे हैं।
DECLARElv_sql VARCHAR2(500);lv_emp_name VARCHAR2(50):ln_emp_no NUMBER;ln_salary NUMBER;ln_manager NUMBER;BEGINly_sql:=;SELECT emp_name,emp_no,salary,manager FROM emp WHEREemp_no=:empmo:;EXECUTE IMMEDIATE lv_sql INTO lv_emp_name,ln_emp_no:ln_salary,ln_managerUSING 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 : XXXEmployee Number: 1001Salary: 15000Manager ED: 1000
कोड स्पष्टीकरण:
- कोड लाइन 2-6 : घोषित चर।
- कोड लाइन 8 : रन-टाइम पर SQL को फ्रेम करना। SQL में बाइंड वैरिएबल है जहाँ 'कंडीशन: एम्पनो'।
- कोड पंक्ति 9 : NDS कमांड 'EXECUTE IMMEDIATE' का उपयोग करके फ़्रेम किए गए SQL पाठ (जो कोड 8 में किया गया है) को निष्पादित करना
- 'INTO' क्लॉज (lv_emp_name, ln_emp_no, ln_salary, ln_manager) में चर का उपयोग SQL क्वेरी (emp_name, emp.no, वेतन, प्रबंधक) से प्राप्त मूल्यों को रखने के लिए किया जाता है।
- 'USING' क्लॉज SQL क्वेरी (: emp_no) में बाइंड चर के मान देता है।
- कोड लाइन 10-13 : भ्रूण के मूल्यों को प्रदर्शित करना।
DBMS_SQL डायनामिक SQL के लिए
PL / SQL DBMS_SQL पैकेज प्रदान करता है जो आपको गतिशील SQL के साथ काम करने की अनुमति देता है। डायनेमिक SQL बनाने और निष्पादित करने की प्रक्रिया में निम्नलिखित प्रक्रिया होती है।
- खुली सेंसर : गतिशील एसक्यूएल एक कर्सर के समान निष्पादित करेगा। इसलिए SQL स्टेटमेंट को निष्पादित करने के लिए, हमें कर्सर को खोलना चाहिए।
- PARSE SQL : अगला चरण डायनेमिक SQL पार्स करना है। यह प्रक्रिया सिंटैक्स की जांच करेगी और क्वेरी को निष्पादित करने के लिए तैयार रखेगी।
- बाँध मानों : अगला चरण यदि कोई है तो बाँध चर के लिए मान नियत करना है।
- DEFINE COLUMN : अगला चरण चुनिंदा कथन में उनके सापेक्ष पदों का उपयोग करके कॉलम को परिभाषित करना है।
- EXECUTE : अगला चरण पार्स क्वेरी को निष्पादित करना है।
- FETCH VALUES : अगला चरण निष्पादित मूल्यों को प्राप्त करना है।
- CLOSE CURSOR : एक बार परिणाम लाने के बाद, कर्सर को बंद कर देना चाहिए।
उदाहरण 1 : इस उदाहरण में, हम DBMS_SQL स्टेटमेंट का उपयोग करते हुए एम्प_no '1001' के लिए एंपायर टेबल से डेटा लाने जा रहे हैं।
DECLARElv_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;BEGINlv_sql:=‘SELECT emp_name,emp_no,salary,manager FROM emp WHEREemp_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);
LOOPIF DBMS_SQL.FETCH_ROWS(ln_cursor_id)=0THENEXIT;ELSEDBMS_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:XXXEmployee Number:1001Salary:15000Manager ID:1000
कोड स्पष्टीकरण:
- कोड लाइन 1-9 : चर घोषणा।
- कोड लाइन 10 : एसक्यूएल स्टेटमेंट को तैयार करना।
- कोड पंक्ति 11 : DBMS_SQL.OPEN_CURSOR का उपयोग करके कर्सर खोलना। यह कर्सर आईडी खोलेगा जो खोला गया है।
- कोड लाइन 12 : कर्सर को खोलने के बाद, SQL को पार्स किया जाता है।
- कोड लाइन 13 : बाइंड वैरिएबल '1001' कर्सर आईडी के बजाय ': एम्पनो' को असाइन कर रहा है।
- कोड लाइन 14-17 : SQL स्टेटमेंट में उनकी सापेक्ष स्थिति के आधार पर कॉलम नाम को परिभाषित करना। हमारे मामले में, सापेक्ष स्थिति (1) emp_name, (2) emp_no (3) वेतन (4) प्रबंधक है। तो इस स्थिति के आधार पर हम लक्ष्य चर को परिभाषित कर रहे हैं।
- कोड लाइन 18 : DBMS_SQL.EXECUTE का उपयोग करके क्वेरी निष्पादित करना। यह संसाधित किए गए रिकॉर्ड की संख्या लौटाता है।
- कोड लाइन 19-33 : एक लूप का उपयोग करते हुए रिकॉर्ड प्राप्त करना और उसी को प्रदर्शित करना।
- कोड पंक्ति 20: DBMS_SQL.FETCH_ROWS संसाधित पंक्तियों में से एक रिकॉर्ड लाएगा। सभी पंक्तियों को लाने के लिए इसे बार-बार कहा जा सकता है। यदि यह पंक्तियों को नहीं ला सकता है, तो यह 0 लौटेगा, इस प्रकार लूप से बाहर निकल जाएगा।
सारांश
इस खंड में, हमने डायनेमिक एसक्यूएल और डायनामिक एसक्यूएल को निष्पादित करने के तरीकों पर चर्चा की है। हमने गतिशील SQL को दोनों तरीकों से निष्पादित करने के विभिन्न चरणों को भी देखा है। हमने उन उदाहरणों को भी देखा है जिसमें एक ही परिदृश्य को NDS और DBMS_SQL दोनों में रन-टाइम पर निष्पादन करने के तरीके से नियंत्रित किया जाता है।