Imprimir o valor de uma variável no SQL Developer


102

Eu queria imprimir o valor de uma determinada variável que está dentro de um bloco anônimo. Estou usando o Oracle SQL Developer. Tentei usar dbms_output.put_line. Mas isto não está funcionando. O código que estou usando é mostrado abaixo.

SET SERVEROUTPUT ON

DECLARE

  CTABLE USER_OBJECTS.OBJECT_NAME%TYPE;
  CCOLUMN ALL_TAB_COLS.COLUMN_NAME%TYPE;
  V_ALL_COLS VARCHAR2(500);

  CURSOR CURSOR_TABLE
    IS
    SELECT OBJECT_NAME 
    FROM USER_OBJECTS 
    WHERE OBJECT_TYPE='TABLE'
    AND OBJECT_NAME LIKE 'tb_prm_%';

  CURSOR CURSOR_COLUMNS (V_TABLE_NAME IN VARCHAR2)
    IS
    SELECT COLUMN_NAME
    FROM ALL_TAB_COLS
    WHERE TABLE_NAME = V_TABLE_NAME;

BEGIN

  OPEN CURSOR_TABLE;

  LOOP
    FETCH CURSOR_TABLE INTO CTABLE;
    EXIT WHEN CURSOR_TABLE%NOTFOUND;

    OPEN CURSOR_COLUMNS (CTABLE);

    V_ALL_COLS := NULL;

    LOOP
      FETCH CURSOR_COLUMNS INTO CCOLUMN;
      V_ALL_COLS := V_ALL_COLS || CCOLUMN;
      IF CURSOR_COLUMNS%FOUND THEN
        V_ALL_COLS := V_ALL_COLS || ', ';
      ELSE
        EXIT;
      END IF;
    END LOOP;

    DBMS_OUTPUT.PUT_LINE(V_ALL_COLS);

  END LOOP;
  CLOSE CURSOR_TABLE;

END;

E estou recebendo a saída apenas como anonymous block completed.


a saída é liberada no final / término do programa, é assim que funciona. Você não pode liberar para exibir durante a execução. Olhe em tabelas de log (transação autônoma) para ver o que está acontecendo enquanto um programa está sendo executado
tbone

Por que não usar o depurador integrado e percorrer seu bloco. Mostra o estado de todas as variáveis.
Wolf,

5
AJUSTE SERVEROUTPUT ON; --adicione o ponto e vírgula, selecione TODOS e execute no desenvolvedor, para mim está funcionando bem,
Praveenkumar_V

Respostas:


203

Você precisa ativar dbms_output. No Oracle SQL Developer:

  1. Mostre a janela de Saída de DBMS (Exibir-> Saída de DBMS).
  2. Pressione o botão "+" na parte superior da janela Saída de Dbms e selecione uma conexão de banco de dados aberta na caixa de diálogo que é aberta.

No SQL * Plus:

 SET SERVEROUTPUT ON

Na versão 1.5.5, parece que não tenho essa opção em Exibir. Há conexões, arquivos, relatórios ... Barra de status, barras de ferramentas, atualizar, mas nenhuma saída de DBMS. Muitas coisas em preferências, mas ainda não vejo uma opção de saída.
ruffin

1
@ruffin: v1.5.5 tem 3 anos. Estou usando a v3.0 e a versão atual parece ser a v3.1.
Klas Lindbäck

/ nods Estamos presos no 1.5.5 - se você tivesse a resposta à mão, eu aceitaria, mas nps caso contrário. Obrigado!
ruffin

Defino a opção "SET SERVEROUTPUT ON" na primeira linha do arquivo sql.
Samih A

Muito obrigado!
Amazigh.Ca

18

O SQL Developer parece produzir o texto DBMS_OUTPUT apenas quando você ativou explicitamente o painel da janela DBMS_OUTPUT.

Vá para (Menu) VIEW -> Dbms_output para chamar o painel.

Clique no sinal de mais verde para ativar a saída para sua conexão e, em seguida, execute o código.

EDIT: Não se esqueça de definir o tamanho do buffer de acordo com a quantidade de saída que você está esperando.


6

Faça a saída do servidor em Primeiro de tudo

  1. SET SERVEROUTPUT on então

  2. Vá para a janela de Saída de DBMS (Exibir-> Saída de DBMS)

  3. em seguida, pressione Ctrl+ Npara conectar o servidor


3

Existem 2 opções:

set serveroutput on format wrapped;

ou

Abra o menu 'view' e clique em 'dbms output'. Você deve obter uma janela de saída dbms na parte inferior da planilha. Em seguida, você precisa adicionar a conexão (por algum motivo, isso não é feito automaticamente).


1

1) Vá para visualizar o menu.
2) Selecione o item de menu DBMS_OUTPUT.
3) Pressione Ctrl+ Ne selecione o editor de conexão.
4) Execute o comando SET SERVEROUTPUT ON.
5) Em seguida, execute seu PL / SQL Script.

insira a descrição da imagem aqui insira a descrição da imagem aqui


0
DECLARE

  CTABLE USER_OBJECTS.OBJECT_NAME%TYPE;
  CCOLUMN ALL_TAB_COLS.COLUMN_NAME%TYPE;
  V_ALL_COLS VARCHAR2(5000);

  CURSOR CURSOR_TABLE
    IS
    SELECT OBJECT_NAME 
    FROM USER_OBJECTS 
    WHERE OBJECT_TYPE='TABLE'
    AND OBJECT_NAME LIKE 'STG%';

  CURSOR CURSOR_COLUMNS (V_TABLE_NAME IN VARCHAR2)
    IS
    SELECT COLUMN_NAME
    FROM ALL_TAB_COLS
    WHERE TABLE_NAME = V_TABLE_NAME;

BEGIN

  OPEN CURSOR_TABLE;
  LOOP
    FETCH CURSOR_TABLE INTO CTABLE;

    OPEN CURSOR_COLUMNS (CTABLE);
    V_ALL_COLS := NULL;
    LOOP

      FETCH CURSOR_COLUMNS INTO CCOLUMN;
      V_ALL_COLS := V_ALL_COLS || CCOLUMN;
      IF CURSOR_COLUMNS%FOUND THEN
        V_ALL_COLS := V_ALL_COLS || ', ';
      ELSE
        EXIT;
      END IF;
    END LOOP;
   close CURSOR_COLUMNS ;
    DBMS_OUTPUT.PUT_LINE(V_ALL_COLS);
    EXIT WHEN CURSOR_TABLE%NOTFOUND;
  END LOOP;`enter code here`
  CLOSE CURSOR_TABLE;

END;

Eu adicionei Fechar do segundo cursor. Está funcionando e obtendo resultados também ...


-1

selecione Exibir -> Saída de DBMS no menu e


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.