SQL*Plus 是命令行界面,如果不对列宽进行设置,输出的内容会出现格式混乱.SQL*Plus 可以通过命令来调整输出格式。
SQL*Plus 的输出格式可以通过 set 指令进行调整,已经设置好的参数可以使用 show 指令进行显示。
SQL> set num 8SQL> show numnumwidth 8
使用 show 命令显示的数字长度受 numwidth 控制,当数据过长时会切换为科学计数法,比如 show sga 显示内存共享区大小:
SQL> show sgaTotal System Global Area 1.53E+11 bytesFixed Size 2295392 bytesVariable Size 5.15E+10 bytesDatabase Buffers 1.01E+11 bytesRedo Buffers 3.91E+08 bytes
此时如果需要显示完整数字长度,重新设置 numwidth 即可,参数可以使用缩写,num 只需要拼出部分即可。
SQL> set num 15SQL> show sgaTotal System Global Area 152864395264 bytesFixed Size 2295392 bytesVariable Size 51539610016 bytesDatabase Buffers 100931731456 bytesRedo Buffers 390758400 bytesSQL>
另两个比较重要的参数是行宽与页的长度,linesize 是每一行多少个字符,pagesize 是多少行显示一个表头。当 linesize 设置不合理时,会出现如下图所示的换行:

此时如果屏幕够宽,可以将 linesize 设置大一点,以下是将 linesize 设置为 200 的效果.

另一个参数 pagesize 影响的是表头,当 pagesize 设置过小时,列头的重复会比较频繁,比如 pagesize 设置为 5 时 :

当 pagesize 设置为 0 时将取消页的限制, 查询结果不显示列头, 只显示内容.

列宽和页的长度确认了之后,下一步就是设置每一列的宽度.目前我们用的最多的有两种格式,即字符串和数字,设置的语句分别为
col tablespace_name for a15col size_mb for 999
其中 col 是 column 列的缩写,for 是 format 格式的缩写.对于字符的长度,可以用 An 来表示,其中 A 表示 alphabetic 即字母的意思,n 表示长度.
关于字符长度的描述,我们看下官方文档是如何说的:
A LONG, BLOB, BFILE, CLOB, NCLOB XMLTypeor JSON column's width defaults to the valueof SET LONGCHUNKSIZE or SET LONG, whicheverone is smaller.To change the width of a datatype to n,use FORMAT An. (A stands for alphabetic.)
也就是说 set long 命令也可以设置字符长度, 它是所有字符长度的默认值,如果需要单独设置可以使用 col xxx for aN 来调整某一列的长度.
数字格式主要用 9 和 0 作为长度的占位符,当设置的数字长度不够时,SQL 输出中的数字将无法正确显示,并会以 # 代替,如下图所示:

使用数字0作为占位符可以在长度不足时补0:

时间和日期格式不能通过 col 命令去调整,而是通过设置 nls_date_format 参数:
ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD';
最后说一下 show parameter 中的表如何调整,因为参数文件中的参数的格式与SQL不太一样,SQL 中的列名可以直接使用 col 加列名设置宽度,但 show parameter 显示的列并不是 SQL 中的列:

其中有三列需要调整, name, type, value,我们尝试使用普通方法看能否调整其列宽:
SQL> col name for a5SQL> col type for a3SQL> col value for a5SQL> show parameter nls_date_NAME TYP VALUE------------------------------------ --- ------------------------------nls_date_format str YYYY-MM-DDingnls_date_language string
我们发现只有 type 列按我们的要求变短了, name 列 和 value 列并没有发生变化.我们使用专用列名来调整这两个列的宽度:
SQL> col name_col_plus_show_param for a18SQL> col value_col_plus_show_param for a12SQL> col type for a8SQL> show parameter nls_date_NAME TYPE VALUE------------------ -------- ------------nls_date_format string YYYY-MM-DDnls_date_language string
可以看到 name 列 和 value 列的宽度已经得到调整.
参考:
https://docs.oracle.com/en/database/oracle/oracle-database/21/sqpug/COLUMN.html#GUID-643B665F-B134-4A0B-88F7-10400D6D199E
全文完。
如果转发本文,文末务必注明:“转自微信公众号:生有可恋”。




