sql >> Database teknologi >  >> RDS >> Oracle

Lær om DBMS_OUTPUT-pakken i Oracle

I denne artikel vil vi undersøge DBMS_OUTPUT pakke i nogle detaljer. DBMS_OUTPUT pakke i Oracle, ligesom andre DBMS-pakker, ejes af Oracle-brugeren SYS .

Scriptet, der opretter DBMS_OUTPUT giver UDFØR-tilladelsen på pakken til OFFENTLIGheden og opretter et offentligt synonym for det. Det betyder, at enhver Oracle-bruger kan kalde rutinerne i DBMS_OUTPUT uden at skulle præfikse pakkenavnet med SYS .

Hvordan fungerer DBMS_OUTPUT i Oracle?

To grundlæggende handlinger, GET og PUT , implementeres gennem procedurer i pakken. En PUT operation tager sit argument og placerer det i en intern buffer til lagring.

En GET operation læser fra denne buffer og returnerer indholdet som et argument til proceduren. Der er også en ENABLE procedure, der indstiller størrelsen af ​​bufferen.

Procedurer i DBMS_OUTPUT-pakken

PUT rutiner i pakken er PUT , PUT_LINE og NEW_LINE . GET rutiner er GET_LINE og GET_LINES . AKTIVER og DEAKTIVER kontrol af bufferen.

PUT og PUT_LINE Syntaksen for PUT- og PUT_LINE-kaldene er:

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

Hvor a er argumentet, der skal placeres i bufferen. Bemærk, at typen af ​​parameter overbelaster disse procedurer. På grund af de tre forskellige versioner af PUT og PUT_LINE , kan bufferen indeholde værdier af typen VARCHAR2 , NUMBER og DATE gemmes i bufferen i deres originale format. Dog GET_LINE og GET_LINES hent fra bufferen og returner kun tegnstrenge.

Når en GET handling udføres, vil indholdet af bufferen blive konverteret til en tegnstreng i henhold til standard datatypekonverteringsreglerne. Hvis du ønsker at angive et format for konverteringen, skal du bruge en eksplicit TO_CHAR kalde på PUT , i stedet for GET .

Bufferen er organiseret i linjer, som hver kan have maksimalt 255 bytes. PUT_LINE tilføjer et nylinjetegn efter dets argument, hvilket signalerer slutningen af ​​en linje. PUT gør ikke. PUT_LINE svarer til at kalde PUT og derefter kalde NEW_LINE .

NEW_LINE Syntaksen for NEW_LINE-kaldet er:

PROCEDURE NEW_LINE;

NEW_LINE sætter et nylinjetegn i bufferen, hvilket signalerer slutningen af ​​en linje. Der er ingen grænse for antallet af linjer i bufferen. Den samlede størrelse af bufferen er dog begrænset til den værdi, der er angivet i ENABLE.

GET_LINE Syntaksen for GET_LINE er:

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

Hvor linjen er en tegnstreng, der vil indeholde én linje af bufferen, og status angiver, om linjen blev hentet med succes. Den maksimale længde af en linje er 255 bytes. Hvis linjen blev hentet, ville status være 0; hvis der ikke er flere linjer i bufferen, vil det være 1.

BEMÆRK

Selvom den maksimale størrelse af en bufferlinje er 255 bytes, kan outputvariabellinjen være på mere end 255 tegn. Bufferlinjen kan bestå af DATE værdier for eksempel.

Disse optager 7 bytes lagerplads i bufferen, men konverteres normalt til tegnstrenge med længder større end 7.

GET_LINES

GET_LINES-proceduren har et argument, der er en PL/SQL-tabel. Tabeltypen og syntaksen er

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

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

Hvor linjer er en PL/SQL-tabel vil indeholde flere linjer fra bufferen og numlines angiver, hvor mange linjer der efterspørges. Ved input til GET_LINES, numlines angiver det ønskede antal linjer. Ved output vil numlines indeholde det faktiske antal returnerede linjer, som vil være mindre end eller lig med det anmodede antal. GET_LINES er designet til at erstatte flere opkald til GET_LINES.

CHARARR type er også defineret i DBMS_OUTPUT pakke. Derfor, hvis du vil ringe til GET_LINES eksplicit i din kode, skal du erklære en variabel af typen DBMS_OUTPUT . CHARARR . For eksempel:

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

AKTIVER og DEAKTIVER

Syntaksen for ENABLE og DISABLE opkaldene er:

PROCEDURE ENABLE (buffer_size IN INTEGER DEFAULT 20000);

PROCEDURE DISABLE;

Hvor buffer_size er den indledende størrelse af den interne buffer, i bytes. Standardstørrelsen er 20.000 bytes, og den maksimale størrelse er 1.000.000 bytes.

Senere argumenter til PUT eller PUT_LINE vil blive placeret i denne buffer. De er gemt i deres interne format og optager så meget plads i bufferen, som deres struktur tilsiger.

Hvis DISABLE kaldes, er indholdet af bufferen deres struktur dikterer. Hvis DISABLE kaldes, renses indholdet af bufferen, og efterfølgende kald til PUT og PUT_LINE påvirker ikke.

Brug af DBMS_OUTPUT

DBMS_OUTPUT pakken i sig selv indeholder ingen mekanisme til udskrivning. Grundlæggende implementerer den blot en først ind, først ud datastruktur.

Når det er sagt, hvordan kan vi bruge DBMS_OUTPUT til udskrivning? SQL*Plus, SQL*DBA og Manager vil have en indstilling kendt som SERVEROUTPUT . Derudover har nogle tredjepartsprodukter (SQL-Station inkluderet) en mulighed, der tillader visning af DBMS_OUTPUT data.

Med denne mulighed vil SQL*Plus automatisk kalde DBMS_OUTPUT.GET_LINES når en PL/SQL-blok afsluttes og udskriver eventuelle resultater på skærmen.

SQL*Plus-kommandoen SET SERVEROUTPUT ON implicit opkald, som sætter den interne buffer op. Du kan valgfrit angive størrelse med SET SERVEROUTPUT ON SIZE bufferstørrelse  hvor beffer_size  vil blive brugt som startstørrelsen af ​​bufferen (argumentet til DBMS_OUTPUT.ENABLE ).

Med SERVEROUTPUT on , vil SQL*Plus kalde DBMS_OUTPUT.GET_LINES efter  PL/SQL-blokken er fuldført. Det betyder, at outputtet vil blive ekkoet til skærmen, når blokeringen er færdig og ikke  under udførelse af blokken. Dette er normalt ikke et problem, når  DBMS_OUTPUT bruges til fejlretning.

FORSIGTIG

DBMS_OUTPUT er designet til primært at blive brugt til debugging. Det er ikke beregnet til generel rapportering. Hvis du har brug for at tilpasse outputtet fra dine forespørgsler, er det bedre at bruge værktøjer såsom Oracle Reports end DBMS_OUTPUT og 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 interne buffer har en maksimal størrelse (specificeret i DBMS_OUTPUT.ENABLE ), og hver linje har en maksimal længde på 255 bytes. Som følge heraf opkald til DBMS_OUTPUT.PUT , DBMS_OUTPUT.PUT_LINE og DBMS_OUTPUT.NEW_LINE kan hæve enten

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.

Beskeden afhænger af, hvilken grænse der overskrides.

Se også:

  • Hvordan aktiverer du DBMS_OUTPUT i Toad for Oracle?
  • Log DBMS_OUTPUT.Put_Line-output i tabel i Oracle med DBMS_OUTPUT.Get_Lines
  1. Migrering af en Oracle-database til MySQL på AWS, del 2

  2. Sådan opretter du en databasemodel fra bunden

  3. Sådan får du første række pr. gruppe i PostgreSQL

  4. Hvordan profilerer man PostgreSQL-databasen?