sql >> Databáze >  >> RDS >> Oracle

Přečtěte si o balíčku DBMS_OUTPUT v Oracle

V tomto článku prozkoumáme DBMS_OUTPUT balíček podrobně. DBMS_OUTPUT balíček v Oracle, stejně jako ostatní balíčky DBMS, vlastní uživatel Oracle SYS .

Skript, který vytváří DBMS_OUTPUT uděluje oprávnění EXECUTE k balíčku PUBLIC a vytvoří pro něj veřejné synonymum. To znamená, že každý uživatel Oracle může volat rutiny v DBMS_OUTPUT aniž byste museli před název balíčku přidávat SYS .

Jak funguje DBMS_OUTPUT v Oracle?

Dvě základní operace GET a PUT , jsou implementovány prostřednictvím procedur v balíčku. PUT operace vezme svůj argument a umístí jej do vnitřní vyrovnávací paměti pro uložení.

A GET operace čte z této vyrovnávací paměti a vrací obsah jako argument proceduře. K dispozici je také ENABLE procedura, která nastavuje velikost vyrovnávací paměti.

Postupy v balíčku DBMS_OUTPUT

PUT rutiny v balíčku jsou PUT , PUT_LINE a NEW_LINE . GET rutiny jsou GET_LINE a GET_LINES . ENABLE a DISABLE ovládání vyrovnávací paměti.

PUT a PUT_LINE Syntaxe volání PUT a PUT_LINE jsou:

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

Kde a je argument, který má být umístěn do vyrovnávací paměti. Všimněte si, že typ parametru tyto procedury přetěžuje. Kvůli třem různým verzím PUT a PUT_LINE , buffer může obsahovat hodnoty typu VARCHAR2 , NUMBER a DATE jsou uloženy ve vyrovnávací paměti v původním formátu. Nicméně GET_LINE a GET_LINES načíst z vyrovnávací paměti a vrátit pouze znakové řetězce.

Když GET Po provedení operace bude obsah vyrovnávací paměti převeden na znakový řetězec podle výchozích pravidel převodu datových typů. Pokud chcete určit formát pro převod, použijte explicitní TO_CHAR zavolejte na PUT , spíše než GET .

Vyrovnávací paměť je organizována do řádků, z nichž každý může mít maximálně 255 bajtů. PUT_LINE přidá znak nového řádku za jeho argument, což signalizuje konec řádku. PUT ne. PUT_LINE je ekvivalentní volání PUT a poté volání NEW_LINE .

NEW_LINE Syntaxe volání NEW_LINE je:

PROCEDURE NEW_LINE;

NEW_LINE vloží znak nového řádku do vyrovnávací paměti, signalizující konec řádku. Počet řádků ve vyrovnávací paměti není omezen. Celková velikost vyrovnávací paměti je však omezena na hodnotu uvedenou v ENABLE.

GET_LINE Syntaxe GET_LINE je:

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

Kde řádek je řetězec znaků, který bude obsahovat jeden řádek vyrovnávací paměti, a stav označuje, zda byl řádek úspěšně načten. Maximální délka řádku je 255 bajtů. Pokud by byl řádek načten, stav by byl 0; pokud ve vyrovnávací paměti nejsou žádné další řádky, bude to 1.

POZNÁMKA

Ačkoli maximální velikost řádku vyrovnávací paměti je 255 bajtů, řádek výstupní proměnné může mít více než 255 znaků. Řádek vyrovnávací paměti může obsahovat DATE hodnoty, například.

Tyto zabírají 7 bajtů úložiště ve vyrovnávací paměti, ale obvykle se převádějí na znakové řetězce s délkou větší než 7.

GET_LINES

Procedura GET_LINES má argument, kterým je tabulka PL/SQL. Typ tabulky a syntaxe jsou

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

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

Kde je řádky tabulka PL/SQL bude obsahovat více řádků z vyrovnávací paměti a numlines udává, kolik řádků je požadováno. Na vstupu GET_LINES numlines udává požadovaný počet řádků. Na výstupu budou numline obsahovat skutečný počet vrácených řádků, který bude menší nebo roven požadovanému počtu. GET_LINES je navržen tak, aby nahradil několik volání GET_LINES.

CHARARR typ je také definován v DBMS_OUTPUT balík. Pokud tedy chcete volat GET_LINES explicitně ve svém kódu musíte deklarovat proměnnou typu DBMS_OUTPUT . CHARARR . Například:

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

ZAPNOUT a ZAKÁZAT

Syntaxe volání ENABLE a DISABLE je:

PROCEDURE ENABLE (buffer_size IN INTEGER DEFAULT 20000);

PROCEDURE DISABLE;

Kde velikost_bufferu je počáteční velikost vnitřní vyrovnávací paměti v bajtech. Výchozí velikost je 20 000 bajtů a maximální velikost je 1 000 000 bajtů.

Později argumenty pro PUT nebo PUT_LINE budou umístěny do této vyrovnávací paměti. Jsou uloženy ve svém vnitřním formátu a zabírají tolik místa ve vyrovnávací paměti, jak to vyžaduje jejich struktura.

Pokud DISABLE se nazývá, obsah vyrovnávací paměti je jejich struktura diktuje. Pokud DISABLE se zavolá, obsah vyrovnávací paměti se vyčistí a následná volání PUT a PUT_LINE neovlivní.

Pomocí DBMS_OUTPUT

DBMS_OUTPUT samotný balíček neobsahuje žádný mechanismus pro tisk. V podstatě implementuje pouze datovou strukturu první dovnitř, první ven.

Jak tedy můžeme použít DBMS_OUTPUT pro tisk? SQL*Plus, SQL*DBA a Manager budou mít možnost známou jako SERVEROUTPUT . Některé produkty třetích stran (včetně SQL-Station) mají navíc možnost, která umožňuje zobrazení DBMS_OUTPUT data.

S touto volbou SQL*Plus automaticky zavolá DBMS_OUTPUT.GET_LINES když blok PL/SQL uzavře a vytiskne výsledky, pokud existují, na obrazovku.

Příkaz SQL*Plus SET SERVEROUTPUT ON implicitně volá, které nastaví vnitřní vyrovnávací paměť. Volitelně můžete určit velikost pomocí SET SERVEROUTPUT ON SIZE velikost_bufferu  kde beffer_size  se použije jako počáteční velikost vyrovnávací paměti (argument pro DBMS_OUTPUT.ENABLE ).

Se SERVEROUTPUT on , SQL*Plus zavolá DBMS_OUTPUT.GET_LINES po  blok PL/SQL byl dokončen. To znamená, že výstup se po dokončení bloku zobrazí na obrazovce a ne  během provádění bloku. To obvykle není problém, když  DBMS_OUTPUT se používá k ladění.

POZOR

DBMS_OUTPUT je navržen tak, aby byl používán především pro ladění. Není určeno pro obecné podávání zpráv. Pokud potřebujete upravit výstup z vašich dotazů, je lepší použít nástroje jako Oracle Reports než DBMS_OUTPUT a 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;
/

Vnitřní vyrovnávací paměť má maximální velikost (uvedenou v DBMS_OUTPUT.ENABLE ) a každý řádek má maximální délku 255 bajtů. Výsledkem je volání DBMS_OUTPUT.PUT , DBMS_OUTPUT.PUT_LINE a DBMS_OUTPUT.NEW_LINE může zvýšit buď

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

Nebo

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

Zpráva závisí na tom, který limit byl překročen.

Viz také:

  • Jak povolit DBMS_OUTPUT v Toad pro Oracle?
  • Přihlásit výstup DBMS_OUTPUT.Put_Line do tabulky v Oracle pomocí DBMS_OUTPUT.Get_Lines
  1. MySQL – ORDER BY hodnot v IN()

  2. Konfigurace upozornění na e-mail databáze v MS SQL Server

  3. Předání parametru do DB .execute pro seznam WHERE IN... INT

  4. Podpora PDO pro více dotazů (PDO_MYSQL, PDO_MYSQLND)