Как сделать вывод sqlplus в одну строку?

47

У меня есть таблица с 100 столбцами. При выборе данных в SQL Plusвыходных оболочках затрудняется чтение.

Я бы предпочел, чтобы появилась горизонтальная полоса прокрутки или как-то отправить результат на less

Я запускаю следующие операторы в SQLPlus -

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

Тогда bashя бегу -

меньше output.txt

Вывод все еще кажется обернутым и нечитаемым.

Кшитиз Шарма
источник
1
Я также хотел бы, чтобы столбцы автоматически расширялись вместо того, чтобы устанавливать размер столбца для каждого из них по отдельности.
Кшитиз Шарма

Ответы:

58

Недостаточно заставить sqlplus не переносить строки. Также необходимо указать зрителю, что вы используете для просмотра файла спула, чтобы не переносить строки. Если ваш зритель - lessто -Sвариант, который вы должны использовать в соответствии с https://superuser.com/questions/272818/how-to-turn-off-word-wrap-in-less . В Unix / Linux вы можете использовать, head -1 output.txtчтобы получить первую строку файла и, таким образом, проверить, соответствует ли это ожиданиям, или вы можете использовать, od -c output.txt|head чтобы увидеть, где разрывы строк фактически размещаются в вашем выходном файле.

Если вы отображаете столбцы LONG, а их значения содержат разрывы строк, то для этих значений столбцов будет напечатано несколько строк, и вы не сможете отменить это с помощью настроек sqlplus.


Следующие команды sqlplus могут быть полезны:

  • SET LINESIZE linesizeдлина линии. В большинстве случаев максимальное значение linesizeравно 32767. Вы можете узнать максимальное значение, если для LINESIZE установлено недопустимое значение, и проверьте сообщение об ошибке, чтобы оно SET LINESIZE 0могло дать SP2-0267: linesize option 0 out of range (1 through 32767) (1)
  • SET TRIMSPOOL ON в противном случае каждая строка в спулфиле заполняется пробелами, пока не будет достигнут размер строки.
  • SET TRIMOUT ON в противном случае каждая строка в выводе заполняется пробелами, пока не будет достигнут размер строки.
  • SET WRAP OFFОбрезает строку, если она длиннее, чем LINESIZE. Этого не должно быть, если размер строки достаточно велик.
  • SET TERMOUT OFFподавляет вывод результатов на вывод. Строки все еще записываются в файл спула. Это может значительно ускорить время выполнения заявления.
  • SET PAGESIZE 0 установить бесконечный размер страницы и избегать заголовков, заголовков и так далее.
  • Есть и другие SETпараметры, касающиеся вывода (NUMWIDTH, NUMFORMAT, LONG, COLSEP) и производительности (ARRAYSIZE, LONGCHUNKSIZE).

Вы должны использовать COLUMNкоманду для форматирования отдельных столбцов.

Например column name format a30, nameмаксимальная длина столбца в выходных данных будет 30 символов.

Если вы хотите, чтобы размер экрана не был фиксированным, но он должен быть равен размеру фактического значения столбцов в строке, тогда я знаю только один способ - изменить предложение select вашего оператора, чтобы получить желаемый результат и использовать оператор конкатенации строк ||, например

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

Полное описание всех переменных можно найти в руководстве пользователя и справочнике по SQL * Plus .

Если вы хотите повторно использовать некоторые настройки (или определения COLUMN), вы можете сохранить их в файле и запустить этот файл, когда они вам понадобятся снова. Вы даже можете запустить этот файл автоматически, если вы запустите sqlplus.

(1) «Как найти максимальное значение LINESIZE (зависит от системы) (ID документа 1547262.1)»

miracle173
источник
LONGCHUNKSIZEречь идет не только о производительности, но, по-видимому, необходимо избегать нежелательного переноса строк в дополнение к этому LINESIZE, просто экспериментировал с непригодным выводом изDBMS_METADATA.get_ddl()
Daniel Vérité
2
Хороший ответ ...
ypercubeᵀᴹ
2
Что @ YperSillyCubeᵀᴹ сказал :)
Том V - Команда Моника
Вы должны использовать SET PAGESIZE 1000вместо этого, 0иначе заголовки столбцов не будут печататься при выполнении команд `SELECT '. Ссылка .
Pierre C
@PierreC, поэтому я написал «SET PAGESIZE 0, чтобы установить бесконечный размер страницы и избежать заголовков, заголовков и так далее».
чудо173
5

Вам необходимо установить ниже:

SET WRAP OFF
Балаз Папп
источник
3
set linesize 30000 SET WRAP OFFсделал свое дело для меня
Ren
2

Вы можете установить так

SET WRAP OFF

SET PAGESIZE 0
DevYudh
источник