इस लेख में, हम DBMS_OUTPUT
. की जांच करेंगे कुछ विस्तार से पैकेज। DBMS_OUTPUT
Oracle में पैकेज, अन्य DBMS पैकेजों की तरह, Oracle उपयोगकर्ता SYS
. के स्वामित्व में है ।
स्क्रिप्ट जो DBMS_OUTPUT
creates बनाता है जनता को पैकेज पर निष्पादन की अनुमति देता है, और इसके लिए एक सार्वजनिक पर्याय बनाता है। इसका मतलब है कि कोई भी Oracle उपयोगकर्ता DBMS_OUTPUT
. में रूटीन को कॉल कर सकता है पैकेज नाम को SYS
. के साथ उपसर्ग किए बिना ।
DBMS_OUTPUT Oracle में कैसे काम करता है?
दो बुनियादी ऑपरेशन, GET
और PUT
, पैकेज में प्रक्रियाओं के माध्यम से कार्यान्वित किया जाता है। एक PUT
ऑपरेशन अपना तर्क लेता है और इसे भंडारण के लिए आंतरिक बफर में रखता है।
एक GET
ऑपरेशन इस बफर से पढ़ता है और सामग्री को प्रक्रिया के तर्क के रूप में देता है। एक ENABLE
भी है प्रक्रिया जो बफर का आकार निर्धारित करती है।
DBMS_OUTPUT पैकेज में प्रक्रियाएं
PUT
पैकेज में रूटीन हैं PUT
, PUT_LINE
, और NEW_LINE
. GET
रूटीन हैं GET_LINE
और GET_LINES
. बफर का नियंत्रण सक्षम और अक्षम करें।
PUT और PUT_LINE PUT और PUT_LINE कॉल के लिए सिंटैक्स हैं:
PROCEDURE PUT(a VARCHAR2); PROCEDURE PUT(a NUMBER); PROCEDURE PUT(a DATE); PROCEDURE PUT(a VARCHAR2); PROCEDURE PUT(a NUMBER); PROCEDURE PUT(a DATE);
जहां a बफर में रखा जाने वाला तर्क है। ध्यान दें कि पैरामीटर का प्रकार इन प्रक्रियाओं को अधिभारित करता है। PUT
. के तीन अलग-अलग संस्करणों के कारण और PUT_LINE
, बफर में प्रकार के मान हो सकते हैं VARCHAR2
, NUMBER
, और DATE
बफर में उनके मूल स्वरूप में संग्रहीत हैं। हालांकि, GET_LINE
और GET_LINES
बफर से पुनर्प्राप्त करें और केवल कैरेक्टर स्ट्रिंग्स लौटाएं।
जब एक GET
ऑपरेशन किया जाता है, बफर की सामग्री को डिफ़ॉल्ट डेटाटाइप रूपांतरण नियमों के अनुसार कैरेक्टर स्ट्रिंग में परिवर्तित कर दिया जाएगा। यदि आप रूपांतरण के लिए प्रारूप निर्दिष्ट करना चाहते हैं, तो स्पष्ट TO_CHAR
का उपयोग करें PUT
पर कॉल करें , के बजाय GET
।
बफर को लाइनों में व्यवस्थित किया जाता है, जिनमें से प्रत्येक में अधिकतम 255 बाइट्स हो सकते हैं। PUT_LINE
अपने तर्क के बाद एक नई पंक्ति वर्ण जोड़ता है, जो एक पंक्ति के अंत का संकेत देता है। PUT
नहीं करता। PUT_LINE
कॉल करने के बराबर है PUT
और फिर NEW_LINE
पर कॉल कर रहे हैं ।
NEW_LINE NEW_LINE कॉल का सिंटैक्स है:
PROCEDURE NEW_LINE;
NEW_LINE
एक नई लाइन कैरेक्टर को बफर में डालता है, एक लाइन के अंत का संकेत देता है। बफर में लाइनों की संख्या की कोई सीमा नहीं है। हालांकि, बफ़र का कुल आकार ENABLE में निर्दिष्ट मान तक सीमित है।
GET_LINE GET_LINE का सिंटैक्स है:
PROCEDURE GET_LINE(line OUT VARCHAR2, status OUT INTEGER);
जहां लाइन एक कैरेक्टर स्ट्रिंग है जिसमें बफर की एक लाइन होगी, और स्थिति इंगित करती है कि लाइन सफलतापूर्वक पुनर्प्राप्त की गई थी या नहीं। एक लाइन की अधिकतम लंबाई 255 बाइट्स है। यदि रेखा को पुनः प्राप्त किया गया था, तो स्थिति 0 होगी; यदि बफ़र में और कोई पंक्तियाँ नहीं हैं, तो यह 1 होगी।
नोट
<ब्लॉकक्वॉट>
हालांकि बफर लाइन का अधिकतम आकार 255 बाइट्स है, आउटपुट वेरिएबल लाइन 255 वर्णों से अधिक हो सकती है। बफर लाइन में DATE
हो सकता है मान, उदाहरण के लिए।
ये बफर में 7 बाइट स्टोरेज लेते हैं लेकिन आमतौर पर 7 से अधिक लंबाई वाले कैरेक्टर स्ट्रिंग्स में बदल जाते हैं।
GET_LINES
GET_LINES प्रक्रिया में एक तर्क है जो एक PL/SQL तालिका है। तालिका प्रकार और सिंटैक्स हैं
TYPE CHARARR IS TABLE OF VERCHAR2(255) INDEX BY BINARY_INTEGER; PROCEDURE GET_LINES(lines OUT CHARARR, numlines IN OUT INTEGER);
जहां लाइनें एक पीएल/एसक्यूएल तालिका है, वहां बफर से कई लाइनें होंगी, और numlines
इंगित करता है कि कितनी पंक्तियों का अनुरोध किया गया है। GET_LINES में इनपुट पर, numlines
अनुरोधित पंक्तियों की संख्या निर्दिष्ट करता है। आउटपुट पर, numlines में लौटाई गई लाइनों की वास्तविक संख्या होगी, जो अनुरोधित संख्या से कम या उसके बराबर होगी। GET_LINES को कई कॉलों को GET_LINES में बदलने के लिए डिज़ाइन किया गया है।
CHARARR
प्रकार को DBMS_OUTPUT
. में भी परिभाषित किया गया है पैकेट। इसलिए, यदि आप GET_LINES
पर कॉल करना चाहते हैं स्पष्ट रूप से आपके कोड में, आपको DBMS_OUTPUT
. प्रकार का एक चर घोषित करने की आवश्यकता है . CHARARR
. उदाहरण के लिए:
Create Table temp_table (char_col varchar2(4000)) / DECLARE /* Demonstrates using PUT_LINE and GET_LINE. */ v_Data DBMS_OUTPUT.CHARARR; v_NumLines NUMBER; BEGIN -- Enable the buffer first. DBMS_OUTPUT.ENABLE(1000000); -- Put some data in the buffer first, so GET_LINES will -- retrieve something. DBMS_OUTPUT.PUT_LINE( 'Line' ); DBMS_OUTPUT.PUT_LINE( 'Line Two' ); DBMS_OUTPUT.PUT_LINE( 'Line Three' ); --Set the maximum number of lines that we want to retrieve. v_NumLines := 3 ; /* Get the contents of the buffer back. Note that v_DATA is declared of type DBMS_OUTPUT. CHARARR, so that it matches the declaration of DBMS_OUTPUT. GET_LINES. */ DBMS_OUTPUT.GET_LINES(v_DATA, v_NumLines); /* Loop through the returned buffer, and insert the contents into tem_table. */ For v_Counter IN 1.. v_NumLines Loop INSERT INTO temp_table ( char_col ) VALUES ( v_Data ( v_Counter )); END LOOP; END; /
सक्षम और अक्षम करें
सक्षम और अक्षम कॉलों का सिंटैक्स है:
PROCEDURE ENABLE (buffer_size IN INTEGER DEFAULT 20000); PROCEDURE DISABLE;
जहां बफर_साइज बाइट्स में आंतरिक बफर का प्रारंभिक आकार है। डिफ़ॉल्ट आकार 20,000 बाइट्स है, और अधिकतम आकार 1,000,000 बाइट्स है।
बाद में, PUT
. के लिए तर्क या PUT_LINE
इस बफर में रखा जाएगा। वे अपने आंतरिक प्रारूप में संग्रहीत होते हैं, बफर में उतनी ही जगह लेते हैं जितनी उनकी संरचना तय करती है।
अगर DISABLE
कहा जाता है, बफर की सामग्री उनकी संरचना तय करती है। अगर DISABLE
कहा जाता है, बफर की सामग्री को शुद्ध किया जाता है, और बाद में PUT
. पर कॉल किया जाता है और PUT_LINE
प्रभावित न करें।
DBMS_OUTPUT का उपयोग करना
DBMS_OUTPUT
पैकेज में ही मुद्रण के लिए कोई तंत्र नहीं है। अनिवार्य रूप से, यह केवल पहली बार, पहले आउट डेटा संरचना को लागू करता है।
ऐसा कहने के बाद, हम DBMS_OUTPUT
. का उपयोग कैसे कर सकते हैं? छपाई के लिए? SQL*Plus, SQL*DBA, और Manager के पास SERVEROUTPUT
नामक एक विकल्प होगा। . इसके अलावा, कुछ तृतीय-पक्ष उत्पादों (SQL-Station शामिल) में एक विकल्प होता है जो DBMS_OUTPUT
के प्रदर्शन की अनुमति देता है डेटा।
इस विकल्प के साथ, SQL*Plus स्वचालित रूप से DBMS_OUTPUT.GET_LINES
को कॉल करेगा जब कोई PL/SQL ब्लॉक समाप्त होता है और परिणाम, यदि कोई हो, को स्क्रीन पर प्रिंट करता है।
SQL*Plus कमांड SET SERVEROUTPUT ON
परोक्ष रूप से कॉल करता है, जो आंतरिक बफ़र सेट करता है। वैकल्पिक रूप से, आप SET SERVEROUTPUT ON SIZE
. के साथ आकार निर्दिष्ट कर सकते हैं बफ़र_साइज़ जहां beffer_size बफर के प्रारंभिक आकार के रूप में उपयोग किया जाएगा (DBMS_OUTPUT.ENABLE
के लिए तर्क) )।
SERVEROUTPUT on
के साथ , SQL*प्लस DBMS_OUTPUT.GET_LINES
पर कॉल करेगा बाद PL/SQL ब्लॉक पूरा हो गया है। इसका मतलब यह है कि जब ब्लॉक समाप्त हो जाएगा तो आउटपुट स्क्रीन पर प्रतिध्वनित होगा और नहीं ब्लॉक के निष्पादन के दौरान। यह आमतौर पर कोई समस्या नहीं है जब DBMS_OUTPUT
डिबगिंग के लिए प्रयोग किया जाता है।
सावधानी
<ब्लॉकक्वॉट>
DBMS_OUTPUT
मुख्य रूप से डिबगिंग के लिए उपयोग करने के लिए डिज़ाइन किया गया है। यह सामान्य रिपोर्टिंग के लिए नहीं है। यदि आपको अपने प्रश्नों के आउटपुट को अनुकूलित करने की आवश्यकता है, तो DBMS_OUTPUT
की तुलना में Oracle रिपोर्ट्स जैसे टूल का उपयोग करना बेहतर है। और एसक्यूएल*प्लस.
SET serveroutput on SIZE 1000000 BEGIN DBMS_OUTPUT.PUT_LINE('Before loop'); FOR v_Counter IN 1..10 LOOP DBMS_OUTPUT.PUT_LINE('Inside loop, couter = ' || v_Counter); END LOOP; DBMS_OUPUT.PUT_LINE( 'After loop'); END; /
आंतरिक बफ़र का अधिकतम आकार होता है (DBMS_OUTPUT.ENABLE
में निर्दिष्ट) ), और प्रत्येक पंक्ति की अधिकतम लंबाई 255 बाइट्स होती है। परिणामस्वरूप, DBMS_OUTPUT.PUT
पर कॉल किया जाता है , DBMS_OUTPUT.PUT_LINE
, और DBMS_OUTPUT.NEW_LINE
या तो बढ़ा सकते हैं
ORA-20000: ORU-10027: buffer overflow, limit of <buf_limit> bytes.
या
ORA-20000: ORU-10028 line lenth overflow, limit of 255 bytes per line.
संदेश इस बात पर निर्भर करता है कि किस सीमा को पार किया गया है।
यह भी देखें:
- Oracle के लिए टॉड में DBMS_OUTPUT कैसे सक्षम करें?
- DBMS_OUTPUT.Put_Line आउटपुट को Oracle में DBMS_OUTPUT.Get_Lines के साथ तालिका में लॉग इन करें