Como fazer com que a saída do sqlplus apareça em uma linha?

47

Eu tenho uma mesa com 100 colunas. Ao selecionar dados na SQL Plussaída, dificulta a leitura.

O que eu gostaria é que uma barra de rolagem horizontal apareça ou, de alguma forma, envie a saída para less

Eu executo as seguintes instruções no SQLPlus -

SET LINESIZE 32000;
SET PAGESIZE 40000;
SET LONG 50000;
SPOOL output.txt
SELECT * FROM big_table;

Então basheu corro -

menos output.txt

A saída ainda parece quebrada e ilegível.

Kshitiz Sharma
fonte
1
Eu também gostaria que as colunas se expandissem automaticamente, em vez de eu precisar definir o tamanho da coluna para cada uma individualmente.
Kshitiz Sharma #

Respostas:

58

Não basta forçar o sqlplus a não quebrar linhas. Também é necessário informar ao visualizador que você usa para exibir o arquivo de spool para não quebrar as linhas. Se o seu espectador é less, em seguida, -Sa opção que você tem que usar de acordo com https://superuser.com/questions/272818/how-to-turn-off-word-wrap-in-less . No Unix / Linux, você pode usar head -1 output.txtpara obter a primeira linha de um arquivo e, assim, verificar se isso é o esperado ou pode od -c output.txt|head ver para onde as quebras de linha são realmente colocadas no seu arquivo de saída.

Se você exibir colunas LONG e seus valores contiverem quebras de linha, várias linhas serão impressas para esses valores de coluna e você não poderá substituí-lo nas configurações do sqlplus.


Os seguintes comandos sqlplus podem ser úteis:

  • SET LINESIZE linesizeo comprimento da linha. Na maioria dos casos, o valor máximo para linesizeé 32767. Você pode descobrir o seu valor máximo se definir LINESIZE com um valor inválido e verificar a mensagem de erro, para SET LINESIZE 0fornecer SP2-0267: linesize option 0 out of range (1 through 32767) (1)
  • SET TRIMSPOOL ON caso contrário, todas as linhas no arquivo de spool serão preenchidas com espaços em branco até que o tamanho da linha seja atingido.
  • SET TRIMOUT ON caso contrário, cada linha na saída será preenchida com espaços em branco até que o tamanho da linha seja atingido.
  • SET WRAP OFFTrunca a linha, se for maior que LINESIZE. Isso não deve acontecer se o tamanho da linha for grande o suficiente.
  • SET TERMOUT OFFsuprime a impressão dos resultados na saída. As linhas ainda são gravadas no arquivo de spool. Isso pode acelerar muito o tempo de execução de uma declaração.
  • SET PAGESIZE 0 para definir um tamanho de página infinito e evitar títulos, títulos e assim por diante.
  • Existem outros SETparâmetros relacionados à saída (NUMWIDTH, NUMFORMAT, LONG, COLSEP) e desempenho (ARRAYSIZE, LONGCHUNKSIZE).

Você precisa usar o COLUMNcomando para formatar colunas individuais.

Por exemplo column name format a30, formatará a coluna namena saída com um comprimento máximo de 30 caracteres.

Se você deseja que o tamanho da exibição não seja corrigido, mas deve ser igual ao tamanho do valor real de uma coluna em uma linha, a única maneira que eu sei é que você altera a cláusula select da sua instrução para obter o resultado desejado e usar o operador de concatenação de cadeias ||, por exemplo

select emp_id||' '||first_name||' '||last_name
from emp;

Uma descrição completa de todas as variáveis ​​pode ser encontrada no Guia e Referência do Usuário do SQL * Plus .

Se você deseja reutilizar algumas configurações (ou definições COLUMN), é possível armazená-las em um arquivo e executá-lo quando precisar delas novamente. Você pode executar esse arquivo automaticamente se iniciar o sqlplus.

(1) "Como encontrar o valor máximo de LINESIZE (depende do sistema) (ID do documento 1547262.1)"

miracle173
fonte
LONGCHUNKSIZEnão é apenas sobre o desempenho, parece ser necessário para evitar indesejável quebra de linha , além de LINESIZE, apenas experimentou isso com saída inutilizável deDBMS_METADATA.get_ddl()
Daniel Vérité
2
Resposta agradável ...
ypercubeᵀᴹ
2
O que @ YperSillyCubeᵀᴹ disse :) #
V Tom Tom
Você deve usar SET PAGESIZE 1000em vez de 0outra forma cabeçalhos das colunas não imprimirá ao emitir SELECT" comandos. Referência .
Pierre C
@PierreC foi por isso que escrevi "SET PAGESIZE 0 para definir um tamanho de página infinito e evitar títulos, títulos e assim por diante".
miracle173 25/07
5

Você precisa definir o seguinte:

SET WRAP OFF
Balazs Papp
fonte
3
set linesize 30000 SET WRAP OFFfez o truque para mim #
1155
2

você pode definir assim

SET WRAP OFF

SET PAGESIZE 0
DevYudh
fonte