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

Posted

技术标签:

【中文标题】如何格式化 Oracle SQL 纯文本选择输出【英文标题】:How to format Oracle SQL text-only select output 【发布时间】: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 等格式化命令(我没有)。

【问题讨论】:

【参考方案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';

【讨论】:

以上是关于如何格式化 Oracle SQL 纯文本选择输出的主要内容,如果未能解决你的问题,请参考以下文章

如何发送包含纯文本和 HTML 文本的邮件,以便每个邮件阅读器都可以选择适合它的格式?

怎样设置Excel纯文本格式

如何才能打开电子文档

如何用plsql从oracle中导入导出数据

如何用程序实现将word文件转换成txt纯文本文件

使用PHP格式化HTML代码以纯文本输出[重复]