代码之家  ›  专栏  ›  技术社区  ›  Ogre Psalm33

如何格式化Oracle SQL纯文本选择输出

  •  5
  • Ogre Psalm33  · 技术社区  · 16 年前

    我正在使用Oracle SQL(在sqldeveloper中,因此我没有访问sqlplus命令(如column)的权限)来执行如下所示的查询:

    select assigner_staff_id as staff_id, active_flag, assign_date,
      complete_date, mod_date
    from work where assigner_staff_id = '2096';
    

    它给我的结果是这样的:

    STAFF_ID               ACTIVE_FLAG ASSIGN_DATE               COMPLETE_DATE             MOD_DATE                  
    ---------------------- ----------- ------------------------- ------------------------- ------------------------- 
    2096                   F           25-SEP-08                 27-SEP-08                 27-SEP-08 02.27.30.642959000 PM 
    2096                   F           25-SEP-08                 25-SEP-08                 25-SEP-08 01.41.02.517321000 AM 
    
    2 rows selected
    

    当我试图将结果作为格式良好的快速n脏文本块粘贴到电子邮件或问题报告等中时,这可以非常容易地生成一个非常宽和笨拙的文本报告。当我仅使用普通Oracle SQL时,如何最好地消除输出列中所有多余的空白?到目前为止,我所有的网络搜索都没有出现太多,因为所有的网络搜索结果都显示了如何使用格式化命令,如sqlplus中的column(我没有)。

    6 回复  |  直到 11 年前
        1
  •  2
  •   Thomas Jones-Low    16 年前

    你用什么获得结果?粘贴的输出看起来像是来自SQL*PLUS。可能是,无论您使用什么工具来生成结果,都有一些修改输出的方法。

    默认情况下,Oracle根据标题的宽度或列数据的宽度输出列,而这些列数据的宽度永远都是更宽的。

    如果要使列变小,则需要重命名列或将其转换为文本,并使用substr()使默认值变小。

    select substr(assigner_staff_id, 8) as staff_id, 
          active_flag as Flag, 
          to_char(assign_date, 'DD/MM/YY'),
          to_char(complete_date, 'DD/MM/YY'), 
          mod_date
    from work where assigner_staff_id = '2096';
    
        2
  •  2
  •   Jim Clouse    12 年前

    在语句中,可以指定要查找的输出类型:

    select /*csv*/ col1, col2 from table;
    select /*Delimited*/ col1, col2 from table;
    

    还有其他可用的格式,如XML、HTML、文本、加载程序等。

    您可以在“工具”>“首选项”>“数据库”>“实用程序”>“导出”下更改这些特定选项的格式。

    请确保选择“运行脚本”而不是“运行语句”。

    *这是针对Oracle SQL Developer v3.2的

        3
  •  1
  •   John    16 年前

    使用SQL所能做的工作受工具的限制。SQL Plus有格式化列的命令,但它们并不真正易于使用。

    一种快速的方法是将输出粘贴到Excel中并格式化,或者只附加电子表格。有些工具会将输出直接保存为电子表格。

        4
  •  0
  •   AJ.    16 年前

    问得好。我真的不得不考虑一下。

    您可以做的一件事是更改SQL,使其只返回最窄的可用列。

    例如(我对Oracle语法不太感兴趣,但应该有类似的功能):

    select substring( convert(varchar(4), assigner_staff_id), 1, 4 ) as id, 
           active_flag as act, -- use shorter column name
    
           -- etc. 
    
    from work where assigner_staff_id = '2096';
    

    这有道理吗?
    如果您在Unix/Linux上执行此操作,我建议从命令行运行它,并通过一个awk脚本进行传输。

    如果我错过了理解,请更新您的问题,我将再次尝试:)

        5
  •  0
  •   Matthew Watson    16 年前

    如果您没有返回大量行,我将经常使用 Tom Kytes print_table 功能。

    SQL> set serveroutput on 
    SQL> execute print_table('select * from all_objects where rownum < 3');
    OWNER                         : SYS
    OBJECT_NAME                   : /1005bd30_LnkdConstant
    SUBOBJECT_NAME                :
    OBJECT_ID                     : 27574
    DATA_OBJECT_ID                :
    OBJECT_TYPE                   : JAVA CLASS
    CREATED                       : 22-may-2008 11:41:13
    LAST_DDL_TIME                 : 22-may-2008 11:41:13
    TIMESTAMP                     : 2008-05-22:11:41:13
    STATUS                        : VALID
    TEMPORARY                     : N
    GENERATED                     : N
    SECONDARY                     : N
    -----------------
    OWNER                         : SYS
    OBJECT_NAME                   : /10076b23_OraCustomDatumClosur
    SUBOBJECT_NAME                :
    OBJECT_ID                     : 22390
    DATA_OBJECT_ID                :
    OBJECT_TYPE                   : JAVA CLASS
    CREATED                       : 22-may-2008 11:38:34
    LAST_DDL_TIME                 : 22-may-2008 11:38:34
    TIMESTAMP                     : 2008-05-22:11:38:34
    STATUS                        : VALID
    TEMPORARY                     : N
    GENERATED                     : N
    SECONDARY                     : N
    -----------------
    
    PL/SQL procedure successfully completed.
    
    SQL> 
    

    如果它有很多行,我将在SQL开发人员中进行查询,并另存为XLS,因为某些原因,业务类型喜欢Excel。

        6
  •  0
  •   Bubba    11 年前

    为什么不直接使用“cast”函数呢?

    select 
    (cast(assigner_staff_id as VARCHAR2(4)) AS STAFF_ID,
    (cast(active_flag as VARCHAR2(1))) AS A,
    (cast(assign_date as VARCHAR2(10))) AS ASSIGN_DATE,
    (cast(COMPLETE_date as VARCHAR2(10))) AS COMPLETE_DATE,
    (cast(mod_date as VARCHAR2(10))) AS MOD_DATE
    from work where assigner_staff_id = '2096';