sql >> Databasteknik >  >> RDS >> Oracle

Lär dig mer om DBMS_OUTPUT-paketet i Oracle

I den här artikeln kommer vi att undersöka DBMS_OUTPUT paketera i detalj. DBMS_OUTPUT paket i Oracle, liksom andra DBMS-paket, ägs av Oracle-användaren SYS .

Skriptet som skapar DBMS_OUTPUT ger EXECUTE-tillståndet för paketet till ALLMÄNHETEN och skapar en offentlig synonym för det. Detta innebär att alla Oracle-användare kan anropa rutinerna i DBMS_OUTPUT utan att behöva prefixa paketnamnet med SYS .

Hur fungerar DBMS_OUTPUT i Oracle?

Två grundläggande operationer, GET och PUT , implementeras genom procedurer i paketet. En PUT operation tar sitt argument och placerar det i en intern buffert för lagring.

En GET operation läser från denna buffert och returnerar innehållet som ett argument till proceduren. Det finns också en ENABLE procedur som anger storleken på bufferten.

Procedurer i DBMS_OUTPUT-paketet

PUT rutiner i paketet är PUT , PUT_LINE och NEW_LINE . GET rutiner är GET_LINE och GET_LINES . AKTIVERA och AVAKTIVERA kontroll av bufferten.

PUT och PUT_LINE Syntaxen för PUT- och PUT_LINE-anropen är:

PROCEDURE PUT(a VARCHAR2);
PROCEDURE PUT(a NUMBER);
PROCEDURE PUT(a DATE);
PROCEDURE PUT(a VARCHAR2);
PROCEDURE PUT(a NUMBER);
PROCEDURE PUT(a DATE);

Där a är argumentet som ska placeras i bufferten. Observera att typen av parameter överbelastas dessa procedurer. På grund av de tre olika versionerna av PUT och PUT_LINE , kan bufferten innehålla värden av typen VARCHAR2 , NUMBER och DATE lagras i bufferten i sitt ursprungliga format. Men GET_LINE och GET_LINES hämta från bufferten och returnera endast teckensträngar.

När en GET operationen utförs, kommer innehållet i bufferten att konverteras till en teckensträng enligt standarddatatypkonverteringsreglerna. Om du vill ange ett format för konverteringen, använd en explicit TO_CHAR anropa PUT , istället för GET .

Bufferten är organiserad i rader, som var och en kan ha maximalt 255 byte. PUT_LINE lägger till ett nyradstecken efter argumentet, vilket signalerar slutet på en rad. PUT gör inte. PUT_LINE motsvarar att anropa PUT och sedan anropa NEW_LINE .

NEW_LINE Syntaxen för NEW_LINE-anropet är:

PROCEDURE NEW_LINE;

NEW_LINE lägger ett nyradstecken i bufferten, vilket signalerar slutet på en rad. Det finns ingen gräns för antalet rader i bufferten. Den totala storleken på bufferten är dock begränsad till det värde som anges i ENABLE.

GET_LINE Syntaxen för GET_LINE är:

PROCEDURE GET_LINE(line OUT VARCHAR2, status OUT INTEGER);

Där raden är en teckensträng som kommer att innehålla en rad i bufferten, och status indikerar om raden har hämtats framgångsrikt. Den maximala längden på en rad är 255 byte. Om raden hämtades skulle statusen vara 0; om det inte finns fler rader i bufferten blir det 1.

OBS

Även om den maximala storleken på en buffertrad är 255 byte, kan den utgående variabelraden vara mer än 255 tecken. Buffertraden kan bestå av DATE värden, till exempel.

Dessa tar upp 7 byte lagringsutrymme i bufferten men konverteras vanligtvis till teckensträngar med längder större än 7.

GET_LINES

GET_LINES-proceduren har ett argument som är en PL/SQL-tabell. Tabelltypen och syntaxen är

TYPE CHARARR IS TABLE OF VERCHAR2(255)
INDEX BY BINARY_INTEGER;

PROCEDURE GET_LINES(lines OUT CHARARR,
numlines IN OUT INTEGER);

Där rader är en PL/SQL-tabell kommer att innehålla flera rader från bufferten och numlines anger hur många rader som efterfrågas. Vid inmatning till GET_LINES, numlines anger det begärda antalet rader. Vid utdata kommer numlines att innehålla det faktiska antalet returnerade rader, vilket kommer att vara mindre än eller lika med det antal som begärs. GET_LINES är utformad för att ersätta flera samtal till GET_LINES.

CHARARR typ definieras också i DBMS_OUTPUT paket. Därför, om du vill ringa GET_LINES uttryckligen i din kod måste du deklarera en variabel av typen DBMS_OUTPUT . CHARARR . Till exempel:

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;
/

AKTIVERA och INAKTIVERA

Syntaxen för ENABLE- och DISABLE-anropen är:

PROCEDURE ENABLE (buffer_size IN INTEGER DEFAULT 20000);

PROCEDURE DISABLE;

Där buffer_size är initialstorleken på den interna bufferten, i byte. Standardstorleken är 20 000 byte och den maximala storleken är 1 000 000 byte.

Senare, argument till PUT eller PUT_LINE kommer att placeras i denna buffert. De lagras i sitt interna format och tar upp så mycket utrymme i bufferten som deras struktur kräver.

Om DISABLE kallas, innehållet i bufferten är deras struktur dikterar. Om DISABLE anropas, rensas innehållet i bufferten och efterföljande anrop till PUT och PUT_LINE påverkar inte.

Använder DBMS_OUTPUT

DBMS_OUTPUT paketet i sig innehåller ingen mekanism för utskrift. I huvudsak implementerar den bara en först in, först ut datastruktur.

Med det sagt, hur kan vi använda DBMS_OUTPUT för utskrift? SQL*Plus, SQL*DBA och Manager kommer att ha ett alternativ som kallas SERVEROUTPUT . Dessutom har vissa tredjepartsprodukter (SQL-Station ingår) ett alternativ som tillåter visning av DBMS_OUTPUT data.

Med det här alternativet anropar SQL*Plus automatiskt DBMS_OUTPUT.GET_LINES när ett PL/SQL-block avslutas och resultaten, om några, skrivs ut på skärmen.

SQL*Plus-kommandot SET SERVEROUTPUT ON implicit anrop, som ställer in den interna bufferten. Alternativt kan du ange storlek med SET SERVEROUTPUT ON SIZE buffertstorlek  där beffer_size  kommer att användas som den initiala storleken på bufferten (argumentet till DBMS_OUTPUT.ENABLE ).

Med SERVEROUTPUT on , SQL*Plus anropar DBMS_OUTPUT.GET_LINES efter  PL/SQL-blocket har slutförts. Detta innebär att utdata kommer att ekas till skärmen när blockeringen är klar och inte  under utförande av blocket. Detta är vanligtvis inte ett problem när  DBMS_OUTPUT används för felsökning.

VARNING

DBMS_OUTPUT är utformad för att användas främst för felsökning. Den är inte avsedd för allmän rapportering. Om du behöver anpassa utdata från dina frågor är det bättre att använda verktyg som Oracle Reports än DBMS_OUTPUT och SQL*Plus.

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;
/

Den interna bufferten har en maximal storlek (anges i DBMS_OUTPUT.ENABLE ), och varje rad har en maximal längd på 255 byte. Som ett resultat anrop till DBMS_OUTPUT.PUT , DBMS_OUTPUT.PUT_LINE och DBMS_OUTPUT.NEW_LINE kan höja antingen

ORA-20000: ORU-10027: buffer overflow,
           limit of <buf_limit> bytes.

Eller

ORA-20000: ORU-10028 line lenth overflow,
           limit of 255 bytes per line.

Meddelandet beror på vilken gräns som överskrids.

Se även:

  • Hur aktiverar man DBMS_OUTPUT i Toad for Oracle?
  • Logga DBMS_OUTPUT.Put_Line-utdata i tabell i Oracle med DBMS_OUTPUT.Get_Lines
  1. Dataintegritet och prestandaöverväganden i MySQL semisynkron replikering

  2. Hur man bygger ett Rest API med Spring Boot med MySQL och JPA

  3. Inaktivera och senare aktivera alla tabellindex i Oracle

  4. COLLATION() Funktion i Oracle