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

Oracle में DBMS_OUTPUT पैकेज के बारे में जानें

इस लेख में, हम 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 के साथ तालिका में लॉग इन करें

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. जावा से पीएल/एसक्यूएल में सरणी कैसे वापस करें?

  2. Oracle PLSQL में किसी भी वर्ष के लिए ईस्टर की तिथियां निर्धारित करना

  3. Oracle डेटाबेस में पैरामीटर के बिना PL/SQL संग्रहीत कार्यविधियाँ कैसे बनाएँ?

  4. Oracle नवीनतम दिनांक रिकॉर्ड का चयन करें

  5. जावा से ओरेकल प्रक्रिया में सूची कैसे पास करें?