如何使sqlplus输出显示在一行中?


46

我有一张有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
我还希望这些列能够自动扩展,而不必我分别为每个列设置列大小。
Kshitiz Sharma

Answers:


57

强制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行的长度。在大多数情况下,最大值为linesize32767。如果将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,则将其截断。如果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)”


LONGCHUNKSIZE不仅仅是性能,这似乎是需要避免不必要的换行除了LINESIZE,只是不能使用输出这个实验从DBMS_METADATA.get_ddl()
丹尼尔·维泰

2
尼斯的答案...
ypercubeᵀᴹ

2
@YperSillyCubeᵀᴹ说的话:)
Tom V

您应该使用SET PAGESIZE 1000,而不是 0发行`选择”命令时,否则列标题将无法打印。参考
皮埃尔·ç

@PierreC这就是为什么我写的“SET PAGESIZE 0设置无限页面大小,避免标题,标题等。”
miracle173


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.