暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

SQL*Plus 输出格式调整

生有可恋 2022-10-21
2653

SQL*Plus 是命令行界面,如果不对列宽进行设置,输出的内容会出现格式混乱.SQL*Plus 可以通过命令来调整输出格式。

SQL*Plus 的输出格式可以通过 set 指令进行调整,已经设置好的参数可以使用 show 指令进行显示。

    SQL> set num 8
    SQL> show num
    numwidth 8

    使用 show 命令显示的数字长度受 numwidth 控制,当数据过长时会切换为科学计数法,比如 show sga 显示内存共享区大小:

      SQL> show sga
      Total System Global Area 1.53E+11 bytes
      Fixed Size 2295392 bytes
      Variable Size 5.15E+10 bytes
      Database Buffers 1.01E+11 bytes
      Redo Buffers 3.91E+08 bytes

      此时如果需要显示完整数字长度,重新设置 numwidth 即可,参数可以使用缩写,num 只需要拼出部分即可。

        SQL> set num 15
        SQL> show sga
        Total System Global Area 152864395264 bytes
        Fixed Size 2295392 bytes
        Variable Size 51539610016 bytes
        Database Buffers 100931731456 bytes
        Redo Buffers 390758400 bytes
        SQL>

        另两个比较重要的参数是行宽与页的长度,linesize 是每一行多少个字符,pagesize 是多少行显示一个表头。当 linesize 设置不合理时,会出现如下图所示的换行:

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

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

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

        列宽和页的长度确认了之后,下一步就是设置每一列的宽度.目前我们用的最多的有两种格式,即字符串和数字,设置的语句分别为

          col tablespace_name for a15
          col size_mb for 999

          其中 col 是 column 列的缩写,for 是 format 格式的缩写.对于字符的长度,可以用 An 来表示,其中 A 表示 alphabetic 即字母的意思,n 表示长度.  

          关于字符长度的描述,我们看下官方文档是如何说的:

            A LONG, BLOB, BFILE, CLOB, NCLOB XMLType 
            or JSON column's width defaults to the value
            of SET LONGCHUNKSIZE or SET LONG, whichever
            one 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 a5
                SQL> col type for a3
                SQL> col value for a5
                SQL> show parameter nls_date_


                NAME TYP VALUE
                ------------------------------------ --- ------------------------------
                nls_date_format str YYYY-MM-DD
                ing
                nls_date_language str
                ing

                我们发现只有 type 列按我们的要求变短了, name 列 和 value 列并没有发生变化.我们使用专用列名来调整这两个列的宽度:

                  SQL> col name_col_plus_show_param for a18
                  SQL> col value_col_plus_show_param for a12
                  SQL> col type for a8
                  SQL> show parameter nls_date_


                  NAME TYPE VALUE
                  ------------------ -------- ------------
                  nls_date_format string YYYY-MM-DD
                  nls_date_language string


                  可以看到 name 列 和 value 列的宽度已经得到调整.

                  参考:

                  • https://docs.oracle.com/en/database/oracle/oracle-database/21/sqpug/COLUMN.html#GUID-643B665F-B134-4A0B-88F7-10400D6D199E


                  全文完。

                  如果转发本文,文末务必注明:“转自微信公众号:生有可恋”。

                         

                  文章转载自生有可恋,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                  评论