【问题标题】:How to format Oracle SQL text-only select output如何格式化 Oracle SQL 纯文本选择输出
【发布时间】:2008-09-27 18:07:54
【问题描述】:

我正在使用 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 下午 2096 F 25-SEP-08 25-SEP-08 25-SEP-08 01.41.02.517321000 上午 已选择 2 行

当我尝试将结果作为格式良好的快速-n-脏文本块粘贴到电子邮件或问题报告等中时,这可以很容易地生成非常宽且笨重的文本报告。什么是最好的方法当我只使用普通的 Oracle SQL 时,要摆脱输出列中的所有额外空白?到目前为止,我的所有网络搜索都没有出现太多,因为所有网络搜索结果都在向我展示如何使用 SQLPLUS 中的 COLUMN 等格式化命令(我没有)。

【问题讨论】:

    标签: sql oracle formatting


    【解决方案1】:

    在您的声明中,您可以指定要查找的输出类型:

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

    还有其他可用的格式,例如 xml、html、text、loader 等。

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

    一定要选择 Run Script 而不是 Run Statement。

    * 适用于 Oracle SQL Developer v3.2

    【讨论】:

      【解决方案2】:

      您使用什么来获得结果?您粘贴的输出看起来像是来自 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';
      

      【讨论】:

      • 如前所述,我使用的是 Oracle SQLDeveloper(免费工具——我很便宜!)。它可能在幕后使用 SQLPLUS,但它不允许我使用 COLUMN 命令或大多数其他 SQLPLUS 命令。使用 substr(col, width) 是我所追求的——这有帮助!太好了!
      【解决方案3】:

      你可以用 sql 做什么受你的工具的限制。 SQL Plus 具有格式化列的命令,但它们并不易于使用。

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

      【讨论】:

      • 好的,这是一个不错的选择。我刚刚检查了一下,SQL Developer 确实可以选择将结果导出为 CVS 或 XLS 文件。
      【解决方案4】:

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

      您可以做的一件事是更改您的 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 脚本进行管道传输。

      如果我有误会,请更新您的问题,我会再试一次:)

      【讨论】:

      • 我尝试将您的一部分答案粘贴到 SQLDeveloper 中,但 Oracle 似乎无法转换。我认为甲骨文的转换工作方式不同。不过,使用子字符串 (substr) 很有帮助。
      【解决方案5】:

      如果你没有返回很多行,我会经常使用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 Developer 中进行查询并保存为 xls,商务类型出于某种原因喜欢 excel。

      【讨论】:

        【解决方案6】:

        为什么不直接使用“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';
        

        【讨论】:

          猜你喜欢
          • 2021-12-22
          • 2017-07-04
          • 2015-12-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-02-03
          相关资源
          最近更新 更多