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