Neste artigo, examinaremos o
DBMS_OUTPUT
pacote com algum detalhe. DBMS_OUTPUT
pacote no Oracle, como outros pacotes DBMS, é de propriedade do usuário Oracle SYS
. O script que cria
DBMS_OUTPUT
concede a permissão EXECUTE no pacote para o PUBLIC e cria um sinônimo público para ele. Isso significa que qualquer usuário Oracle pode chamar as rotinas em DBMS_OUTPUT
sem ter que prefixar o nome do pacote com SYS
. Como funciona o DBMS_OUTPUT no Oracle?
Duas operações básicas,
GET
e PUT
, são implementados por meio de procedimentos no pacote. Um PUT
operação pega seu argumento e o coloca em um buffer interno para armazenamento. Um
GET
operação lê deste buffer e retorna o conteúdo como um argumento para o procedimento. Há também um ENABLE
procedimento que define o tamanho do buffer. Procedimentos no pacote DBMS_OUTPUT
O
PUT
rotinas no pacote são PUT
, PUT_LINE
e NEW_LINE
. O GET
rotinas são GET_LINE
e GET_LINES
. HABILITAR e DESATIVAR o controle do buffer. PUT e PUT_LINE A sintaxe para as chamadas PUT e PUT_LINE são:
PROCEDURE PUT(a VARCHAR2); PROCEDURE PUT(a NUMBER); PROCEDURE PUT(a DATE); PROCEDURE PUT(a VARCHAR2); PROCEDURE PUT(a NUMBER); PROCEDURE PUT(a DATE);
Onde a é o argumento a ser colocado no buffer. Observe que o tipo do parâmetro sobrecarrega esses procedimentos. Por causa das três versões diferentes de
PUT
e PUT_LINE
, o buffer pode conter valores dos tipos VARCHAR2
, NUMBER
e DATE
são armazenados no buffer em seu formato original. No entanto, GET_LINE
e GET_LINES
recuperar do buffer e retornar apenas cadeias de caracteres. Quando um
GET
operação for executada, o conteúdo do buffer será convertido em uma cadeia de caracteres de acordo com as regras de conversão de tipo de dados padrão. Se você quiser especificar um formato para a conversão, use um TO_CHAR
explícito chamar no PUT
, em vez do GET
. O buffer é organizado em linhas, cada uma das quais pode ter no máximo 255 bytes.
PUT_LINE
acrescenta um caractere de nova linha após seu argumento, sinalizando o fim de uma linha. PUT
não. PUT_LINE
é equivalente a chamar PUT
e, em seguida, chamando NEW_LINE
. NEW_LINE A sintaxe da chamada NEW_LINE é:
PROCEDURE NEW_LINE;
NEW_LINE
coloca um caractere de nova linha no buffer, sinalizando o fim de uma linha. Não há limite para o número de linhas no buffer. No entanto, o tamanho total do buffer é limitado ao valor especificado em ENABLE. GET_LINE A sintaxe para GET_LINE é:
PROCEDURE GET_LINE(line OUT VARCHAR2, status OUT INTEGER);
Onde a linha é uma cadeia de caracteres que conterá uma linha do buffer e o status indica se a linha foi recuperada com sucesso. O comprimento máximo de uma linha é 255 bytes. Se a linha fosse recuperada, o status seria 0; se não houver mais linhas no buffer, será 1.
NOTA
Embora o tamanho máximo de uma linha de buffer seja 255 bytes, a linha variável de saída pode ter mais de 255 caracteres. A linha do buffer pode consistir emDATE
valores, por exemplo.
Eles ocupam 7 bytes de armazenamento no buffer, mas geralmente são convertidos em strings de caracteres com comprimentos maiores que 7.
GET_LINES
O procedimento GET_LINES tem um argumento que é uma tabela PL/SQL. O tipo de tabela e a sintaxe são
TYPE CHARARR IS TABLE OF VERCHAR2(255) INDEX BY BINARY_INTEGER; PROCEDURE GET_LINES(lines OUT CHARARR, numlines IN OUT INTEGER);
Onde linhas é uma tabela PL/SQL conterá várias linhas do buffer e
numlines
indica quantas linhas são solicitadas. Na entrada para GET_LINES, numlines
especifica o número de linhas solicitado. Na saída, as numlines conterão o número real de linhas retornadas, que será menor ou igual ao número solicitado. GET_LINES foi projetado para substituir várias chamadas para GET_LINES. O
CHARARR
type também é definido no DBMS_OUTPUT
pacote. Portanto, se você quiser chamar GET_LINES
explicitamente em seu código, você precisa declarar uma variável do tipo DBMS_OUTPUT
. CHARARR
. Por exemplo: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; /
ATIVAR e DESATIVAR
A sintaxe para as chamadas ENABLE e DISABLE é:
PROCEDURE ENABLE (buffer_size IN INTEGER DEFAULT 20000); PROCEDURE DISABLE;
Onde buffer_size é o tamanho inicial do buffer interno, em bytes. O tamanho padrão é 20.000 bytes e o tamanho máximo é 1.000.000 bytes.
Mais tarde, argumentos para
PUT
ou PUT_LINE
será colocado neste buffer. Eles são armazenados em seu formato interno, ocupando tanto espaço no buffer quanto sua estrutura exige. Se
DISABLE
é chamado, o conteúdo do buffer é ditado pela estrutura. Se DISABLE
é chamado, o conteúdo do buffer é limpo e as chamadas subsequentes para PUT
e PUT_LINE
não afete. Usando DBMS_OUTPUT
O
DBMS_OUTPUT
pacote em si não contém nenhum mecanismo para impressão. Essencialmente, ele implementa apenas uma estrutura de dados first in, first out. Dito isso, como podemos usar
DBMS_OUTPUT
para impressão? SQL*Plus, SQL*DBA e Manager terão uma opção conhecida como SERVEROUTPUT
. Além disso, alguns produtos de terceiros (incluído SQL-Station) possuem uma opção que permite a exibição de DBMS_OUTPUT
dados. Com esta opção, o SQL*Plus chamará automaticamente
DBMS_OUTPUT.GET_LINES
quando um bloco PL/SQL conclui e imprime os resultados, se houver, na tela. O comando SQL*Plus
SET SERVEROUTPUT ON
chamadas implicitamente, que configura o buffer interno. Opcionalmente, você pode especificar o tamanho com SET SERVEROUTPUT ON SIZE
buffer_size onde beffer_size será usado como o tamanho inicial do buffer (o argumento para DBMS_OUTPUT.ENABLE
). Com
SERVEROUTPUT on
, o SQL*Plus chamará DBMS_OUTPUT.GET_LINES
depois o bloco PL/SQL foi concluído. Isso significa que a saída será ecoada na tela quando o bloco terminar e não durante a execução do bloco. Isso geralmente não é um problema quando DBMS_OUTPUT
é usado para depuração. CUIDADO
DBMS_OUTPUT
é projetado para ser usado principalmente para depuração. Não se destina a relatórios gerais. Se você precisar personalizar a saída de suas consultas, é melhor usar ferramentas como Oracle Reports do queDBMS_OUTPUT
e 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; /
O buffer interno tem um tamanho máximo (especificado em
DBMS_OUTPUT.ENABLE
), e cada linha tem um comprimento máximo de 255 bytes. Como resultado, as chamadas para DBMS_OUTPUT.PUT
, DBMS_OUTPUT.PUT_LINE
e DBMS_OUTPUT.NEW_LINE
pode aumentar tanto ORA-20000: ORU-10027: buffer overflow, limit of <buf_limit> bytes.
Ou
ORA-20000: ORU-10028 line lenth overflow, limit of 255 bytes per line.
A mensagem depende de qual limite é excedido.
Veja também:
- Como habilitar DBMS_OUTPUT no Toad for Oracle?
- Registrar saída DBMS_OUTPUT.Put_Line na tabela no Oracle com DBMS_OUTPUT.Get_Lines