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 emDATEvalores, 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_OUTPUTe 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