Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Saiba mais sobre o pacote DBMS_OUTPUT no Oracle


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 em DATE 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 que DBMS_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