Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Dowiedz się więcej o pakiecie DBMS_OUTPUT w Oracle

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
  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak sprawdzić brakujący numer z szeregu liczb?

  2. Niesamowite pytania do rozmowy kwalifikacyjnej z 24 równoległymi menedżerami

  3. SQL, kaskadowe usuwanie i kaskadowe aktualizowanie

  4. oracle konwertuj czas epoki unix na datę

  5. 4 sposoby znajdowania wierszy zawierających wielkie litery w Oracle