W tym artykule przyjrzymy się DBMS_OUTPUT
pakiet w szczegółach. DBMS_OUTPUT
pakiet w Oracle, podobnie jak inne pakiety DBMS, jest własnością użytkownika Oracle SYS
.
Skrypt, który tworzy DBMS_OUTPUT
przyznaje uprawnienie EXECUTE do pakietu PUBLIC i tworzy dla niego publiczny synonim. Oznacza to, że każdy użytkownik Oracle może wywoływać procedury w DBMS_OUTPUT
bez konieczności poprzedzania nazwy pakietu przedrostkiem SYS
.
Jak działa DBMS_OUTPUT w Oracle?
Dwie podstawowe operacje, GET
i PUT
, są realizowane poprzez procedury zawarte w pakiecie. PUT
operacja pobiera jego argument i umieszcza go w wewnętrznym buforze do przechowywania.
GET
operacja odczytuje z tego bufora i zwraca zawartość jako argument do procedury. Istnieje również opcja ENABLE
procedura, która ustawia rozmiar bufora.
Procedury w pakiecie DBMS_OUTPUT
PUT
procedury w pakiecie to PUT
, PUT_LINE
i NEW_LINE
. GET
procedury to GET_LINE
i GET_LINES
. WŁĄCZ i WYŁĄCZ sterowanie buforem.
PUT i PUT_LINE Składnia wywołań PUT i PUT_LINE to:
PROCEDURE PUT(a VARCHAR2); PROCEDURE PUT(a NUMBER); PROCEDURE PUT(a DATE); PROCEDURE PUT(a VARCHAR2); PROCEDURE PUT(a NUMBER); PROCEDURE PUT(a DATE);
Gdzie a jest argumentem do umieszczenia w buforze. Należy zauważyć, że typ parametru przeciąża te procedury. Ze względu na trzy różne wersje PUT
i PUT_LINE
, bufor może zawierać wartości typu VARCHAR2
, NUMBER
i DATE
są przechowywane w buforze w ich oryginalnym formacie. Jednak GET_LINE
i GET_LINES
pobrać z bufora i zwrócić tylko ciągi znaków.
Gdy GET
zostanie wykonana operacja, zawartość bufora zostanie przekonwertowana na ciąg znaków zgodnie z domyślnymi regułami konwersji typów danych. Jeśli chcesz określić format konwersji, użyj jawnego TO_CHAR
wywołanie PUT
, a nie GET
.
Bufor jest zorganizowany w linie, z których każda może mieć maksymalnie 255 bajtów. PUT_LINE
dołącza znak nowej linii po swoim argumencie, sygnalizując koniec linii. PUT
nie. PUT_LINE
jest równoważne wywołaniu PUT
a następnie dzwoniąc do NEW_LINE
.
NEW_LINE Składnia wywołania NEW_LINE to:
PROCEDURE NEW_LINE;
NEW_LINE
umieszcza znak nowej linii w buforze, sygnalizując koniec linii. Nie ma ograniczeń co do liczby linii w buforze. Całkowity rozmiar bufora jest jednak ograniczony do wartości określonej w ENABLE.
GET_LINE Składnia GET_LINE to:
PROCEDURE GET_LINE(line OUT VARCHAR2, status OUT INTEGER);
Gdzie wiersz jest ciągiem znaków, który będzie zawierał jeden wiersz bufora, a status wskazuje, czy wiersz został pomyślnie pobrany. Maksymalna długość linii to 255 bajtów. Jeśli wiersz został pobrany, stan byłby równy 0; jeśli w buforze nie ma więcej linii, będzie to 1.
UWAGA
Chociaż maksymalny rozmiar linii bufora wynosi 255 bajtów, linia zmiennej wyjściowej może mieć więcej niż 255 znaków. Wiersz bufora może składać się z DATE
wartości, na przykład.
Zajmują one 7 bajtów pamięci w buforze, ale zwykle są konwertowane na ciągi znaków o długości większej niż 7.
GET_LINES
Procedura GET_LINES ma argument, który jest tabelą PL/SQL. Typ tabeli i składnia to
TYPE CHARARR IS TABLE OF VERCHAR2(255) INDEX BY BINARY_INTEGER; PROCEDURE GET_LINES(lines OUT CHARARR, numlines IN OUT INTEGER);
Gdzie wiersze to tabela PL/SQL będzie zawierać wiele wierszy z bufora, a numlines
wskazuje liczbę żądanych wierszy. Przy wejściu do GET_LINES, numlines
określa żądaną liczbę wierszy. Na wyjściu numlines będzie zawierać rzeczywistą liczbę zwróconych wierszy, która będzie mniejsza lub równa żądanej liczbie. GET_LINES ma na celu zastąpienie wielu wywołań GET_LINES.
CHARARR
typ jest również zdefiniowany w DBMS_OUTPUT
pakiet. Dlatego jeśli chcesz zadzwonić do GET_LINES
jawnie w swoim kodzie musisz zadeklarować zmienną typu DBMS_OUTPUT
. CHARARR
. Na przykład:
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; /
WŁĄCZ i WYŁĄCZ
Składnia wywołań ENABLE i DISABLE to:
PROCEDURE ENABLE (buffer_size IN INTEGER DEFAULT 20000); PROCEDURE DISABLE;
Gdzie rozmiar_bufora to początkowy rozmiar bufora wewnętrznego, w bajtach. Domyślny rozmiar to 20 000 bajtów, a maksymalny to 1 000 000 bajtów.
Później argumenty do PUT
lub PUT_LINE
zostanie umieszczony w tym buforze. Są one przechowywane w ich wewnętrznym formacie, zajmując tyle miejsca w buforze, ile wymaga ich struktura.
Jeśli DISABLE
nazywa się, zawartość bufora jest dyktowana przez ich strukturę. Jeśli DISABLE
jest wywoływana, zawartość bufora jest czyszczona, a kolejne wywołania PUT
i PUT_LINE
nie mają wpływu.
Korzystanie z DBMS_OUTPUT
DBMS_OUTPUT
samo opakowanie nie zawiera żadnego mechanizmu do drukowania. Zasadniczo implementuje jedynie strukturę danych „pierwsze weszło, pierwsze wyszło”.
Powiedziawszy to, jak możemy użyć DBMS_OUTPUT
? do druku? SQL*Plus, SQL*DBA i Manager mają opcję znaną jako SERVEROUTPUT
. Ponadto niektóre produkty innych firm (w tym SQL-Station) mają opcję umożliwiającą wyświetlanie DBMS_OUTPUT
dane.
Dzięki tej opcji SQL*Plus automatycznie wywoła DBMS_OUTPUT.GET_LINES
kiedy blok PL/SQL kończy się i wyświetla wyniki, jeśli takie istnieją, na ekranie.
Polecenie SQL*Plus SET SERVEROUTPUT ON
niejawne wywołania, które konfigurują wewnętrzny bufor. Opcjonalnie możesz określić rozmiar za pomocą SET SERVEROUTPUT ON SIZE
rozmiar_bufora gdzie beffer_size zostanie użyty jako początkowy rozmiar bufora (argument DBMS_OUTPUT.ENABLE
).
Z SERVEROUTPUT on
, SQL*Plus wywoła DBMS_OUTPUT.GET_LINES
po blok PL/SQL został zakończony. Oznacza to, że wynik zostanie wyświetlony na ekranie po zakończeniu bloku, a nie podczas wykonywania bloku. Zwykle nie stanowi to problemu, gdy DBMS_OUTPUT
służy do debugowania.
UWAGA
DBMS_OUTPUT
jest przeznaczony do użytku głównie do debugowania. Nie jest przeznaczony do ogólnej sprawozdawczości. Jeśli potrzebujesz dostosować dane wyjściowe swoich zapytań, lepiej jest użyć narzędzi takich jak Oracle Reports niż DBMS_OUTPUT
i 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; /
Bufor wewnętrzny ma maksymalny rozmiar (określony w DBMS_OUTPUT.ENABLE
), a każdy wiersz ma maksymalną długość 255 bajtów. W rezultacie wywołuje DBMS_OUTPUT.PUT
, DBMS_OUTPUT.PUT_LINE
i DBMS_OUTPUT.NEW_LINE
może podnieść albo
ORA-20000: ORU-10027: buffer overflow, limit of <buf_limit> bytes.
Lub
ORA-20000: ORU-10028 line lenth overflow, limit of 255 bytes per line.
Wiadomość zależy od tego, który limit został przekroczony.
Zobacz też:
- Jak włączyć DBMS_OUTPUT w Toad dla Oracle?
- Zaloguj dane wyjściowe DBMS_OUTPUT.Put_Line do tabeli w Oracle za pomocą DBMS_OUTPUT.Get_Lines